すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:クラスター内のサービスを公開するためのイングレスコントローラーとして ASM ゲートウェイを使用する

最終更新日:Jan 14, 2025

サービスメッシュ(ASM)を使用すると、マネージドクラスターでイングレスリソースを使用し、イングレスコントローラーとして ASM ゲートウェイを指定できます。このトピックでは、Container Service for Kubernetes(ACK)クラスターでイングレスリソースを構成し、イングレスコントローラーとして ASM ゲートウェイを使用してクラスター内のサービスを公開する方法について説明します。

前提条件

制限事項

  • 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 ゲートウェイでイングレスを有効にする

  1. [ASM コンソール] にログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[ASM ゲートウェイ] > [イングレスゲートウェイ] を選択します。

  3. [高度な機能] セクションで、[イングレス API アクセスを有効にする] をクリックします。表示される [送信] メッセージで、[OK] をクリックします。

手順 2:イングレスを作成し、イングレスコントローラーとして ASM ゲートウェイを指定する

イングレスは、ゲートウェイのリスニングポートの構成をサポートしていません。デフォルトでは、ポート 80 は HTTP に使用され、ポート 443 は HTTPS に使用されます。したがって、ASM ゲートウェイでリスニングするためにポート 80 と 443 を有効にする必要があります。

アノテーションを使用してイングレスコントローラーを指定する

  1. 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: 8000
  2. kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して ASM ゲートウェイをイングレスコントローラーとして指定します。

    kubectl apply -f ingress.yaml

IngressClass リソースを使用してイングレスコントローラーを指定する

  1. 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: 8000
  2. kubectl を使用して 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 を実行してシークレットを作成し、証明書の自動ロードを完了します。

  1. サーバー証明書と秘密鍵を準備します。

    ドメイン名は、インターネットコンテンツプロバイダー(ICP)ファイリングを取得した後にのみアクセスできます。この例では、aliyun.com ドメイン名の証明書と秘密鍵が生成され、シークレットとして保存されます。

    • シナリオ 1:aliyun.com で使用可能な証明書と秘密鍵がない

      次の openssl コマンドを実行して、証明書と秘密鍵を作成します。

      1. 次のコマンドを実行して、ルート証明書と秘密鍵を作成します。

        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 // ルート証明書と秘密鍵を生成
      2. 次のコマンドを実行して、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 // サーバー証明書を生成
      3. KubeConfig ファイルの情報に基づいて、イングレスゲートウェイポッドが属するクラスターに kubectl を使用して接続し、次のコマンドを実行して、istio-system ネームスペースにサーバー証明書と秘密鍵を含むシークレットを作成します。

        kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt // シークレットを作成
    • シナリオ 2:aliyun.com で使用可能な証明書と秘密鍵がある

      1. 証明書に aliyun.com.crt、秘密鍵に aliyun.com.key という名前を付けます。

      2. KubeConfig ファイルの情報に基づいて、イングレスゲートウェイポッドが属するクラスターに kubectl を使用して接続し、次のコマンドを実行して、istio-system ネームスペースにサーバー証明書と秘密鍵を含むシークレットを作成します。

        kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt // シークレットを作成
  2. イングレスを作成し、TLS によって参照されるシークレットを 手順1 で作成した myexample-credential シークレットに設定します。

    1. 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 で作成したシークレット名
      説明

      ACK コンソールでイングレスを作成する場合、証明書のシークレットは、イングレスが存在するネームスペースからのみ選択できます。たとえば、default ネームスペースにイングレスを作成する場合、対応するシークレットは default ネームスペースからのみ選択できます。したがって、手順1 で作成した myexample-credential シークレットを default ネームスペースにコピーして、ACK コンソールでシークレットを選択できるようにする必要があります。

    2. kubectl を使用して ACK クラスターに接続し、次のコマンドを実行してイングレスをデプロイします。

      kubectl apply -f ingress-https.yaml
  3. 次のコマンドを実行して、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 ゲートウェイに正常に公開されたことを示しています。