バージョン 1.16.4 以降、Alibaba Cloud Service Mesh (ASM) は ASMEgressTrafficPolicy カスタムリソース定義 (CRD) をサポートしています。 この記事では、この 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 インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
グローバル タブで、外部サービスアクセスポリシー をクリックします。次に、外部サービスへのアクセスポリシー OutboundTrafficPolicy の右側で [REGISTRY_ONLY] をクリックし、次に 設定項目の更新 をクリックします。
名前空間の作成
istio-egress 名前空間を作成します。 詳細については、「グローバル名前空間の管理」をご参照ください。
グローバル名前空間 ページで、自動インジェクションの同期 をクリックして、名前空間を ASM インスタンスが管理する ACK クラスターと同期します。
エグレスゲートウェイの作成
ASM で、egressgateway-a という名前のエグレスゲートウェイを作成します。ポートマッピング で、ポート 80 に HTTP を、ポート 443 と 444 に HTTPS を設定します。次に、双方向 TLS 認証 を有効にします。詳細については、「エグレスゲートウェイサービスを作成する」をご参照ください。
生成された YAML ファイルの spec フィールドに次の内容が含まれていることを確認してください:
spec:
podLabels:
security.istio.io/tlsMode: istioサンプルアプリケーションの作成
ASM インスタンスで、mytest という名前の名前空間を作成し、自動サイドカーインジェクションを有効にします。 詳細については、「グローバル名前空間の管理」をご参照ください。
ACK クラスターで、mytest 名前空間に sleep-a サービスを、デフォルト名前空間に 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 インスタンスの名前をクリックし、左側のナビゲーションウィンドウで を選択します。
ゲートウェイ名をクリックして、[ゲートウェイ概要] ページに移動します。左側のナビゲーションウィンドウで、エグレストラフィックポリシー をクリックします。
エグレストラフィックポリシールールを設定します。 [エグレスゲートウェイ] を
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 # トラフィックパス: サイドカー -> ゲートウェイ (ポート 80) -> サービス (httpbin.org、ポート 80)ACK クラスターで、次のコマンドを実行して ASMEgressTrafficPolicy リソースを作成します。
kubectl apply -f egress-by-egressgateway.yaml
-
ASMEgressTrafficPolicy が有効になっていることを確認します。
次のコマンドを実行して、デフォルト名前空間の 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 インスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
ゲートウェイ名をクリックして、ゲートウェイの概要ページを開きます。左側のナビゲーションウィンドウで、エグレストラフィックポリシー をクリックします。
エグレストラフィックルールを設定します。 [クラスター内サービス] セクションで、[名前空間] を [mytest] に、[ラベル名] を
appに、[ラベル値] をsleep-aに設定します。 [外部サービス] セクションで、[外部サービス名] をhttpbin-service-httpに設定し、www.httpbin.orgとhttpbin.orgを[ドメインリスト] に追加し、[サービスポート] を [ポート:80]、[ポート名:http]、[プロトコル:HTTP] で設定します。 [アクセス方法] セクションで、[エグレスゲートウェイポート] を [80] に、[HTTPS にアップグレード] を [はい] に、[HTTPS ポート] を [443] に設定します。
Kubectl
egress-by-egressgateway.yaml ファイルを次の内容で更新します。
httpsUpgrade フィールドと、
https://www.httpbin.orgへのアクセスに関する関連定義が spec フィールドに追加されます。 フィールドの説明については、「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 # サイドカー -> ゲートウェイのポート 80 -> サービスのポート 80 (httpbin.org) httpsUpgrade: enabled: true # enabled が false に設定されている場合、httpsUpgrade のポート設定は効果がありません 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の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にアクセスできることを示します。
デフォルト名前空間の 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 インスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
ゲートウェイ名をクリックして、[ゲートウェイ概要] ページを開きます。左側のナビゲーションウィンドウで、エグレストラフィックポリシー をクリックします。
エグレストラフィックルールページで、[ルールを追加] をクリックし、ルールパラメーターを設定します。 [名前空間] を
mytestに設定します。 [ワークロードラベル] については、ラベル名をappに、ラベル値をsleep-aに設定します。 [外部サービス名] をhttpbin-service-httpsに設定します。www.httpbin.orgとhttpbin.orgを[ドメインリスト] に追加します。 [サービスポート] については、ポートを443に、ポート名をhttpsに、[プロトコル] を HTTPS に設定します。 [アクセス方法] については、[エグレスゲートウェイポート経由] を選択し、ポートを444に設定します。
Kubectl
egress-by-egressgateway.yaml ファイルを次の内容で更新します。
httpsUpgrade フィールドと、
https://www.httpbin.orgに直接アクセスするための定義が spec フィールドに追加されます。 フィールドの説明については、「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 ポート 444ACK クラスターで、次のコマンドを実行して 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にアクセスできることを示します。
デフォルト名前空間の 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 インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
ゲートウェイ名をクリックします。ゲートウェイの概要 ページで、左側のナビゲーションウィンドウのエグレストラフィックポリシーをクリックします。
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へのアクセスに成功したことを示します。
デフォルト名前空間の 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 ワークロードのサイドカーのアクセスログを検査し、接続が拒否された理由を理解します。
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 リクエストは影響を受けません。