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

Alibaba Cloud Service Mesh:ASMEgressTrafficPolicy を使用したエグレストラフィックの管理

最終更新日:Jun 22, 2026

バージョン 1.16.4 以降、Alibaba Cloud Service Mesh (ASM) はカスタムリソース定義 (CRD) である `ASMEgressTrafficPolicy` をサポートしています。本記事では、この CRD を使用してエグレストラフィックを管理する方法について説明します。

背景情報

仕組み

サービスメッシュは、`ServiceEntry`、`VirtualService`、`Gateway`、`Destination` などの複数のリソースを作成し、相互接続することでエグレストラフィック管理をサポートします。これらのリソースが構成されると、トラフィックは透過的にインターセプトされてエグレスゲートウェイにルーティングされ、エグレスゲートウェイが外部サービスにトラフィックを転送します。

この構成プロセスは複雑でエラーが発生しやすく、さまざまなフィールドに関する深い理解が必要です。エグレストラフィックの構成を簡素化するために、ASM は `ASMEgressTrafficPolicy` リソースを導入しました。

`ASMEgressTrafficPolicy` リソースは、エグレストラフィックの構成を抽象化し、簡素化します。`ServiceEntry`、`VirtualService`、`Gateway`、`Destination` などのリソースを手動で作成・管理する代わりに、いくつかの基本的な設定を定義するだけで済みます。その後、サービスメッシュは透過的にトラフィックをインターセプトし、エグレスゲートウェイにルーティングし、HTTP または HTTPS を介して外部サービスに転送します。

`ASMEgressTrafficPolicy` はネイティブのサービスメッシュリソースを簡素化した抽象化であるため、パーセンテージベースのトラフィックルーティングやエグレスゲートウェイからの mTLS の開始など、高度なユースケースをサポートしていない場合があります。高度な機能やカスタム構成が必要な場合は、「メッシュ内トラフィック用の統合エグレスゲートウェイの構成」をご参照ください。

特徴

ASM は、アプリケーション間の通信を接続、管理、保護するための統一された方法を提供します。ネットワーク IP ベースの方法とは異なり、ASM は既存のアプリケーションコードの変更を必要としないアプリケーション中心のアプローチを使用します。`ASMEgressTrafficPolicy` リソースは、エグレスゲートウェイを介してエグレストラフィックを管理する方法を定義します。ASM エグレスゲートウェイと `AuthorizationPolicy` を組み合わせることで、エグレストラフィックをより柔軟に制御できます。Dingtalk_20230411112608

この例には、次のトラフィックフローが含まれます:

1. メッシュプロキシ間、およびプロキシとゲートウェイ間の通信:デフォルトでは、ASM はこの通信を mTLS で保護し、証明書を管理します。

2. アプリケーションとそのメッシュプロキシ間、およびゲートウェイと外部サービス間の通信:

a. サービスメッシュの高度な L7 機能を使用するには、アプリケーションは可能な限りプレーンテキストを使用してメッシュプロキシと通信する必要があります。これにより、メッシュプロキシは L7 トラフィック情報にアクセスし、より高度な機能をサポートできます。アプリケーションが直接 HTTPS トラフィックを開始する必要がある場合、サービスメッシュは L4 機能しか提供できません。

b. エグレスゲートウェイと外部サービス間の通信プロトコルを構成できます。プレーンテキストと HTTPS の両方がサポートされています。

前提条件

前提条件

アウトバウンドトラフィックポリシーの設定

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

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

  3. global タブで、Outbound Traffic Policy をクリックします。次に、Outbound Traffic Policy の右側にある [REGISTRY_ONLY] をクリックし、Update Settings をクリックします。

名前空間の作成

  1. istio-egress 名前空間を作成します。詳細については、「グローバル名前空間の管理」をご参照ください。

  2. Global Namespace ページで、同期自動注入 をクリックして、名前空間を ASM インスタンスが管理する ACK クラスターと同期します。

エグレスゲートウェイの作成

ASM で、egressgateway-a という名前のエグレスゲートウェイを作成します。Port Mapping で、ポート 80 で HTTP を、ポート 443 および 444 で HTTPS を構成します。次に、Support two-way TLS authentication を有効にします。詳細については、「エグレスゲートウェイサービスの作成」をご参照ください。

生成された YAML ファイルの spec フィールドに次の内容が含まれていることを確認してください:

spec:
  podLabels:
    security.istio.io/tlsMode: istio

サンプルアプリケーションの作成

  1. ASM インスタンスで、mytest という名前空間を作成し、自動サイドカーインジェクションを有効にします。詳細については、「グローバル名前空間の管理」をご参照ください。

  2. ACK クラスターで、mytest 名前空間に sleep-a サービスを、default 名前空間に nginx サービスをデプロイします。

    1. test.yaml という名前のファイルを次の内容で作成します:

      Test.yaml

      apiVersion: v1
      kind: Service
      metadata:
        name: sleep-a
        namespace: mytest
        labels:
          app: sleep-a
          service: sleep-a
      spec:
        ports:
        - port: 80
          name: http
        selector:
          app: sleep-a
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sleep-a
        namespace: mytest
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sleep-a
        template:
          metadata:
            labels:
              app: sleep-a
          spec:
            terminationGracePeriodSeconds: 0
            containers:
            - name: sleep
              image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/curl:asm-sleep
              command: ["/bin/sleep", "infinity"]
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - mountPath: /etc/sleep/tls
                name: secret-volume
            volumes:
            - name: secret-volume
              secret:
                secretName: sleep-secret
                optional: true
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: nginx
        name: nginx
        namespace: default
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            app: nginx
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: nginx
          spec:
            containers:
            - image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/nginx:1.27.0
              imagePullPolicy: Always
              name: nginx
              resources: {}
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
            dnsPolicy: ClusterFirst
            restartPolicy: Always
            schedulerName: default-scheduler
            securityContext: {}
            terminationGracePeriodSeconds: 30
    2. ACK クラスターで、次のコマンドを実行して sleep-a サービスと nginx サービスをデプロイします:

      kubectl apply -f test.yaml
  3. sleep-a サービスと nginx サービスから http://www.httpbin.org にアクセスするために、次のコマンドを実行します:

    kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org
    kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org

    両方のコマンドの出力は 502 であり、アクセスが失敗したことを示します。

sleep-a から外部 HTTP サービスへのアクセス許可

オプション 1:サイドカーとエグレスゲートウェイ間のプレーンテキスト HTTP 通信

このオプションは本番環境では実用的ではありません。アプリケーションコンテナとエグレスゲートウェイ間のプレーンテキスト通信では、クライアント ID に基づく権限付与ができません。`ASMEgressTrafficPolicy` は、プレーンテキスト HTTP 経由でのエグレスゲートウェイへのアクセスをサポートしていません。

  • トラフィック管理は主にクライアントのサイドカーで実施され、エグレスゲートウェイは必要ありません。

  • 可観測性はエグレスゲートウェイに依存しません。

  • セキュリティ機能はエグレスゲートウェイに依存します。ただし、mTLS がないと、クライアント ID に基づくすべての権限付与機能が無効になります。エグレスゲートウェイはすべてのリクエストを拒否することしかできません。

オプション 2:サイドカーとエグレスゲートウェイ間の mTLS 通信 (推奨)

  1. ASMEgressTrafficPolicy を作成します。

    コンソール

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

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

    3. ゲートウェイの名前をクリックして [ゲートウェイ概要] ページに移動します。左側のナビゲーションウィンドウで、Outbound Traffic Policy をクリックします。

      エグレストラフィックポリシールールを構成します。[エグレスゲートウェイ] を `egressgateway` に設定します。[クラスター内サービス] エリアで、[名前空間] を `mytest` に、[ワークロードラベル名] を `app` に、[ラベル値] を `sleep-a` に設定します。[外部サービス] エリアで、[外部サービス名] を `httpbin-service-http` に設定し、`www.httpbin.org` と `httpbin.org` を [ドメインリスト] に追加します。[サービスポート] については、[ポート] を `80` に、[ポート名] を `http` に、[プロトコル] を [HTTP] に設定します。[アクセス方法] エリアで、エグレスゲートウェイポート `80` を選択し、[HTTPS にアップグレード][いいえ] を選択します。

    kubectl

    1. egress-by-egressgateway.yaml という名前のファイルを次の内容で作成します。

      フィールドの説明については、「ASMEgressTrafficPolicy CRD リファレンス」をご参照ください。

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway  # 命名規則: egress-by-{egress-gateway-name}
        namespace: istio-egress         # 命名規則: istio-egress 名前空間に固定
      spec:
        byEgressGateway:
          name: egressgateway
        egressRules:
        - from:
          - namespace: mytest
            workloadSelector:
              app: sleep-a
          to:
          - name: httpbin-service-http
            hosts:
            - www.httpbin.org  # すべてのホストは同じ IP アドレスに解決される必要があります
            - httpbin.org      # すべてのホストは同じ IP アドレスに解決される必要があります
            port:
              name: http
              number: 80
              protocol: HTTP
            byEgressGateway:
              port: 80        # トラフィックパス: sidecar -> ゲートウェイ (ポート 80) -> サービス (httpbin.org, ポート 80)
    2. ACK クラスターで、次のコマンドを実行して ASMEgressTrafficPolicy リソースを作成します。

      kubectl apply -f egress-by-egressgateway.yaml
  2. ASMEgressTrafficPolicy が有効になっていることを確認します。

    1. default 名前空間の nginx サービスから http://www.httpbin.org へのアクセスをテストするために、次のコマンドを実行します。

      kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org

      コマンドは 502 を返し、nginx サービスから http://www.httpbin.org へのアクセスが期待どおりにブロックされたことを示します。

    2. mytest 名前空間の sleep-a サービスから http://www.httpbin.org へのアクセスをテストするために、次のコマンドを実行します。

      kubectl -n mytest exec deployment/sleep-a -- curl  -s -o /dev/null -w "%{http_code}\n"  http://www.httpbin.org

      コマンドは 200 を返し、アクセスが期待どおりに許可されたことを示します。

    3. egress-by-egressgateway ポリシーを削除するために次のコマンドを実行し、再度 mytest 名前空間の sleep-a サービスから http://www.httpbin.org へのアクセスをテストします。

      kubectl -n istio-egress delete ASMEgressTrafficPolicy  egress-by-egressgateway
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org

      コマンドは 502 を返し、ASMEgressTrafficPolicy が削除された後、sleep-a サービスは http://www.httpbin.org にアクセスできなくなったことを示します。

    これらの結果から、ASMEgressTrafficPolicy が正しく機能していることが確認できます。

sleep-a から外部 HTTPS サービスへのアクセス

オプション 1:サイドカーとエグレスゲートウェイ間の mTLS 通信 (推奨)

  1. ASMEgressTrafficPolicy を作成します。

    コンソール

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

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

    3. ゲートウェイ名をクリックして [ゲートウェイ概要] ページを開きます。左側のナビゲーションウィンドウで、Outbound Traffic Policy をクリックします。

      エグレストラフィックルールを構成します。[クラスター内サービス] セクションで、[名前空間][mytest] に、[ラベル名]app に、[ラベル値]sleep-a に設定します。[外部サービス] セクションで、[外部サービス名]httpbin-service-http に設定し、www.httpbin.orghttpbin.org[ドメインリスト] に追加し、[サービスポート][ポート:80][ポート名:http][プロトコル:HTTP] で構成します。[アクセス方法] セクションで、[エグレスゲートウェイポート][80] に、[HTTPS にアップグレード][はい] に、[HTTPS ポート][443] に設定します。

    Kubectl

    1. egress-by-egressgateway.yaml ファイルを次の内容で更新します。

      spec フィールドに、https://www.httpbin.org にアクセスするための httpsUpgrade フィールドと関連定義が追加されます。フィールドの説明については、「ASMEgressTrafficPolicy CRD リファレンス」をご参照ください。

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway  # 命名規則: egress-by-{egress-gateway-name}
        namespace: istio-egress          # 命名規則: istio-egress 名前空間に固定
      spec:
        byEgressGateway:
          name: egressgateway
        egressRules:
        - from:
           - namespace: mytest
             workloadSelector:
                app: sleep-a
          to:
          - name: httpbin-service-http
            hosts:
            - www.httpbin.org  # 複数のドメイン名が解決する IP アドレスは同じである必要があります
            - httpbin.org      # 複数のドメイン名が解決する IP アドレスは同じである必要があります
            port:
              name: http
              number: 80
              protocol: HTTP
            byEgressGateway:
              port: 80        # Sidecar -> ゲートウェイのポート 80 -> サービスのポート 80 (httpbin.org)
            httpsUpgrade:
              enabled: true   # enabled が false に設定されている場合、httpsUpgrade のポート設定は効果がありません
              port: 443       # Sidecar -> ゲートウェイのポート 80 -> サービスのポート 443 (httpbin.org)
    2. ACK クラスターで、次のコマンドを実行して ASMEgressTrafficPolicy リソースを作成します:

      kubectl apply -f egress-by-egressgateway.yaml
  2. ASMEgressTrafficPolicy の構成を検証します。

    1. mytest 名前空間の sleep-a サービスを検証します。

      1. sleep-a サービスから http://www.httpbin.org にアクセスするために、次のコマンドを実行します。

        kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n" http://httpbin.org

        ステータスコード 200 は、sleep-a サービスが http://www.httpbin.org にアクセスできることを示します。

      2. httpbin.organything エンドポイントをリクエストし、エグレスゲートウェイが HTTP リクエストを HTTPS リクエストにアップグレードすることを確認するために、次のコマンドを実行します。

        kubectl -n mytest exec deployment/sleep-a -- sh -c "curl -s  http://httpbin.org/anything |grep url"

        期待される出力:

        "url": "https://httpbin.org/anything"

        url フィールドの値が https で始まっていることから、エグレスゲートウェイがリクエストを https にアップグレードしてから httpbin.org に転送したことが確認できます。

      3. mytest 名前空間の sleep-a サービスから https://www.httpbin.org にアクセスするために、次のコマンドを実行します。

        kubectl -n mytest exec deployment/sleep-a -- curl  -s -o /dev/null -w "%{http_code}\n"  https://www.httpbin.org

        ステータスコード 200 は、sleep-a サービスが https://www.httpbin.org にアクセスできることを示します。

    2. default 名前空間の Nginx サービスを検証します。

      1. Nginx サービスから http://www.httpbin.org にアクセスするために、次のコマンドを実行します。

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org

        ステータスコード 502 は、Nginx サービスが http://www.httpbin.org へのアクセスに失敗したことを示します。

      2. Nginx サービスから https://www.httpbin.org にアクセスするために、次のコマンドを実行します。

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" https://www.httpbin.org

        接続拒否エラーは、Nginx サービスが https://www.httpbin.org へのアクセスに失敗したことを示します。

      3. 接続が拒否された理由を特定するために、Nginx ワークロードのサイドカーのアクセスログを表示する次のコマンドを実行します。

         kubectl -n default  logs -f deployment/nginx -c istio-proxy   --tail=1 

        期待される出力:

        {"authority":"-","bytes_received":"0","bytes_sent":"0","downstream_local_address":"52.86.XX.XX:443","downstream_remote_address":"172.16.0.199:56748","duration":"0","istio_policy_status":"-","method":"-","path":"-","protocol":"-","request_id":"-","requested_server_name":"-","response_code":"0","response_flags":"UH","route_name":"-","start_time":"2023-04-11T02:00:07.409Z","trace_id":"-","upstream_cluster":"BlackHoleCluster","upstream_host":"-","upstream_local_address":"-","upstream_service_time":"-","upstream_transport_failure_reason":"-","user_agent":"-","x_forwarded_for":"-"}

        出力は、リクエストが BlackHoleCluster に転送され、接続が拒否されたことを示しています。

    3. egress-by-egressgateway を削除するために次のコマンドを実行し、再度 mytest 名前空間の sleep-a サービスから http://www.httpbin.orghttps://www.httpbin.org にアクセスします。

      kubectl -n istio-egress delete ASMEgressTrafficPolicy  egress-by-egressgateway
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  http://www.httpbin.org
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  https://www.httpbin.org

      http://www.httpbin.org へのリクエストは 502 を返し、https://www.httpbin.org へのリクエストは拒否されます。ASMEgressTrafficPolicy 構成が削除された後、sleep-a サービスは http://www.httpbin.org または https://www.httpbin.org にアクセスできなくなります。

    これらの結果から、ASMEgressTrafficPolicy が期待どおりに機能していることが確認できます。

オプション 2:サイドカーとエグレスゲートウェイ間の HTTPS 通信

  1. ASMEgressTrafficPolicy を作成します。

    コンソール

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

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

    3. ゲートウェイ名をクリックして [ゲートウェイ概要] ページを開きます。左側のナビゲーションウィンドウで、Outbound Traffic Policy をクリックします。

      エグレストラフィックルールページで、[ルールを追加] をクリックし、ルールパラメーターを構成します。[名前空間]mytest に設定します。[ワークロードラベル] については、ラベル名を app に、ラベル値を sleep-a に設定します。[外部サービス名]httpbin-service-https に設定します。www.httpbin.orghttpbin.org[ドメインリスト] に追加します。[サービスポート] については、ポートを 443 に、ポート名を https に、[プロトコル] を HTTPS に設定します。[アクセス方法] については、[エグレスゲートウェイポート経由] を選択し、ポートを 444 に設定します。

    Kubectl

    1. egress-by-egressgateway.yaml ファイルを次の内容で更新します。

      spec フィールドに、httpsUpgrade フィールドと https://www.httpbin.org に直接アクセスするための定義が追加されます。フィールドの説明については、「ASMEgressTrafficPolicy CRD」をご参照ください。

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway  # 命名規則: egress-by-{egress-gateway-name}
        namespace: istio-egress          # 命名規則: istio-egress 名前空間に固定
      spec:
        byEgressGateway:
          name: egressgateway
        egressRules:
        - from:
           - namespace: mytest
             workloadSelector:
                app: sleep-a
          to:
          - name: httpbin-service-https
            hosts:
            - www.httpbin.org
            - httpbin.org
            port:
              name: https
              number: 443
              protocol: HTTPS
            byEgressGateway:
              port: 444   # 前提条件でエグレスゲートウェイに定義された HTTPS ポート 444
    2. ACK クラスターで、次のコマンドを実行して ASMEgressTrafficPolicy リソースを作成します:

      kubectl apply -f egress-by-egressgateway.yaml
  2. ASMEgressTrafficPolicy の構成を検証します。

    1. mytest 名前空間の sleep-a サービスを検証します。

      1. sleep-a サービスから http://www.httpbin.org にアクセスするために、次のコマンドを実行します。

        kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n" http://httpbin.org

        ステータスコード 502 は、sleep-a サービスが http://www.httpbin.org へのアクセスに失敗したことを示します。

      2. mytest 名前空間の sleep-a サービスから https://www.httpbin.org にアクセスするために、次のコマンドを実行します。

        kubectl -n mytest exec deployment/sleep-a -- curl  -s -o /dev/null -w "%{http_code}\n"  https://www.httpbin.org

        ステータスコード 200 は、sleep-a サービスが https://www.httpbin.org にアクセスできることを示します。

    2. default 名前空間の Nginx サービスを検証します。

      1. Nginx サービスから http://www.httpbin.org にアクセスするために、次のコマンドを実行します。

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org

        ステータスコード 502 は、Nginx サービスが http://www.httpbin.org へのアクセスに失敗したことを示します。

      2. Nginx サービスから https://www.httpbin.org にアクセスするために、次のコマンドを実行します。

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" https://www.httpbin.org

        接続拒否エラーは、Nginx サービスが https://www.httpbin.org へのアクセスに失敗したことを示します。

      3. 接続が拒否された理由を特定するために、Nginx ワークロードのサイドカーのアクセスログを表示する次のコマンドを実行します。

         kubectl -n default  logs -f deployment/nginx -c istio-proxy   --tail=1 

        期待される出力:

        {"authority":"-","bytes_received":"0","bytes_sent":"0","downstream_local_address":"52.86.XX.XX:443","downstream_remote_address":"172.16.0.199:56748","duration":"0","istio_policy_status":"-","method":"-","path":"-","protocol":"-","request_id":"-","requested_server_name":"-","response_code":"0","response_flags":"UH","route_name":"-","start_time":"2023-04-11T02:00:07.409Z","trace_id":"-","upstream_cluster":"BlackHoleCluster","upstream_host":"-","upstream_local_address":"-","upstream_service_time":"-","upstream_transport_failure_reason":"-","user_agent":"-","x_forwarded_for":"-"}

        出力は、リクエストが BlackHoleCluster に転送され、接続が拒否されたことを示しています。

    3. egress-by-egressgateway を削除するために次のコマンドを実行し、再度 mytest 名前空間の sleep-a サービスから http://www.httpbin.orghttps://www.httpbin.org にアクセスします。

      kubectl -n istio-egress delete ASMEgressTrafficPolicy  egress-by-egressgateway
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  http://www.httpbin.org
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  https://www.httpbin.org

      http://www.httpbin.org へのリクエストは 502 を返し、https://www.httpbin.org へのリクエストは拒否されます。ASMEgressTrafficPolicy 構成が削除された後、sleep-a サービスは http://www.httpbin.org または https://www.httpbin.org にアクセスできなくなります。

      これらの結果から、ASMEgressTrafficPolicy が期待どおりに機能していることが確認できます。

sleep-a サービスから外部 TCP サービスへのアクセス

  1. ASMEgressTrafficPolicy を作成します。

    コンソール

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

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

    3. ゲートウェイ名をクリックします。 [Gateway overview] ページで、左側のナビゲーションウィンドウの Outbound Traffic Policy をクリックします。 次の図のようにポリシーを設定します。

      image

    kubectl

    1. 次の内容で egress-by-egressgateway.yaml という名前のファイルを作成します。

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway
        namespace: istio-egress
      spec:
        byEgressGateway:
          name: egressgateway
        egressRules:
        - from:
          - namespace: mytest
            workloadSelector:
              app: sleep-a
          to:
          - byEgressGateway: {}
            hosts:
            - www.alibabacloud.com
            name: aliyun-service-tcp
            port:
              name: tcp
              number: 443
              protocol: TCP
    2. ACK クラスターで次のコマンドを実行して、ASMEgressTrafficPolicy リソースを作成します。

      kubectl apply -f egress-by-egressgateway.yaml
  2. ASMEgressTrafficPolicy の設定が適用されたことを検証します。

    1. mytest 名前空間の sleep-a サービスを検証します。

      1. 次のコマンドを実行して、sleep-a サービスから www.alibabacloud.com にアクセスします。

        kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n" http://www.alibabacloud.com

        出力は 502 で、sleep-a サービスが http://www.alibabacloud.com へのアクセスに失敗したことを示します。

      2. 次のコマンドを実行して、mytest 名前空間の sleep-a サービスから https://www.alibabacloud.com にアクセスします。

        kubectl -n mytest exec deployment/sleep-a -- curl  -s -o /dev/null -w "%{http_code}\n"  https://www.alibabacloud.com

        出力は 200 で、sleep-a サービスが https://www.alibabacloud.com へのアクセスに成功したことを示します。

    2. デフォルトの名前空間で Nginx サービスを検証します。

      1. 次のコマンドを実行して、Nginx サービスから http://www.alibabacloud.com にアクセスします。

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" http://www.alibabacloud.com

        出力は 502 で、Nginx サービスが http://www.alibabacloud.com へのアクセスに失敗したことを示します。

      2. 次のコマンドを実行して、Nginx サービスから https://www.alibabacloud.com にアクセスします。

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" https://www.alibabacloud.com

        出力は接続が拒否されたことを示しており、Nginx サービスは https://www.alibabacloud.com へのアクセスに失敗しました。

      3. 次のコマンドを実行して、Nginx ワークロードの sidecar のアクセスログを検査し、接続が拒否された理由を確認します。

         kubectl -n default  logs -f deployment/nginx -c istio-proxy --tail=1

        期待される出力:

        {"authority":"-","bytes_received":"0","bytes_sent":"0","downstream_local_address":"52.86.XX.XX:443","downstream_remote_address":"172.16.0.199:56748","duration":"0","istio_policy_status":"-","method":"-","path":"-","protocol":"-","request_id":"-","requested_server_name":"-","response_code":"0","response_flags":"UH","route_name":"-","start_time":"2023-04-11T02:00:07.409Z","trace_id":"-","upstream_cluster":"BlackHoleCluster","upstream_host":"-","upstream_local_address":"-","upstream_service_time":"-","upstream_transport_failure_reason":"-","user_agent":"-","x_forwarded_for":"-"}

        出力は、リクエストが BlackHoleCluster にルーティングされ、接続が拒否されたことを示しています。

    3. 次のコマンドを実行して egress-by-egressgateway を削除し、mytest 名前空間の sleep-a サービスから再度 http://www.alibabacloud.comhttps://www.alibabacloud.com へのアクセスを試みます。

      kubectl -n istio-egress delete ASMEgressTrafficPolicy  egress-by-egressgateway
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  http://www.alibabacloud.com
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  https://www.alibabacloud.com

      http://www.alibabacloud.com へのリクエストは 502 エラーを返し、https://www.alibabacloud.com へのリクエストは拒否されます。 これは、ASMEgressTrafficPolicy 設定を削除すると、sleep-a サービスが http://www.alibabacloud.com または https://www.alibabacloud.com にアクセスできなくなることを示しています。

      これらの結果から、ASMEgressTrafficPolicy の設定が期待どおりに機能していることが確認できます。

関連操作

特定の名前空間からの POST リクエストの拒否

ASM エグレスゲートウェイと ASMEgressTrafficPolicy を使用して、クラスターからのエグレストラフィックを制御します。より詳細なアクセス制御を行うには、AuthorizationPolicy を適用します。たとえば、次の構成では、mytest 名前空間からの POST リクエストを拒否します。

kind: AuthorizationPolicy
apiVersion: security.istio.io/v1beta1
metadata:
  name: sleep-a-egress-www-httpbin-org
  namespace: istio-system
spec:
  action: DENY
  rules:
    - to:
        - operation:
            hosts:
            - www.httpbin.org
            - httpbin.org
            methods:
              - POST
      from:
        - source:
            namespaces: ["mytest"]
  selector:
    matchLabels:
      istio: egressgateway-a

この構成を適用した後、sleep-a サービスから www.httpbin.org への POST リクエストは RBAC: access を返します。sleep-a サービスから www.httpbin.org への GET リクエストは影響を受けません。