バージョン 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 を組み合わせることで、エグレス トラフィックをより柔軟に制御できます。
この例のトラフィック パスは、次の 2 つのタイプに分類できます。
1. サイドカー プロキシ間およびサイドカー プロキシとゲートウェイ間の通信:デフォルトでは、相互トランスポート層セキュリティ(mTLS)が通信に対して有効になっており、証明書は ASM によって管理されます。
2. アプリケーションとサイドカー プロキシ間、およびゲートウェイと外部サービス間の通信:
a. ASM の高度なレイヤー 7 機能が適切に機能するように、アプリケーションとサイドカー プロキシは可能な限りプレーンテキストで通信します。このようにして、サイドカー プロキシはトラフィックのレイヤー 7 情報を取得し、より高度な機能をサポートできます。特別な理由により、アプリケーションが HTTPS リクエストを直接送信する必要がある場合は、ASM のレイヤー 4 機能のみを使用できます。
b. エグレス ゲートウェイと外部サービス間の通信プロトコルをプレーンテキストまたは HTTPS のいずれかに構成できます。
前提条件
商用エディション(Enterprise Edition または Ultimate Edition)の ASM インスタンスが作成されていること。インスタンスのバージョンは 1.16.4 以降です。詳細については、「ASM インスタンスを作成する」をご参照ください。インスタンスのアップグレードについては、「ASM インスタンスをアップグレードする」をご参照ください。
デフォルトの名前空間で自動サイドカー挿入が有効になっていること。詳細については、「自動サイドカー プロキシ挿入を有効にする」をご参照ください。
準備
ASM インスタンスのエグレス トラフィック ポリシーを設定する
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[グローバル] タブで、[アウトバウンドトラフィックポリシー] をクリックし、レジストリのみ[外部アクセスポリシー] の右側にある [設定の更新] をクリックし、 をクリックします。
名前空間を作成する
istio-egress 名前空間を作成します。詳細については、「グローバル名前空間を管理する」をご参照ください。
[グローバル名前空間] ページで、[kubernetes クラスタへの自動サイドカー挿入の同期] をクリックして、名前空間を ASM インスタンスによって管理される ACK クラスタに同期します。
エグレス ゲートウェイを作成する
ASM で egressgateway-a という名前のエグレス ゲートウェイを作成し、[ポートマッピング] を HTTP 80、HTTPS 443、HTTPS 444 に設定し、[双方向 TLS 認証のサポート] を有効にします。詳細については、「エグレス ゲートウェイを作成する」をご参照ください。
生成された 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 プレーンテキストを使用する
このソリューションは、実際の環境では合理的ではありません。サイドカー コンテナとエグレス ゲートウェイ間の HTTP プレーンテキストでの通信は、クライアント認証が利用できない可能性があります。現在、ASMEgressTrafficPolicy は HTTP プレーンテキストを使用してエグレス ゲートウェイにアクセスすることをサポートしていません。
トラフィック管理はクライアント側のサイドカー プロキシで実装され、エグレス ゲートウェイは必要ありません。
可観測性はエグレス ゲートウェイに依存しません。
セキュリティ機能はエグレス ゲートウェイに依存します。ただし、mTLS がない場合、クライアント ID に基づくすべての認証機能は使用できません。この場合、エグレス ゲートウェイはすべての要求を無差別に拒否することしかできません。
(推奨)ソリューション 2:サイドカー プロキシとエグレス ゲートウェイ間の通信に mTLS を使用する
エグレス トラフィック ポリシーを作成します。
コンソールから構成する
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
ゲートウェイ名をクリックして [ゲートウェイの概要] ページに移動します。左側の [アウトバウンドトラフィックポリシー] をクリックします。次の図に示すようにパラメータを構成します。

kubectl から構成する
次の内容を含む 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)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へのアクセスが失敗したことを示します。
出力は、エグレス トラフィック ポリシーが有効になっていることを示しています。
sleep-a サービスを使用して HTTPS 経由で外部サービスにアクセスする
(推奨)ソリューション 1:サイドカープロキシとエグレスゲートウェイ間の通信に mTLS を使用する
エグレス トラフィック ポリシーを作成します。
コンソールで構成する
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
ゲートウェイ名をクリックして [ゲートウェイの概要] ページに入り、左側の [アウトバウンド トラフィック ポリシー] をクリックします。次の図に示すようにパラメータを構成します。

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-{エグレスゲートウェイの名前} です。この値は、エグレスゲートウェイの名前に対応しています。 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)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のanythingAPI をリクエストし、エグレスゲートウェイが 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に再びアクセスします。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の両方へのアクセスが失敗します。
出力は、エグレス トラフィック ポリシーが有効になっていることを示しています。
ソリューション 2:サイドカープロキシとエグレスゲートウェイ間の通信に HTTPS を使用する
エグレス トラフィック ポリシーを作成します。
コンソール インターフェースで構成する
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
ゲートウェイ名をクリックして [ゲートウェイの概要] ページに入り、左側の [アウトバウンド トラフィック ポリシー] をクリックします。次の図に示すようにパラメータを構成します。

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-{エグレスゲートウェイの名前} です。この値は、エグレスゲートウェイの名前に対応しています。 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 ポート。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のanythingAPI をリクエストし、エグレスゲートウェイが 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.orgkubectl -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の両方へのアクセスが失敗します。
出力は、エグレス トラフィック ポリシーが有効になっていることを示しています。
sleep-a サービスを使用して TCP 経由で外部サービスにアクセスする
エグレス トラフィック ポリシーを作成します。
コンソールから構成する
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
ゲートウェイ名をクリックして [ゲートウェイの概要] ページに入り、左側の [アウトバウンド トラフィック ポリシー] をクリックします。次の図に示すようにパラメーターを構成します。

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: TCPACK クラスタで、次のコマンドを実行して 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へのアクセスが成功したことを示します。
default 名前空間の 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の両方へのアクセスが失敗します。出力は、エグレス トラフィック ポリシーが有効になっていることを示しています。
関連操作
指定された名前空間から送信された 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 リクエストは影響を受けません。