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

Alibaba Cloud Service Mesh:エグレス トラフィック ポリシーを使用してエグレス トラフィックを管理する

最終更新日:Apr 04, 2025

バージョン 1.16.4 以降の ASM インスタンスでは、カスタムリソース定義(CRD)フィールドを使用してエグレス トラフィック ポリシーを定義できます。このトピックでは、エグレス トラフィック ポリシーを使用してエグレス トラフィックを管理する方法について説明します。

背景

原則

ASM は、ServiceEntry、VirtualService、Gateway、Destination などの複数リソースを作成し、これらのリソースが相互接続されていることを確認することで、エグレス トラフィック管理をサポートしています。構成が完了すると、トラフィックがエグレス ゲートウェイに透過的にリダイレクトされ、外部サービスに転送されます。

これらの構成は複雑で、関連フィールドを深く理解する必要があり、エラーが発生しやすくなっています。エグレス トラフィック構成のしきい値を下げるために、ASM は ASMEgressTrafficPolicy リソースを導入しています。

ASMEgressTrafficPolicy は、エグレス トラフィック構成を抽象化および簡素化します。 ServiceEntry、VirtualService、Gateway、Destination などのリソースを手動で構成する代わりに、必要な構成を追加するだけで、トラフィックをエグレス ゲートウェイに透過的にリダイレクトし、HTTP/HTTPS プロトコルを介して外部サービスに送信できます。

ASMEgressTrafficPolicy は ASM のネイティブリソースを簡素化するため、高度なニーズ(エグレス トラフィックの比例ルーティング、エグレス ゲートウェイからの mTLS の開始など)の一部に対応できない場合があります。カスタム構成の追加など、高度な機能を使用する必要がある場合は、「ASMですべてのアウトバウンドトラフィックをルーティングするようにエグレスゲートウェイを構成する」をご参照ください。

機能

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

この例のトラフィック パスは、次の 2 つのタイプに分類できます。

1. サイドカー プロキシ間およびサイドカー プロキシとゲートウェイ間の通信:デフォルトでは、相互トランスポート層セキュリティ(mTLS)が通信に対して有効になっており、証明書は ASM によって管理されます。

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

a. ASM の高度なレイヤー 7 機能が適切に機能するように、アプリケーションとサイドカー プロキシは可能な限りプレーンテキストで通信します。このようにして、サイドカー プロキシはトラフィックのレイヤー 7 情報を取得し、より高度な機能をサポートできます。特別な理由により、アプリケーションが HTTPS リクエストを直接送信する必要がある場合は、ASM のレイヤー 4 機能のみを使用できます。

b. エグレス ゲートウェイと外部サービス間の通信プロトコルをプレーンテキストまたは HTTPS のいずれかに構成できます。

前提条件

準備

ASM インスタンスのエグレス トラフィック ポリシーを設定する

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

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

  3. [グローバル] タブで、[アウトバウンドトラフィックポリシー] をクリックし、レジストリのみ[外部アクセスポリシー] の右側にある [設定の更新] をクリックし、 をクリックします。

名前空間を作成する

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

  2. [グローバル名前空間] ページで、[kubernetes クラスタへの自動サイドカー挿入の同期] をクリックして、名前空間を ASM インスタンスによって管理される ACK クラスタに同期します。

エグレス ゲートウェイを作成する

ASM で egressgateway-a という名前のエグレス ゲートウェイを作成し、[ポートマッピング] を HTTP 80、HTTPS 443、HTTPS 444 に設定し、[双方向 TLS 認証のサポート] を有効にします。詳細については、「エグレス ゲートウェイを作成する」をご参照ください。

生成された YAML ファイルの spec フィールドに次の内容が含まれていることを確認します。含まれていない場合は、追加してください。

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

サービスを作成する

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

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

    1. test.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

      展開して 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 プレーンテキストを使用する

このソリューションは、実際の環境では合理的ではありません。サイドカー コンテナとエグレス ゲートウェイ間の HTTP プレーンテキストでの通信は、クライアント認証が利用できない可能性があります。現在、ASMEgressTrafficPolicy は HTTP プレーンテキストを使用してエグレス ゲートウェイにアクセスすることをサポートしていません。

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

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

  • セキュリティ機能はエグレス ゲートウェイに依存します。ただし、mTLS がない場合、クライアント ID に基づくすべての認証機能は使用できません。この場合、エグレス ゲートウェイはすべての要求を無差別に拒否することしかできません。

(推奨)ソリューション 2:サイドカー プロキシとエグレス ゲートウェイ間の通信に mTLS を使用する

  1. エグレス トラフィック ポリシーを作成します。

    コンソールから構成する

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

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

    3. ゲートウェイ名をクリックして [ゲートウェイの概要] ページに移動します。左側の [アウトバウンドトラフィックポリシー] をクリックします。次の図に示すようにパラメータを構成します。

      image

    kubectl から構成する

    1. 次の内容を含む egress-by-egressgateway.yaml ファイルを作成します。

      フィールドの詳細については、「ASMEgressTrafficPolicy CRD」をご参照ください。

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway  # この値の形式は egress-by-{エグレス ゲートウェイの名前} です。この値は、エグレス ゲートウェイの名前に対応します。
        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  # DNS 解決後の複数のドメイン名の IP アドレスは同じである必要があります。
            - httpbin.org      # DNS 解決後の複数のドメイン名の IP アドレスは同じである必要があります。
            port:
              name: http
              number: 80
              protocol: HTTP
            byEgressGateway:
              port: 80        # サイドカー → 80 ゲートウェイ → 80 サービス (httpbin.org)
    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 へのアクセスが失敗したことを示します。

    出力は、エグレス トラフィック ポリシーが有効になっていることを示しています。

sleep-a サービスを使用して HTTPS 経由で外部サービスにアクセスする

(推奨)ソリューション 1:サイドカープロキシとエグレスゲートウェイ間の通信に mTLS を使用する

  1. エグレス トラフィック ポリシーを作成します。

    コンソールで構成する

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

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

    3. ゲートウェイ名をクリックして [ゲートウェイの概要] ページに入り、左側の [アウトバウンド トラフィック ポリシー] をクリックします。次の図に示すようにパラメータを構成します。

      image

    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-{エグレスゲートウェイの名前} です。この値は、エグレスゲートウェイの名前に対応しています。
        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  # DNS 解決後の複数のドメイン名の IP アドレスは同じである必要があります。
            - httpbin.org      # DNS 解決後の複数のドメイン名の IP アドレスは同じである必要があります。
            port:
              name: http
              number: 80
              protocol: HTTP
            byEgressGateway:
              port: 80        # サイドカー → 80 ゲートウェイ → 80 サービス (httpbin.org)
            httpsUpgrade:
              enabled: true   # この値が false に設定されている場合、httpsUpgrade の port パラメータの値は有効になりません。
              port: 443       # サイドカー → 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 API をリクエストし、エグレスゲートウェイが 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.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.orghttps://www.httpbin.org の両方へのアクセスが失敗します。

    出力は、エグレス トラフィック ポリシーが有効になっていることを示しています。

ソリューション 2:サイドカープロキシとエグレスゲートウェイ間の通信に HTTPS を使用する
  1. エグレス トラフィック ポリシーを作成します。

    コンソール インターフェースで構成する

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

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

    3. ゲートウェイ名をクリックして [ゲートウェイの概要] ページに入り、左側の [アウトバウンド トラフィック ポリシー] をクリックします。次の図に示すようにパラメータを構成します。

      image

    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-{エグレスゲートウェイの名前} です。この値は、エグレスゲートウェイの名前に対応しています。
        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   # 準備のステップ 3 で定義された 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

        出力は 200 を返し、sleep-a サービスを介した http://www.httpbin.org へのアクセスが成功したことを示します。

      2. 次のコマンドを実行して httpbin.organything API をリクエストし、エグレスゲートウェイが 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.orghttps://www.httpbin.org の両方へのアクセスが失敗します。

    出力は、エグレス トラフィック ポリシーが有効になっていることを示しています。

sleep-a サービスを使用して TCP 経由で外部サービスにアクセスする

  1. エグレス トラフィック ポリシーを作成します。

    コンソールから構成する

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

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

    3. ゲートウェイ名をクリックして [ゲートウェイの概要] ページに入り、左側の [アウトバウンド トラフィック ポリシー] をクリックします。次の図に示すようにパラメーターを構成します。

      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. default 名前空間の 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.comhttps://www.alibabacloud.com の両方へのアクセスが失敗します。

      出力は、エグレス トラフィック ポリシーが有効になっていることを示しています。

関連操作

指定された名前空間から送信された POST リクエストを拒否する

エグレスゲートウェイとエグレス トラフィック ポリシーを使用することで、クラスター内のアウトバウンド トラフィックを柔軟に制御できます。権限付与ポリシーと組み合わせることで、より詳細なアクセスの制御を実装できます。たとえば、次のポリシーを使用して、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 が返されます。www.httpbin.org への GET リクエストは影響を受けません。