バージョン 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` を組み合わせることで、エグレストラフィックをより柔軟に制御できます。
この例には、次のトラフィックフローが含まれます:
1. メッシュプロキシ間、およびプロキシとゲートウェイ間の通信:デフォルトでは、ASM はこの通信を mTLS で保護し、証明書を管理します。
2. アプリケーションとそのメッシュプロキシ間、およびゲートウェイと外部サービス間の通信:
a. サービスメッシュの高度な L7 機能を使用するには、アプリケーションは可能な限りプレーンテキストを使用してメッシュプロキシと通信する必要があります。これにより、メッシュプロキシは L7 トラフィック情報にアクセスし、より高度な機能をサポートできます。アプリケーションが直接 HTTPS トラフィックを開始する必要がある場合、サービスメッシュは L4 機能しか提供できません。
b. エグレスゲートウェイと外部サービス間の通信プロトコルを構成できます。プレーンテキストと HTTPS の両方がサポートされています。
前提条件
-
バージョン 1.16.4 以降を実行している商用版 ASM インスタンス (Enterprise Edition または Ultimate Edition) が必要です。詳細については、「ASM インスタンスの作成」および「ASM インスタンスの更新」をご参照ください。
-
デフォルトの名前空間で自動インジェクションが有効になっている必要があります。詳細については、「自動インジェクションの有効化」をご参照ください。
前提条件
アウトバウンドトラフィックポリシーの設定
-
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
-
global タブで、Outbound Traffic Policy をクリックします。次に、Outbound Traffic Policy の右側にある [REGISTRY_ONLY] をクリックし、Update Settings をクリックします。
名前空間の作成
-
istio-egress 名前空間を作成します。詳細については、「グローバル名前空間の管理」をご参照ください。
-
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
サンプルアプリケーションの作成
-
ASM インスタンスで、mytest という名前空間を作成し、自動サイドカーインジェクションを有効にします。詳細については、「グローバル名前空間の管理」をご参照ください。
-
ACK クラスターで、mytest 名前空間に sleep-a サービスを、default 名前空間に nginx サービスをデプロイします。
-
test.yaml という名前のファイルを次の内容で作成します:
-
ACK クラスターで、次のコマンドを実行して sleep-a サービスと nginx サービスをデプロイします:
kubectl apply -f test.yaml
-
-
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 通信 (推奨)
-
ASMEgressTrafficPolicy を作成します。
コンソール
-
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
-
ゲートウェイの名前をクリックして [ゲートウェイ概要] ページに移動します。左側のナビゲーションウィンドウで、Outbound Traffic Policy をクリックします。
エグレストラフィックポリシールールを構成します。[エグレスゲートウェイ] を `egressgateway` に設定します。[クラスター内サービス] エリアで、[名前空間] を `mytest` に、[ワークロードラベル名] を `app` に、[ラベル値] を `sleep-a` に設定します。[外部サービス] エリアで、[外部サービス名] を `httpbin-service-http` に設定し、`www.httpbin.org` と `httpbin.org` を [ドメインリスト] に追加します。[サービスポート] については、[ポート] を `80` に、[ポート名] を `http` に、[プロトコル] を [HTTP] に設定します。[アクセス方法] エリアで、エグレスゲートウェイポート `80` を選択し、[HTTPS にアップグレード] で [いいえ] を選択します。
kubectl
-
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) -
ACK クラスターで、次のコマンドを実行して ASMEgressTrafficPolicy リソースを作成します。
kubectl apply -f egress-by-egressgateway.yaml
-
-
ASMEgressTrafficPolicy が有効になっていることを確認します。
-
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へのアクセスが期待どおりにブロックされたことを示します。 -
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を返し、アクセスが期待どおりに許可されたことを示します。 -
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 通信 (推奨)
-
ASMEgressTrafficPolicy を作成します。
コンソール
-
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
-
ゲートウェイ名をクリックして [ゲートウェイ概要] ページを開きます。左側のナビゲーションウィンドウで、Outbound Traffic Policy をクリックします。
エグレストラフィックルールを構成します。[クラスター内サービス] セクションで、[名前空間] を [mytest] に、[ラベル名] を
appに、[ラベル値] をsleep-aに設定します。[外部サービス] セクションで、[外部サービス名] をhttpbin-service-httpに設定し、www.httpbin.orgとhttpbin.orgを [ドメインリスト] に追加し、[サービスポート] を [ポート:80]、[ポート名:http]、[プロトコル:HTTP] で構成します。[アクセス方法] セクションで、[エグレスゲートウェイポート] を [80] に、[HTTPS にアップグレード] を [はい] に、[HTTPS ポート] を [443] に設定します。
Kubectl
-
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) -
ACK クラスターで、次のコマンドを実行して ASMEgressTrafficPolicy リソースを作成します:
kubectl apply -f egress-by-egressgateway.yaml
-
-
ASMEgressTrafficPolicy の構成を検証します。
-
mytest 名前空間の sleep-a サービスを検証します。
-
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にアクセスできることを示します。 -
httpbin.orgのanythingエンドポイントをリクエストし、エグレスゲートウェイが 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に転送したことが確認できます。 -
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にアクセスできることを示します。
-
-
default 名前空間の Nginx サービスを検証します。
-
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へのアクセスに失敗したことを示します。 -
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へのアクセスに失敗したことを示します。 -
接続が拒否された理由を特定するために、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に転送され、接続が拒否されたことを示しています。
-
-
egress-by-egressgateway を削除するために次のコマンドを実行し、再度 mytest 名前空間の sleep-a サービスから
http://www.httpbin.orgとhttps://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.orghttp://www.httpbin.orgへのリクエストは502を返し、https://www.httpbin.orgへのリクエストは拒否されます。ASMEgressTrafficPolicy 構成が削除された後、sleep-a サービスはhttp://www.httpbin.orgまたはhttps://www.httpbin.orgにアクセスできなくなります。
これらの結果から、ASMEgressTrafficPolicy が期待どおりに機能していることが確認できます。
-
オプション 2:サイドカーとエグレスゲートウェイ間の HTTPS 通信
-
ASMEgressTrafficPolicy を作成します。
コンソール
-
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
-
ゲートウェイ名をクリックして [ゲートウェイ概要] ページを開きます。左側のナビゲーションウィンドウで、Outbound Traffic Policy をクリックします。
エグレストラフィックルールページで、[ルールを追加] をクリックし、ルールパラメーターを構成します。[名前空間] を
mytestに設定します。[ワークロードラベル] については、ラベル名をappに、ラベル値をsleep-aに設定します。[外部サービス名] をhttpbin-service-httpsに設定します。www.httpbin.orgとhttpbin.orgを [ドメインリスト] に追加します。[サービスポート] については、ポートを443に、ポート名をhttpsに、[プロトコル] を HTTPS に設定します。[アクセス方法] については、[エグレスゲートウェイポート経由] を選択し、ポートを444に設定します。
Kubectl
-
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 -
ACK クラスターで、次のコマンドを実行して ASMEgressTrafficPolicy リソースを作成します:
kubectl apply -f egress-by-egressgateway.yaml
-
-
ASMEgressTrafficPolicy の構成を検証します。
-
mytest 名前空間の sleep-a サービスを検証します。
-
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へのアクセスに失敗したことを示します。 -
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にアクセスできることを示します。
-
-
default 名前空間の Nginx サービスを検証します。
-
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へのアクセスに失敗したことを示します。 -
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へのアクセスに失敗したことを示します。 -
接続が拒否された理由を特定するために、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に転送され、接続が拒否されたことを示しています。
-
-
egress-by-egressgateway を削除するために次のコマンドを実行し、再度 mytest 名前空間の sleep-a サービスから
http://www.httpbin.orgとhttps://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.orghttp://www.httpbin.orgへのリクエストは502を返し、https://www.httpbin.orgへのリクエストは拒否されます。ASMEgressTrafficPolicy 構成が削除された後、sleep-a サービスはhttp://www.httpbin.orgまたはhttps://www.httpbin.orgにアクセスできなくなります。これらの結果から、ASMEgressTrafficPolicy が期待どおりに機能していることが確認できます。
-
sleep-a サービスから外部 TCP サービスへのアクセス
-
ASMEgressTrafficPolicy を作成します。
コンソール
-
ASM コンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
-
ゲートウェイ名をクリックします。 [Gateway overview] ページで、左側のナビゲーションウィンドウの Outbound Traffic Policy をクリックします。 次の図のようにポリシーを設定します。

kubectl
-
次の内容で 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 -
ACK クラスターで次のコマンドを実行して、ASMEgressTrafficPolicy リソースを作成します。
kubectl apply -f egress-by-egressgateway.yaml
-
-
ASMEgressTrafficPolicy の設定が適用されたことを検証します。
-
mytest 名前空間の sleep-a サービスを検証します。
-
次のコマンドを実行して、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へのアクセスに失敗したことを示します。 -
次のコマンドを実行して、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へのアクセスに成功したことを示します。
-
-
デフォルトの名前空間で Nginx サービスを検証します。
-
次のコマンドを実行して、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へのアクセスに失敗したことを示します。 -
次のコマンドを実行して、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へのアクセスに失敗しました。 -
次のコマンドを実行して、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にルーティングされ、接続が拒否されたことを示しています。
-
-
次のコマンドを実行して egress-by-egressgateway を削除し、mytest 名前空間の sleep-a サービスから再度
http://www.alibabacloud.comとhttps://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.comhttp://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 リクエストは影響を受けません。