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

Alibaba Cloud Service Mesh:メッシュトラフィックのための一元化されたエグレスゲートウェイの設定

最終更新日:Jun 22, 2026

ご利用のメッシュ内のアプリケーションが外部サービスと通信する必要がある場合、エグレスゲートウェイを一元化された出口ポイントとして使用し、すべてのアウトバウンドトラフィックを管理できます。エグレスゲートウェイを設定することで、セキュリティコントロールとルーティングポリシーを適用し、アプリケーションのセキュリティと可観測性を向上させることができます。

重要

この記事を読む前に、「ASMEgressTrafficPolicy を使用したエグレストラフィックの管理」の内容をよく理解しておいてください。この記事では、サービスメッシュリソースを使用して、クラスター外のサービスへのリクエストを透過的にインターセプトし、エグレスゲートウェイにリダイレクトします。その後、エグレスゲートウェイはセキュリティポリシーを適用し、リクエストをクラスター外のサービスに送信します。この設定は比較的複雑です。「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 Pod でシェルを開き、外部サービスにアクセスします。

    `kubectl get pod -n default` コマンドを実行すると、sleep Pod の名前を確認できます。

    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 応答は、メッシュ内のアプリケーションが外部サービスにアクセスできることを示します。デフォルトでは、Pod はアクセスに HTTP を使用し、サイトはリダイレクトを返します。

    説明

    この方法ではセキュリティコントロールが提供されず、メッシュの可観測性機能を使用できません。次の手順で説明するように、`REGISTRY_ONLY` を有効にして登録済みサービスへのアクセスを制限し、エグレスゲートウェイをトラフィックの統一された出口ポイントとして使用することを推奨します。

(任意) ステップ 2:REGISTRY_ONLY の有効化

ASM のデフォルトのアウトバウンドトラフィックポリシーは `ALLOW_ANY` です。これを `REGISTRY_ONLY` に変更することを推奨します。このモードでは、サイドカープロキシは、メッシュ内に対応する ServiceEntry がない外部ホストへのアクセスをブロックします。この設定により、アプリケーションのセキュリティが向上します。

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

  • `REGISTRY_ONLY` を有効にせず、ServiceEntry を作成していない場合でも外部サービスにアクセスできますが、エグレスゲートウェイの設定は有効になりません。

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

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

  3. Configure the agent parameters of the injected Sidecar ページで、global タブをクリックし、Outbound Traffic Policy をクリックし、Outbound Traffic Policy[REGISTRY_ONLY] に設定してから、Update Settings をクリックします。

  4. 次のコマンドを実行して、sleep Pod でシェルを開き、外部サービスにアクセスします。

    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 応答は、メッシュ内のアプリケーションが未登録の外部サービスにアクセスできないことを示します。

ステップ 3:外部サービス用の ServiceEntry の作成

エグレスゲートウェイを介してクラスター外のサービスにアクセスするには、外部サービス用の ServiceEntry を作成する必要があります。

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

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

  3. Create ページで、sleep アプリケーションが存在する Namespaces を選択し、Scenario Template[メッシュ外部サービスへのアクセス] を選択し、次の例のように YAML を設定してから、Create をクリックします。

    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 Pod でシェルを開き、外部サービスにアクセスします。

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

    `301` 応答は、アプリケーションが外部サービスにアクセスできるようになったことを示します。メッシュ内で aliyun.com を ServiceEntry で登録したため、アクセスが許可されます。この時点では、アウトバウンドトラフィックはまだ Pod から直接送信されており、エグレスゲートウェイを経由していません。

ステップ 4:エグレスゲートウェイ経由でのトラフィックのルーティング

aliyun.com の ServiceEntry を作成したので、VirtualService や Gateway などのリソースを使用して、aliyun.com へのトラフィックを管理できます。

  1. ポート 80 で HTTP トラフィックをリッスンするエグレスゲートウェイを作成します。詳細については、「エグレスゲートウェイの作成」をご参照ください。

  2. 次のように Gateway リソースを作成します。詳細については、「Istio ゲートウェイの管理」をご参照ください。

    Gateway の作成ページで、[名前空間] を `default` に、[名前] を `egress-gw` に設定します。[ゲートウェイインスタンス] エリアで、[ラベルキー] を `istio` に、[ラベル値] を `egressgateway` に設定します。[公開サービス] エリアで、サービスの [名前] を `http` に、[ポート] を `80` に、[プロトコル][HTTP] に、[サービスドメイン] を `aliyun.com` に設定します。その後、[作成] をクリックします。

  3. 次の YAML を使用して VirtualService を作成します。詳細については、「VirtualService の管理」をご参照ください。

    VirtualService YAML

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: egressgateway-vs
    spec:
      hosts:
      - aliyun.com
      gateways:
      - egress-gw  # 前の手順で作成した Gateway の名前。
      - 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 Pod でシェルを開き、外部サービスにアクセスします。

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

      301 の応答は、アプリケーションが引き続き外部サービスにアクセスできることを示します。 アプリケーションは、Pod からサービスに直接アクセスする代わりに、エグレスゲートウェイを介してトラフィックをルーティングするようになりました。

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

      説明
      • エグレスゲートウェイに複数のレプリカがある場合、アクセスログはいずれかのレプリカに表示される可能性があります。各ゲートウェイ Pod を確認してエントリを見つける必要がある場合があります。

      • エグレスゲートウェイのアクセスログを有効にしている場合は、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 Pod の IP アドレスが表示されます。

      これらの手順を完了すると、外部サービスへのすべてのアウトバウンドトラフィックがエグレスゲートウェイ経由でルーティングされます。

関連ドキュメント