ご利用のメッシュ内のアプリケーションが外部サービスと通信する必要がある場合、エグレスゲートウェイを一元化された出口ポイントとして使用し、すべてのアウトバウンドトラフィックを管理できます。エグレスゲートウェイを設定することで、セキュリティコントロールとルーティングポリシーを適用し、アプリケーションのセキュリティと可観測性を向上させることができます。
この記事を読む前に、「ASMEgressTrafficPolicy を使用したエグレストラフィックの管理」の内容をよく理解しておいてください。この記事では、サービスメッシュリソースを使用して、クラスター外のサービスへのリクエストを透過的にインターセプトし、エグレスゲートウェイにリダイレクトします。その後、エグレスゲートウェイはセキュリティポリシーを適用し、リクエストをクラスター外のサービスに送信します。この設定は比較的複雑です。「ASMEgressTrafficPolicy を使用したエグレストラフィックの管理」の内容で要件を満たせない場合は、この記事をご参照ください。
前提条件
設定手順

ステップ 1:サンプルアプリケーションのデプロイ
-
sleep アプリケーションをデプロイします。
-
次の内容で sleep.yaml という名前のファイルを作成します。
-
ご利用の ACK クラスターの KubeConfig を使用して、次のコマンドを実行し、sleep アプリケーションをデプロイします。
kubectl を使用してクラスターを管理する方法の詳細については、「クラスターの KubeConfig を取得し、kubectl を使用してクラスターに接続する」をご参照ください。
kubectl apply -f sleep.yaml
-
-
次のコマンドを実行して、sleep Pod でシェルを開き、外部サービスにアクセスします。
`kubectl get pod -n default` コマンドを実行すると、sleep Pod の名前を確認できます。
kubectl exec -it ${sleep-pod-name} -- /bin/sh curl aliyun.com -I出力例:
HTTP/1.1 301 Moved Permanently server: envoy date: Thu, 14 Dec 2023 03:05:41 GMT content-type: text/html content-length: 239 location: https://aliyun.com/ eagleeye-traceid: 0b57ff8717025231418255220e**** timing-allow-origin: * x-envoy-upstream-service-time: 69301応答は、メッシュ内のアプリケーションが外部サービスにアクセスできることを示します。デフォルトでは、Pod はアクセスに HTTP を使用し、サイトはリダイレクトを返します。説明この方法ではセキュリティコントロールが提供されず、メッシュの可観測性機能を使用できません。次の手順で説明するように、`REGISTRY_ONLY` を有効にして登録済みサービスへのアクセスを制限し、エグレスゲートウェイをトラフィックの統一された出口ポイントとして使用することを推奨します。
(任意) ステップ 2:REGISTRY_ONLY の有効化
ASM のデフォルトのアウトバウンドトラフィックポリシーは `ALLOW_ANY` です。これを `REGISTRY_ONLY` に変更することを推奨します。このモードでは、サイドカープロキシは、メッシュ内に対応する ServiceEntry がない外部ホストへのアクセスをブロックします。この設定により、アプリケーションのセキュリティが向上します。
-
`REGISTRY_ONLY` を有効にしても、外部サービス用の ServiceEntry を作成していない場合、そのサービスへのアクセスは拒否されます。
-
`REGISTRY_ONLY` を有効にせず、ServiceEntry を作成していない場合でも外部サービスにアクセスできますが、エグレスゲートウェイの設定は有効になりません。
-
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
-
Configure the agent parameters of the injected Sidecar ページで、global タブをクリックし、Outbound Traffic Policy をクリックし、Outbound Traffic Policy を [REGISTRY_ONLY] に設定してから、Update Settings をクリックします。
-
次のコマンドを実行して、sleep Pod でシェルを開き、外部サービスにアクセスします。
kubectl exec -it ${sleep-pod-name} -- /bin/sh curl aliyun.com -I出力例:
HTTP/1.1 502 Bad Gateway date: Thu, 14 Dec 2023 03:08:46 GMT server: envoy transfer-encoding: chunked502応答は、メッシュ内のアプリケーションが未登録の外部サービスにアクセスできないことを示します。
ステップ 3:外部サービス用の ServiceEntry の作成
エグレスゲートウェイを介してクラスター外のサービスにアクセスするには、外部サービス用の ServiceEntry を作成する必要があります。
-
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。表示されたページで、[YAML から作成] をクリックします。
-
Create ページで、sleep アプリケーションが存在する Namespaces を選択し、Scenario Template に [メッシュ外部サービスへのアクセス] を選択し、次の例のように YAML を設定してから、Create をクリックします。
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: external-svc-http spec: hosts: - aliyun.com location: MESH_EXTERNAL ports: - number: 80 name: http protocol: HTTP resolution: DNS -
次のコマンドを実行して、sleep Pod でシェルを開き、外部サービスにアクセスします。
kubectl exec -it ${sleep-pod-name} -- /bin/sh curl aliyun.com -I`301` 応答は、アプリケーションが外部サービスにアクセスできるようになったことを示します。メッシュ内で aliyun.com を ServiceEntry で登録したため、アクセスが許可されます。この時点では、アウトバウンドトラフィックはまだ Pod から直接送信されており、エグレスゲートウェイを経由していません。
ステップ 4:エグレスゲートウェイ経由でのトラフィックのルーティング
aliyun.com の ServiceEntry を作成したので、VirtualService や Gateway などのリソースを使用して、aliyun.com へのトラフィックを管理できます。
-
ポート 80 で HTTP トラフィックをリッスンするエグレスゲートウェイを作成します。詳細については、「エグレスゲートウェイの作成」をご参照ください。
-
次のように Gateway リソースを作成します。詳細については、「Istio ゲートウェイの管理」をご参照ください。
Gateway の作成ページで、[名前空間] を `default` に、[名前] を `egress-gw` に設定します。[ゲートウェイインスタンス] エリアで、[ラベルキー] を `istio` に、[ラベル値] を `egressgateway` に設定します。[公開サービス] エリアで、サービスの [名前] を `http` に、[ポート] を `80` に、[プロトコル] を [HTTP] に、[サービスドメイン] を `aliyun.com` に設定します。その後、[作成] をクリックします。
-
次の YAML を使用して VirtualService を作成します。詳細については、「VirtualService の管理」をご参照ください。
-
外部サービスへのアクセスをテストします。
-
次のコマンドを実行して、sleep Pod でシェルを開き、外部サービスにアクセスします。
kubectl exec -it ${sleep-pod-name} -- /bin/sh curl aliyun.com -I301の応答は、アプリケーションが引き続き外部サービスにアクセスできることを示します。 アプリケーションは、Pod からサービスに直接アクセスする代わりに、エグレスゲートウェイを介してトラフィックをルーティングするようになりました。 -
次のコマンドを実行して、ゲートウェイ Pod のアクセスログを確認します。
説明-
エグレスゲートウェイに複数のレプリカがある場合、アクセスログはいずれかのレプリカに表示される可能性があります。各ゲートウェイ Pod を確認してエントリを見つける必要がある場合があります。
-
エグレスゲートウェイのアクセスログを有効にしている場合は、Simple Log Service コンソールでアクセスレコードを表示することもできます。
kubectl -n istio-system logs ${egress-gateway-pod-name} -c istio-proxy | grep aliyun.com | tail -n 1出力例:
{"trace_id":null,"upstream_host":"106.11.XXX.XX:80","downstream_remote_address":"10.34.0.140:47942","requested_server_name":null,"response_code":301,"upstream_service_time":"24","user_agent":"curl/7.86.0-DEV","path":"/","route_name":null,"bytes_sent":0,"response_flags":"-","upstream_local_address":"10.34.0.141:60388","duration":24,"upstream_cluster":"outbound|80||aliyun.com","upstream_transport_failure_reason":null,"authority":"aliyun.com","request_id":"55789d59-9b81-4e39-b64a-66baf44e****","protocol":"HTTP/1.1","bytes_received":0,"method":"HEAD","downstream_local_address":"10.34.0.141:80","start_time":"2022-11-30T08:03:01.315Z","istio_policy_status":null,"x_forwarded_for":"10.34.0.140"}`downstream_remote_address` フィールドには、sleep Pod の IP アドレスが表示されます。
これらの手順を完了すると、外部サービスへのすべてのアウトバウンドトラフィックがエグレスゲートウェイ経由でルーティングされます。
-
-
関連ドキュメント
-
エグレスゲートウェイで ASM の可観測性およびセキュリティ機能を使用して、エグレストラフィックをより効率的に管理できます。詳細については、「可観測性機能」および「セキュリティサポートと動的証明書読み込み」をご参照ください。
-
ASMEgressTrafficPolicy CRD を使用して、エグレスゲートウェイを介した外部トラフィックの管理方法とアクセス方法をカスタマイズできます。詳細については、「ASMEgressTrafficPolicy を使用したエグレストラフィックの管理」をご参照ください。
-
ゲートウェイ機能の詳細については、「ASM ゲートウェイの概要」をご参照ください。