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

Alibaba Cloud Service Mesh:イングレスゲートウェイで TLS パススルーを有効にする

最終更新日:Jan 13, 2025

イングレスゲートウェイとサイドカープロキシ間のすべてのデータは、相互トランスポート層セキュリティ(mTLS)トンネルを介して送信されます。 サイドカープロキシがアプリケーションに挿入されている場合は、エンドツーエンドの暗号化を確保するために、イングレスゲートウェイで TLS ターミネーションを設定することをお勧めします。 サイドカープロキシがアプリケーションに挿入されていない場合、またはその他の特別な状況が発生した場合、イングレスゲートウェイは TLS パススルーをサポートします。 このトピックでは、イングレスゲートウェイで TLS パススルーを有効にして、クラスター内の HTTPS サービスへの安全なアクセスを確保する方法について説明します。

前提条件

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

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

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

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

    openssl req -out sample.aliyun.com.csr -newkey rsa:2048 -nodes -keyout sample.aliyun.com.key -subj "/CN=sample.aliyun.com/O=mynginx sample organization"
    openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 -in sample.aliyun.com.csr -out sample.aliyun.com.crt

手順 2:内部サービスを定義する

この例の内部サービスは、NGINX に基づいて実装されています。 まず、NGINX サーバーの設定ファイルを作成する必要があります。 この例では、aliyun.com ドメイン名の内部サービスを使用します。 要求されたルートパスを定義して、Welcome to aliyun.com without TLS Termination! という文とステータスコード 200 を直接返します。 次のサンプルコードは、mynginx.conf ファイルの例を示しています。

events {
}
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;
  server {
    listen 443 ssl;
    location / {
        return 200 'Welcome to aliyun.com without TLS Termination!';  // TLS ターミネーションなしで aliyun.com へようこそ!
        add_header Content-Type text/plain;
    }
    server_name www.aliyun.com;
    ssl_certificate /etc/nginx-server-certs/tls.crt;
    ssl_certificate_key /etc/nginx-server-certs/tls.key;
  }
}
  1. kubeconfig ファイルの情報に基づいて、イングレスゲートウェイポッドが属するクラスターに kubectl を使用して接続します。 次に、次のコマンドを実行して、NGINX サーバーの設定を格納する ConfigMap を作成します。

    kubectl create configmap mynginx-configmap --from-file=nginx.conf=./mynginx.conf​
  2. kubeconfig ファイルの情報に基づいて、イングレスゲートウェイポッドが属するクラスターに kubectl を使用して接続します。 次に、次のコマンドを実行して、デフォルトの名前空間にサーバー証明書と秘密鍵を含むシークレットを作成します。

    kubectl create secret tls nginx-server-certs --key sample.aliyun.com.key --cert sample.aliyun.com.crt​
  3. デフォルトの名前空間に対してサイドカープロキシの自動挿入を有効にします。 手順の詳細については、「サイドカープロキシの自動挿入を有効にする」をご参照ください。

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

    展開して mynginxapp.yaml ファイルを表示する

    apiVersion: v1
    kind: Service
    metadata:
      name: mynginxapp
      labels:
        app: mynginxapp
    spec:
      ports:
      - port: 443
        protocol: TCP
      selector:
        app: mynginxapp
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mynginxapp
    spec:
      selector:
        matchLabels:
          app: mynginxapp
      replicas: 1
      template:
        metadata:
          labels:
            app: mynginxapp
        spec:
          containers:
          - name: nginx
            image: nginx:1.15
            ports:
            - containerPort: 443
            volumeMounts:
            - name: nginx-config
              mountPath: /etc/nginx
              readOnly: true
            - name: nginx-server-certs
              mountPath: /etc/nginx-server-certs
              readOnly: true  
          volumes:
          - name: nginx-config
            configMap:
              name: mynginx-configmap
          - name: nginx-server-certs
            secret:
              secretName: nginx-server-certs    
  5. サイドカープロキシから NGINX サーバーにリクエストを送信して、NGINX サーバーがデプロイされているかどうかを確認するには、次のコマンドを実行します。

    kubectl exec -it $(kubectl get pod  -l app=mynginxapp -o jsonpath={.items..metadata.name}) -c istio-proxy -- curl -v -k --resolve sample.aliyun.com:443:127.0.0.1 https://sample.aliyun.com

手順 3:Istio ゲートウェイを作成する

  1. ASM コンソール にログインします。

  2. 左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  3. [メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列の [アクション] をクリックするか、ASM インスタンスの名前をクリックします。

  4. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [ASM ゲートウェイ] > [ゲートウェイ] を選択します。 表示されたページで、[YAML から作成] をクリックします。

  5. [作成] ページで、次の手順を実行して Istio ゲートウェイを定義します。 次に、[作成] をクリックします。

    1. 必要に応じて名前空間を選択します。 この例では、[default] 名前空間が選択されています。

    2. コードエディターで、次の YAML コードを使用して Istio ゲートウェイを定義します。

      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: istio-mynginx-customingressgateway
      spec:
        selector:
          istio: ingressgateway
        servers:
        - hosts:
          - 'sample.aliyun.com'
          port:
            name: https
            number: 443
            protocol: HTTPS
          tls:
            mode: PASSTHROUGH
            // PASSTHROUGH モードを指定
      

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

手順 4:仮想サービスを作成する

  1. ASM コンソール にログインします。

  2. 左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  3. [メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列の [アクション] をクリックするか、ASM インスタンスの名前をクリックします。

  4. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [トラフィック管理センター] > [virtualservice] を選択します。 表示されたページで、[YAML から作成] をクリックします。

  5. [作成] ページで、次の手順を実行して仮想サービスを定義します。 次に、[作成] をクリックします。

    1. 必要に応じて名前空間を選択します。 この例では、[default] 名前空間が選択されています。

    2. コードエディターで、次の YAML コードを使用して仮想サービスを定義します。

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: istio-mynginx-customvirtualservice
      spec:
        hosts:
        - "sample.aliyun.com"
        gateways:
        - istio-mynginx-customingressgateway
        tls:
        - match:
          - port: 443
            sniHosts:
            - sample.aliyun.com
          route:
          - destination:
              host: mynginxapp.default.svc.cluster.local
              port:
                number: 443

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

結果の表示

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

    1. 方法 1:ASM コンソールを使用する。 詳細については、「Istio リソースを使用してトラフィックをサービスの異なるバージョンにルーティングする」トピックの手順 3 のサブステップ 1 をご参照ください。

    2. 方法 2:kubectl コマンドを実行する。

      kubeconfig ファイルの情報に基づいて、イングレスゲートウェイポッドが属するクラスターに kubectl を使用して接続します。 次に、次のコマンドを実行して、イングレスゲートウェイの IP アドレスを取得します。

      kubectl get svc -n istio-system -l istio=ingressgateway
  2. HTTPS 経由で aliyun.com ドメイン名にアクセスするには、次のコマンドを実行します。

    curl -v --cacert aliyun.root.crt --resolve sample.aliyun.com:443:xx.xx.xx.xx   https://sample.aliyun.com

    予期される出力:

    Welcome to aliyun.com without TLS Termination!%