サービスメッシュ(ASM)を使用すると、マネージドクラスターでイングレスリソースを使用し、イングレスコントローラーとして ASM ゲートウェイを指定できます。このトピックでは、Container Service for Kubernetes(ACK)クラスターでイングレスリソースを構成し、イングレスコントローラーとして ASM ゲートウェイを使用してクラスター内のサービスを公開する方法について説明します。
前提条件
ACK クラスターが v1.16 以降の ASM インスタンスに追加されていること。詳細については、ASM インスタンスへのクラスターの追加をご参照ください。
イングレスゲートウェイがデプロイされ、ポート 80 と 443 が公開されていること。詳細については、イングレスゲートウェイサービスの作成をご参照ください。
httpbin アプリケーションがデプロイされていること。(ただし、ゲートウェイで公開する必要はありません。)詳細については、HTTPBin アプリケーションのデプロイをご参照ください。
制限事項
ASM ゲートウェイをイングレスコントローラーとして使用する場合、イングレスの defaultBackend フィールドを構成することはできません。詳細については、イングレスをご参照ください。
V1 の Ingress API のみがサポートされています。ASM ゲートウェイをイングレスコントローラーとして使用する前に、データプレーン上の Ingress API のバージョンが V1 であることを確認してください。
機能
イングレスは、Kubernetes の標準 API オブジェクトです。Kubernetes サービスへの外部アクセスを管理するために使用されます。イングレスでルーティングルールを構成して、クラスター内の HTTP または HTTPS サービスをクラスターの外部に公開できます。
ASM を使用すると、マネージドクラスターでイングレスリソースを使用し、イングレスコントローラーとして ASM ゲートウェイを指定できます。ASM ゲートウェイは、自動スケーリング、Transport Layer Security(TLS)アクセラレーション、ゲートウェイ上のサーバーロードバランサー(SLB)インスタンスのグレースフルシャットダウンなどの高度な機能をサポートしています。ASM ゲートウェイがイングレスコントローラーとして機能する場合、Service Meshによって提供される複数の可観測性とセキュリティ機能を使用できます。ASM ゲートウェイは、証明書の動的読み込みもサポートしています。TLS に必要な秘密鍵、サーバー証明書、およびルート証明書は、ゲートウェイが再起動されていないときに動的に構成できます。
手順 1:ASM ゲートウェイでイングレスを有効にする
[ASM コンソール] にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[高度な機能] セクションで、[イングレス API アクセスを有効にする] をクリックします。表示される [送信] メッセージで、[OK] をクリックします。
手順 2:イングレスを作成し、イングレスコントローラーとして ASM ゲートウェイを指定する
イングレスは、ゲートウェイのリスニングポートの構成をサポートしていません。デフォルトでは、ポート 80 は HTTP に使用され、ポート 443 は HTTPS に使用されます。したがって、ASM ゲートウェイでリスニングするためにポート 80 と 443 を有効にする必要があります。
アノテーションを使用してイングレスコントローラーを指定する
ingress.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: istio // ASM gateway を Ingress controller として指定 name: ingress spec: rules: - host: httpbin.aliyun.com http: paths: - path: /status pathType: Prefix backend: service: name: httpbin port: number: 8000kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して ASM ゲートウェイをイングレスコントローラーとして指定します。
kubectl apply -f ingress.yaml
IngressClass リソースを使用してイングレスコントローラーを指定する
ingress.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress spec: ingressClassName: istio // ASM gateway を Ingress controller として指定 rules: - host: httpbin.aliyun.com http: paths: - path: / pathType: Prefix backend: service: name: httpbin port: number: 8000kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して ASM ゲートウェイをイングレスコントローラーとして指定します。
kubectl apply -f ingress.yaml
手順 3:HTTP を使用して httpbin サービスにアクセスする
次のコマンドを実行して httpbin サービスにアクセスします。
curl -H 'host: httpbin.aliyun.com' http://${IP address of the ASM gateway}/status/418予期される出力:
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/この出力は、イングレスを使用して httpbin アプリケーションが ASM ゲートウェイに正常に公開されたことを示しています。
手順 4:TLS を構成し、HTTPS を使用して httpbin サービスにアクセスする
ASM では、イングレスの TLS を構成できます。ASM ゲートウェイは istio-system ネームスペースで実行されます。したがって、イングレスで参照されるシークレットも istio-system ネームスペースに存在する必要があります。
イングレスコントローラーとして、ASM ゲートウェイは証明書を動的にロードできます。TLS に必要な秘密鍵、サーバー証明書、およびルート証明書は、ゲートウェイが再起動されていないときに動的に構成できます。ASM ゲートウェイでは、複数のシークレットをマウントして異なる証明書を読み込むこともできます。構成プロセス全体で ゲートウェイポッドを再起動する必要はありません。
次の例では、証明書のロード方法について説明します。複数の証明書が必要な場合は、手順2 と 手順3 を実行してシークレットを作成し、証明書の自動ロードを完了します。
サーバー証明書と秘密鍵を準備します。
ドメイン名は、インターネットコンテンツプロバイダー(ICP)ファイリングを取得した後にのみアクセスできます。この例では、aliyun.com ドメイン名の証明書と秘密鍵が生成され、シークレットとして保存されます。
シナリオ 1:aliyun.com で使用可能な証明書と秘密鍵がない
次の openssl コマンドを実行して、証明書と秘密鍵を作成します。
次のコマンドを実行して、ルート証明書と秘密鍵を作成します。
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=myexample Inc./CN=aliyun.com' -keyout aliyun.root.key -out aliyun.root.crt // ルート証明書と秘密鍵を生成次のコマンドを実行して、aliyun.com サーバーの証明書と秘密鍵を生成します。
openssl req -out aliyun.com.csr -newkey rsa:2048 -nodes -keyout aliyun.com.key -subj "/CN=aliyun.com/O=myexample organization" // サーバー証明書の要求を生成 openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 -in aliyun.com.csr -out aliyun.com.crt // サーバー証明書を生成KubeConfig ファイルの情報に基づいて、イングレスゲートウェイポッドが属するクラスターに kubectl を使用して接続し、次のコマンドを実行して、istio-system ネームスペースにサーバー証明書と秘密鍵を含むシークレットを作成します。
kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt // シークレットを作成
シナリオ 2:aliyun.com で使用可能な証明書と秘密鍵がある
証明書に aliyun.com.crt、秘密鍵に aliyun.com.key という名前を付けます。
KubeConfig ファイルの情報に基づいて、イングレスゲートウェイポッドが属するクラスターに kubectl を使用して接続し、次のコマンドを実行して、istio-system ネームスペースにサーバー証明書と秘密鍵を含むシークレットを作成します。
kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt // シークレットを作成
イングレスを作成し、TLS によって参照されるシークレットを 手順1 で作成した myexample-credential シークレットに設定します。
ingress-https.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress annotations: kubernetes.io/ingress.class: istio spec: rules: - host: httpbin.aliyun.com http: paths: - backend: service: name: httpbin port: number: 8000 path: /status pathType: Prefix tls: // TLS 構成 - hosts: - httpbin.aliyun.com secretName: myexample-credential // 手順 1 で作成したシークレット名kubectl を使用して ACK クラスターに接続し、次のコマンドを実行してイングレスをデプロイします。
kubectl apply -f ingress-https.yaml
次のコマンドを実行して、HTTPS 経由で httpbin サービスにアクセスします。
curl -H Host:httpbin.aliyun.com --resolve httpbin.aliyun.com:443:${IP address of the ASM gateway} https://httpbin.aliyun.com:443/status/418 -k予期される出力:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/この出力は、イングレスを使用して httpbin アプリケーションが ASM ゲートウェイに正常に公開されたことを示しています。