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

Alibaba Cloud Service Mesh:ingressゲートウェイを使用したHTTPSの有効化

最終更新日:Jan 17, 2025

セキュアなHTTPSプロトコルを介して暗号化されたアクセスを提供する必要がある場合は、Service Mesh (ASM) ingressゲートウェイを使用してHTTPSを有効にできます。 ASMでは、ingressゲートウェイを使用して動的な証明書の読み込みを有効にできます。 これにより、プライベートキー、サーバー証明書、およびルート証明書をリアルタイムで動的に構成でき、ingressゲートウェイを再起動したり、シークレットボリュームをマウントしたりする必要がなくなります。 これにより、操作が簡単になり、入口ゲートウェイの再起動によるサービス中断のリスクがなくなります。 ingressゲートウェイを使用すると、複数の証明書とその秘密鍵を監視および管理できます。 これにより、異なるホストに柔軟で安全な通信機能が提供され、データ送信のセキュリティが強化されます。

前提条件

背景情報

Istioは動的証明書の読み込みをサポートします。 ingressゲートウェイを再起動することなく、Transport Layer Security (TLS) に必要な秘密鍵、サーバー証明書、およびルート証明書を設定できます。 ingress gatewayは、ingress gatewayと同じ名前空間にあるシークレットをリッスンし、Gatewayリソースを使用してシークレットを動的に読み込みます。 ingressゲートウェイのHTTPSを有効にすると、次の利点が得られます。

  • 入口ゲートウェイは、再起動する必要なく、必要に応じて、サーバ証明書および秘密鍵またはルート証明書を動的に追加、削除、および更新することができる。

  • シークレットボリュームをマウントする必要はありません。 Kubernetesシークレットが作成されると、ingress gatewayは、シークレットに格納されているサーバー証明書と秘密鍵またはルート証明書を取得できます。

  • 複数のホストのシークレットを作成してIstioゲートウェイ (ゲートウェイリソース) を更新すると、ingressゲートウェイは複数のサーバー証明書と秘密鍵のペアをリッスンできます。

手順1: 複数のサーバーのサーバー証明書と秘密鍵を準備する

ドメイン名は、インターネットコンテンツプロバイダ (ICP) の登録を取得した後にのみアクセス可能です。 aliyun.comドメイン名のサーバー証明書と秘密鍵を作成し、サーバー証明書と秘密鍵をシークレットに保存します。

aliyun.comドメイン名で使用できるサーバー証明書と秘密鍵がある場合は、秘密鍵の名前をaliyun.com.keyに、サーバー証明書の名前をaliyun.com.crtに変更します。 または、次のopensslコマンドを実行して、サーバー証明書と秘密鍵を作成しr aliyun.com。

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

    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=myexample Inc./C N=aliyun.com' -keyout aliyun.root.key -out aliyun.root.crt
  2. 次のコマンドを実行して、aliyun.comのサーバーの証明書と秘密鍵を作成します。

    openssl req -ou t aliyun.com.csr -newkey rsa:2048-ノード-keyou t aliyun.com.key -subj "/C N=aliyun.com/O=myexample組織"
    openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 -i n aliyun.com.csr -ou t aliyun.com.crt 
  3. ASMインスタンスのバージョンに基づいて、シークレットまたは証明書を作成します。

    • 1.17より前のバージョンのASMインスタンスの場合

      kubectlを使用して、ingress gatewayポッドが属するクラスターに接続し、次のコマンドを実行して、istio-system名前空間の証明書と秘密鍵を含むシークレットを作成します。

      kubectl create -n istio-system secret tls myexample-credential -- ke y=aliyun.com.key -- cer t=aliyun.com.crt
      重要

      シークレット名はistioまたはprometheusで始めることはできず、トークンフィールドを含めることはできません。

    • バージョン1.17以降のASMインスタンスの場合

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

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

      3. [証明書管理] ページで、[作成] をクリックします。 [証明書情報] パネルで、必要なパラメーターを設定し、[OK] をクリックします。

        パラメーター

        説明

        名前

        証明書の名前を入力します。 この例では、myexample-credentialを入力します。

        公開キー証明書

        サブステップ2で生成されたaliyun.com.crt証明書の内容を入力します。

        プライベートキー

        サブステップ2で生成されたaliyun.com.key秘密鍵の内容を入力します。

ステップ2: r a.aliyun.comの内部サービスを定義する

この例の内部サービスはNGINXに基づいて実装されています。 最初にNGINXサーバーの構成ファイルを作成する必要があります。 この例では、a.aliyun.comドメイン名に対して内部サービスが作成されます。 要求されたルートパスを定義して、文を直接返すWelcome t o a.aliyun.com! とステータスコード200myexample-nginx.conf NGINX設定ファイルには、次の内容が含まれています。

イベント {
}
http {
  log_format main '$remote_addr - $remote_user [$time_local]  $status '
  '"$request" $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
  access_log /var/log/nginx/access.log main;
  error_log  /var/log/nginx/error.log;
  サーバー{
    listen 80;
    location /hello {
        200を返す 'ようこそt o a.aliyun.com!';
        add_header Content-Type text/plain;
    }
  }
}
  1. ingress gatewayポッドが属するクラスターで、次のコマンドを実行して、NGINXサーバーの構成を格納するConfigMapを作成します。

    kubectl create configmap myexample-nginx-configmap -- from-file=nginx.conf=./myexample-nginx.conf
  2. デフォルトの名前空間の自動サイドカープロキシ注入を有効にします。 詳細については、「自動サイドカープロキシ注入の有効化」をご参照ください。

  3. 次の内容を含むmyexampleapp.yamlファイルを作成します。 次に、kubectl apply -f myexampleapp.yamlコマンドを実行して、a.aliyun.comドメイン名の内部サービスを作成します。

    YAMLファイルを表示する

    apiVersion: v1
    種類: サービス
    メタデータ:
      name: myexampleapp
      ラベル:
        アプリ: myexampleapp
    spec:
      ポート:
      - port: 80
        protocol: TCP
      セレクタ:
        アプリ: myexampleapp
    ---
    apiVersion: apps/v1
    kind: 配置
    メタデータ:
      名前: myexampleapp
    spec:
      セレクタ:
        matchLabels:
          app: myexampleapp
      replicas: 1
      template:
        metadata:
          labels:
            app: myexampleapp
        仕様:
          containers:
          - name: nginx
            image: nginx
            ポート:
            - containerPort: 80
            volumeMounts:
            - name: nginx-log
              mountPath: /etc/config
              readOnly: true
          volumes:
          - name: nginx-log
            configMap:
              名前: myexample-nginx-configmap 

ステップ3: r b.aliyun.comの内部サービスを定義する

この例の内部サービスは、HTTPBinに基づいて実装されています。

  1. 次のコンテンツを含むhttpbin.example.yamlファイルを作成します。

    YAMLファイルを表示する

    apiVersion: v1
    種類: サービス
    メタデータ:
      名前: httpbin
      ラベル:
        アプリ: httpbin
    spec:
      ポート:
      - name: http
        ポート: 8000
      セレクタ:
        アプリ: httpbin
    ---
    apiVersion: apps/v1
    kind: 配置
    メタデータ:
      名前: httpbin
    spec:
      replicas: 1
      セレクタ:
        matchLabels:
          アプリ: httpbin
          バージョン: v1
      template:
        metadata:
          labels:
            アプリ: httpbin
            バージョン: v1
        仕様:
          containers:
          -イメージ: docker.io/citizenstig/httpbin
            imagePullPolicy: IfNotPresent
            名前: httpbin
            ポート:
            -containerPort: 80 
  2. ingress gatewayポッドが属するクラスターで、次のコマンドを実行して、b.aliyun.comドメイン名の内部サービスを作成します。

    kubectl apply -f httpbin.example.yaml

ステップ4: Istioゲートウェイの作成

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

  2. [メッシュ管理] ページで、ASMインスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、[ASMゲートウェイ] > [ゲートウェイ] を選択します。 表示されるページで、[YAMLから作成] をクリックします。

  3. [作成] ページで、名前空間 (この例では既定の名前空間) とシナリオテンプレートを選択し、次のYAMLコードを設定し、[作成] をクリックします。

    YAMLファイルを表示する

    apiVersion: networking.istio.io/v1alpha3
    kind: ゲートウェイ
    メタデータ:
      名前: mysdsgateway
    spec:
      セレクタ:
        istio: ingressgateway # use istioデフォルトのingressゲートウェイ
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: myexample-credential# はシークレットと同じでなければなりません
        hosts:
        - '*.aliyun.com'
                                    

    [ゲートウェイ] ページで、作成したIstioゲートウェイを表示できます。

ステップ5: 仮想サービスの作成

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

  2. [メッシュ管理] ページで、ASMインスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、[トラフィック管理センター] > [VirtualService] を選択します。 表示されるページで、[YAMLから作成] をクリックします。

  3. [作成] ページで、名前空間とシナリオテンプレートを選択し、次のYAMLコードを設定し、[作成] をクリックして仮想サービスr a.liyun.comを作成します。します。

    YAMLファイルを表示する

    apiVersion: networking.istio.io/v1alpha3
    種類: VirtualService
    メタデータ:
      名前: mysdsgateway-myexamplevs
    spec:
      hosts:
      - "a.aliyun.com"
      gateways:
      -mysdsgateway
      http:
      - match:
        -uri:
            正確な: /hello
        route:
        - destination:
            host: myexampleapp.default.svc.cluster.local
            port:
              番号: 80 

    同様の方法でb.aliyun.com用の仮想サービスを作成します。

    YAMLファイルを表示する

    apiVersion: networking.istio.io/v1alpha3
    種類: VirtualService
    メタデータ:
      名前: mysdsgateway-httpbinvs
    spec:
      hosts:
      - "b.aliyun.com"
      gateways:
      -mysdsgateway
      http:
      - match:
        -uri:
            プレフィックス: /status
        -uri:
            プレフィックス: /delay
        route:
        - destination:
            port:
              数: 8000
            ホスト: httpbin.de fault.svc.cluster.local 

    VirtualServiceページで、作成された仮想サービスを表示できます。

結果を表示するView the result

次のいずれかの方法を使用して、ingressゲートウェイのIPアドレスを取得します。

  • 方法1: ASM コンソールでingress gatewayのIPアドレスを表示します。 ASMコンソールにログインし、目的のService Meshインスタンスを見つけます。 左側のナビゲーションウィンドウで、[ASM Gateway] > [Ingress Gateway] を選択します。 Ingress Gatewayページで、ingress gatewayのIPアドレスを表示できます。

  • 方法2: ACK コンソールでingressゲートウェイのIPアドレスを表示します。 詳細については、「ingressゲートウェイの作成」トピックの「ACKコンソールでのingressゲートウェイの表示」セクションをご参照ください。

ingressゲートウェイへのアクセス

  • 次のコマンドを実行して、HTTPS経由でa.aliyun.comドメイン名にアクセスします。

    curl -k -H Hos t:a.aliyun.com -- resolv e a.aliyun.com:443:{ingress gatewayのIPアドレス} https://a.aliyun.com/hello

    期待される出力:

    ようこそt o aliyun.com!
  • 次のコマンドを実行して、HTTPS経由でb.aliyun.comドメイン名にアクセスします。

    curl -k -H Hos t:b.aliyun.com -- resolv e b.aliyun.com:443:{ingress gatewayのIPアドレス} https://b.aliyun.com/status/418

    期待される出力:

    -=[ティーポット]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`

関連する API 操作

ゲートウェイ証明書の更新

ingressゲートウェイにマウントされた証明書を更新するには、データプレーンにシークレットを作成し、IstioゲートウェイのYAMLコードのcredentialNameフィールドの値をシークレットの名前に変更する必要があります。 次に、新しいシークレットがゲートウェイに自動的にマウントされます。 次の例では、example.comのサーバーに対してnew-istio-ingressgateway-certsという名前のシークレットが作成されます。

  1. 発行者がmyexampleである証明書を作成します。

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

      openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=myexample Inc./C N=example.com' -keyout example.root.key -out example.root.crt
    2. 次のコマンドを実行して、example.comのサーバーの証明書と秘密鍵を作成します。

      openssl req -ou t example.com.csr -newkey rsa:2048-ノード-keyou t example.com.key -subj "/C N=example.com/O=myexample組織"
      openssl x509 -req -days 365 -CA example.root.crt -CAkey example.root.key -set_serial 0 -i n example.com.csr -ou t example.com.crt 
    3. クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続します。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。

    4. 次のコマンドを実行して、new-istio-ingressgateway-certsという名前のシークレットを作成します。

      kubectl create -n istio-system secret tls new-istio-ingressgateway-certs -- ke y example.com.key -- cer t example.com.crt
  2. クラスターで次のコマンドを実行して、以前のシークレットを削除します。

    kubectl delete secret istio-ingressgateway-certs -n istio-system
  3. Istioゲートウェイを更新します。

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

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

    3. On theゲートウェイページで、更新するゲートウェイを見つけて、YAMLで、アクション列を作成します。

    4. では、編集ダイアログボックスで、の値を変更します。credentialNamenew-istio-ingressgateway-certsに移動し、OK.

  4. ゲートウェイ証明書が更新されていることを確認します。

    1. クラスターで次のコマンドを実行して、現在の証明書情報を表示します。

      kubectl exec istio-ingressgateway-xxxx -n istio-system -- curl localhost:15000/config_dump > ingressgateway_dump.yaml
    2. 次のコマンドを実行して、new-istio-ingressgateway-certs証明書を検索して表示します。

      cat ingressgateway_dump.yaml | grep new-istio-ingressgateway-certs -A 3

      期待される出力:

      证书

      inline_bytesパラメーターの内容をコピーして、Base64-encoded証明書を取得します。

    3. ローカルのコマンドラインツールで次のコマンドを実行して、Base64-encoded証明書をデコードします。

      echo <Base64-encoded証明書> | base64 -- decode
    4. デコードされたコンテンツをtest.com.crtファイルとして保存します。

    5. 次のopensslコマンドを実行して、証明書の組織を表示します。

      openssl x509 -i n test.com.crt -text -noout

      期待される出力:

      组织

      組織がmyexampleに変更されました。 これは、ゲートウェイ証明書が更新されたことを示します。