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

Alibaba Cloud Service Mesh:ASM でのすべての送信トラフィックをルーティングするための出口ゲートウェイの設定

最終更新日:Jan 13, 2025

ASM インスタンス内のアプリケーションが外部サービスと通信する必要がある場合は、出口ゲートウェイを使用してすべての送信トラフィックを一元管理できます。出口ゲートウェイを設定すると、トラフィックのセキュリティ制御とルーティングを実装して、ASM インスタンス内のアプリケーションのセキュリティと可観測性を向上させることができます。

重要

このトピックを読む前に、ASMEgressTrafficPolicy を使用して送信トラフィックを管理するの内容を理解していることを確認してください。このトピックでは、ASM リソースを使用して、外部サービスにアクセスするリクエストを透過的に出口ゲートウェイにリダイレクトします。出口ゲートウェイでは、外部サービスに送信する前にセキュリティポリシーが適用されます。設定は比較的複雑です。ASMEgressTrafficPolicy を使用して送信トラフィックを管理するの内容が要件を満たしていない場合は、このトピックを参照してください。

前提条件

設定プロセス

配置流程

手順 1:サンプルアプリケーションをデプロイする

  1. sleep アプリケーションをデプロイします。

    1. 以下の内容を使用して sleep.yaml を作成します。

      sleep.yaml を展開して表示する

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: sleep
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: sleep
        labels:
          app: sleep
          service: sleep
      spec:
        ports:
        - port: 80
          name: http
        selector:
          app: sleep
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sleep
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sleep
        template:
          metadata:
            labels:
              app: sleep
          spec:
            terminationGracePeriodSeconds: 0
            serviceAccountName: sleep
            containers:
            - name: sleep
              image: curlimages/curl
              command: ["/bin/sleep", "infinity"]
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - mountPath: /etc/sleep/tls
                name: secret-volume
            volumes:
            - name: secret-volume
              secret:
                secretName: sleep-secret
                optional: true
      ---
    2. ACK クラスターの KubeConfig 環境で、次のコマンドを実行して sleep アプリケーションをデプロイします。

      kubectl を使用してクラスターを管理する方法の詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。

      kubectl apply -f sleep.yaml
  2. sleep アプリケーションが存在するポッドから次のコマンドを実行して、外部サービスにアクセスします。

    kubectl get pod -n default コマンドを実行して、sleep アプリケーションポッドの名前を表示できます。

    kubectl exec -it ${sleep pod name} -- /bin/sh
    curl aliyun.com -I

    以下は出力例です。

    HTTP/1.1 301 Moved Permanently
    server: envoy
    date: Thu, 14 Dec 2023 03:05:41 GMT
    content-type: text/html
    content-length: 239
    location: https://aliyun.com/
    eagleeye-traceid: 0b57ff8717025231418255220e****
    timing-allow-origin: *
    x-envoy-upstream-service-time: 69

    301 が返された場合は、ASM インスタンス内のアプリケーションが外部サービスにアクセスできることを示します。この場合、HTTP アクセスリクエストはデフォルトで開始されます。Web サーバーは 301 応答を返して、リクエストをリダイレクトします。

    説明

    デフォルトでは、ASM は ALLOW_ANY ポリシーを使用して、ASM インスタンス内のアプリケーションがすべての外部サービスにアクセスできるようにします。この場合、権限制御を実装したり、ASM が提供する可観測性機能を使用したりすることはできません。ポリシーを REGISTRY_ONLY に変更して、ASM インスタンス内のアプリケーションが特定の外部サービスのみにアクセスできるようにし、出口ゲートウェイを使用してすべての送信トラフィックをルーティングすることをお勧めします。

(オプション)手順 2:外部サービスへのアクセス ポリシーを REGISTRY_ONLY に設定する

デフォルトでは、ASM は外部サービスへのアクセスに ALLOW_ANY ポリシーを使用します。ポリシーを REGISTRY_ONLY に変更することをお勧めします。ポリシーを REGISTRY_ONLY に変更すると、サイドカープロキシは、ASM インスタンスでサービスエントリが定義されていない外部ホストへのアクセスを拒否します。これにより、ASM インスタンス内のアプリケーションのセキュリティが保証されます。

説明
  • REGISTRY_ONLY を有効にしていても、サービスエントリを作成していない場合は、外部サービスへのアクセスは拒否されます。

  • REGISTRY_ONLY を有効にしておらず、サービスエントリを作成していない場合は、サービスにアクセスできますが、設定された出口ゲートウェイは有効になりません。

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

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[データプレーンコンポーネント管理] > [サイドカープロキシ設定] を選択します。

  3. [サイドカープロキシ設定] ページで、[グローバル] タブをクリックし、[送信トラフィックポリシー] をクリックし、[外部アクセス ポリシー][REGISTRY_ONLY] に設定して、[設定の更新] をクリックします。

  4. sleep アプリケーションが存在するポッドから次のコマンドを実行して、外部サービスにアクセスします。

    kubectl exec -it ${sleep pod name} -- /bin/sh
    curl aliyun.com -I

    以下は出力例です。

    HTTP/1.1 502 Bad Gateway
    date: Thu, 14 Dec 2023 03:08:46 GMT
    server: envoy
    transfer-encoding: chunked

    502 エラーコードが返されます。これは、ASM インスタンス内のアプリケーションが、ASM インスタンスのサービスレジストリに定義されていない外部サービスにアクセスできないことを示します。

手順 3:サービスエントリを作成して外部サービスを定義する

ASM インスタンス内のアプリケーションが出口ゲートウェイを使用して外部サービスにアクセスできるように、サービスエントリを作成して外部サービスを定義する必要があります。

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

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[クラスターとワークロードの管理] > [外部サービス (serviceentry)] を選択します。表示されるページで、[YAML から作成] をクリックします。

  3. [作成] ページで、sleep アプリケーションが存在する [名前空間] を選択し、[access Mesh External Services][テンプレート] に選択し、YAML の例を構成して、[作成] をクリックします。次の YAML ファイルは例を示しています。

    apiVersion: networking.istio.io/v1beta1
    kind: ServiceEntry
    metadata:
      name: external-svc-http
    spec:
      hosts:
      - aliyun.com
      location: MESH_EXTERNAL
      ports:
      - number: 80
        name: http
        protocol: HTTP
      resolution: DNS
  4. sleep アプリケーションが存在するポッドから次のコマンドを実行して、外部サービスにアクセスします。

    kubectl exec -it ${sleep pod name} -- /bin/sh
    curl aliyun.com -I

    301 が返された場合は、ASM インスタンス内のアプリケーションが外部サービスにアクセスできることを示します。aliyun.com ドメイン名は ASM インスタンスのサービスレジストリで定義されているため、ASM インスタンス内のアプリケーションはこの外部サービスにアクセスできます。この場合、sleep アプリケーションが存在するポッドは、アクセスリクエストを外部サービスに直接送信し、リクエストは出口ゲートウェイを通過しません。

手順 4:出口ゲートウェイを使用して、外部サービスにアクセスするすべてのリクエストをルーティングする

ASM インスタンスのサービスエントリで aliyun.com ドメイン名を定義しました。したがって、仮想サービスと Istio ゲートウェイを設定して、aliyun.com へのトラフィックを管理できます。

  1. 出口ゲートウェイを作成し、ポート 80 で HTTP トラフィックを許可するように設定します。詳細については、「出口ゲートウェイを作成する」をご参照ください。

  2. Istio ゲートウェイを作成し、次の図に示されているように関連パラメーターを設定します。詳細については、「Istio ゲートウェイを管理する」をご参照ください。

    创建网关规则

  3. 次の YAML コードを使用して、仮想サービスを作成します。詳細については、「仮想サービスを管理する」をご参照ください。

    仮想サービスの YAML ファイルを展開して表示する

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: egressgateway-vs
    spec:
      hosts:
      - aliyun.com
      gateways:
      - egress-gw # 作成した Istio ゲートウェイの名前。
      - mesh
      http:
      - match:
        - gateways:
          - mesh
          port: 80
        route:
        - destination:
            host: istio-egressgateway.istio-system.svc.cluster.local
            port:
              number: 80
          weight: 100
      - match:
        - gateways:
          - egress-gw
          port: 80
        route:
        - destination:
            host: aliyun.com
            port:
              number: 80
          weight: 100
  4. 外部サービスにアクセスして、設定を確認します。

    1. sleep アプリケーションが存在するポッドから次のコマンドを実行して、外部サービスにアクセスします。

      kubectl exec -it ${sleep pod name} -- /bin/sh
      curl aliyun.com -I

      301 が返された場合は、ASM インスタンス内のアプリケーションが外部サービスにアクセスできることを示します。この場合、ASM インスタンス内のアプリケーションは、アプリケーションが存在するポッドから外部サービスに直接アクセスしません。代わりに、アプリケーションは出口ゲートウェイを介して外部サービスにアクセスします。

    2. 次のコマンドを実行して、ゲートウェイポッドのアクセスログを表示します。

      説明
      • 出口ゲートウェイポッドに複数のレプリカがある場合、アクセスログはそれらのいずれかで生成されます。アクセスログを見つけるには、これらのポッドレプリカでこのコマンドを 1 つずつ実行する必要があります。

      • 出口ゲートウェイのアクセスログ機能を有効にしている場合は、Simple Log Service コンソール にログインしてアクセスレコードを表示できます。

      kubectl -n istio-system logs ${egress gateway pod name}  -c istio-proxy | grep aliyun.com | tail -n 1

      以下は出力例です。

      {"trace_id":null,"upstream_host":"106.11.XXX.XX:80","downstream_remote_address":"10.34.0.140:47942","requested_server_name":null,"response_code":301,"upstream_service_time":"24","user_agent":"curl/7.86.0-DEV","path":"/","route_name":null,"bytes_sent":0,"response_flags":"-","upstream_local_address":"10.34.0.141:60388","duration":24,"upstream_cluster":"outbound|80||aliyun.com","upstream_transport_failure_reason":null,"authority":"aliyun.com","request_id":"55789d59-9b81-4e39-b64a-66baf44e****","protocol":"HTTP/1.1","bytes_received":0,"method":"HEAD","downstream_local_address":"10.34.0.141:80","start_time":"2022-11-30T08:03:01.315Z","istio_policy_status":null,"x_forwarded_for":"10.34.0.140"}

      downstream_remote_address は、sleep アプリケーションが存在するポッドの IP アドレスを示します。

      設定が完了すると、指定された外部サービスへのアクセスリクエストは出口ゲートウェイを通過します。ASM が提供する可観測性とセキュリティ機能を使用して、出口ゲートウェイの送信トラフィックを効率的に管理できます。

参考資料