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

手順 1:サンプルアプリケーションをデプロイする
sleep アプリケーションをデプロイします。
以下の内容を使用して sleep.yaml を作成します。
ACK クラスターの KubeConfig 環境で、次のコマンドを実行して sleep アプリケーションをデプロイします。
kubectl を使用してクラスターを管理する方法の詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
kubectl apply -f sleep.yaml
sleep アプリケーションが存在するポッドから次のコマンドを実行して、外部サービスにアクセスします。
kubectl get pod -n defaultコマンドを実行して、sleep アプリケーションポッドの名前を表示できます。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 が返された場合は、ASM インスタンス内のアプリケーションが外部サービスにアクセスできることを示します。この場合、HTTP アクセスリクエストはデフォルトで開始されます。Web サーバーは 301 応答を返して、リクエストをリダイレクトします。
説明デフォルトでは、ASM は ALLOW_ANY ポリシーを使用して、ASM インスタンス内のアプリケーションがすべての外部サービスにアクセスできるようにします。この場合、権限制御を実装したり、ASM が提供する可観測性機能を使用したりすることはできません。ポリシーを REGISTRY_ONLY に変更して、ASM インスタンス内のアプリケーションが特定の外部サービスのみにアクセスできるようにし、出口ゲートウェイを使用してすべての送信トラフィックをルーティングすることをお勧めします。
(オプション)手順 2:外部サービスへのアクセス ポリシーを REGISTRY_ONLY に設定する
デフォルトでは、ASM は外部サービスへのアクセスに ALLOW_ANY ポリシーを使用します。ポリシーを REGISTRY_ONLY に変更することをお勧めします。ポリシーを REGISTRY_ONLY に変更すると、サイドカープロキシは、ASM インスタンスでサービスエントリが定義されていない外部ホストへのアクセスを拒否します。これにより、ASM インスタンス内のアプリケーションのセキュリティが保証されます。
REGISTRY_ONLY を有効にしていても、サービスエントリを作成していない場合は、外部サービスへのアクセスは拒否されます。
REGISTRY_ONLY を有効にしておらず、サービスエントリを作成していない場合は、サービスにアクセスできますが、設定された出口ゲートウェイは有効になりません。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[サイドカープロキシ設定] ページで、[グローバル] タブをクリックし、[送信トラフィックポリシー] をクリックし、[外部アクセス ポリシー] を [REGISTRY_ONLY] に設定して、[設定の更新] をクリックします。
sleep アプリケーションが存在するポッドから次のコマンドを実行して、外部サービスにアクセスします。
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 エラーコードが返されます。これは、ASM インスタンス内のアプリケーションが、ASM インスタンスのサービスレジストリに定義されていない外部サービスにアクセスできないことを示します。
手順 3:サービスエントリを作成して外部サービスを定義する
ASM インスタンス内のアプリケーションが出口ゲートウェイを使用して外部サービスにアクセスできるように、サービスエントリを作成して外部サービスを定義する必要があります。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、sleep アプリケーションが存在する [名前空間] を選択し、[access Mesh External Services] を [テンプレート] に選択し、YAML の例を構成して、[作成] をクリックします。次の YAML ファイルは例を示しています。
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: DNSsleep アプリケーションが存在するポッドから次のコマンドを実行して、外部サービスにアクセスします。
kubectl exec -it ${sleep pod name} -- /bin/sh curl aliyun.com -I301が返された場合は、ASM インスタンス内のアプリケーションが外部サービスにアクセスできることを示します。aliyun.com ドメイン名は ASM インスタンスのサービスレジストリで定義されているため、ASM インスタンス内のアプリケーションはこの外部サービスにアクセスできます。この場合、sleep アプリケーションが存在するポッドは、アクセスリクエストを外部サービスに直接送信し、リクエストは出口ゲートウェイを通過しません。
手順 4:出口ゲートウェイを使用して、外部サービスにアクセスするすべてのリクエストをルーティングする
ASM インスタンスのサービスエントリで aliyun.com ドメイン名を定義しました。したがって、仮想サービスと Istio ゲートウェイを設定して、aliyun.com へのトラフィックを管理できます。
出口ゲートウェイを作成し、ポート 80 で HTTP トラフィックを許可するように設定します。詳細については、「出口ゲートウェイを作成する」をご参照ください。
Istio ゲートウェイを作成し、次の図に示されているように関連パラメーターを設定します。詳細については、「Istio ゲートウェイを管理する」をご参照ください。

次の YAML コードを使用して、仮想サービスを作成します。詳細については、「仮想サービスを管理する」をご参照ください。
外部サービスにアクセスして、設定を確認します。
sleep アプリケーションが存在するポッドから次のコマンドを実行して、外部サービスにアクセスします。
kubectl exec -it ${sleep pod name} -- /bin/sh curl aliyun.com -I301 が返された場合は、ASM インスタンス内のアプリケーションが外部サービスにアクセスできることを示します。この場合、ASM インスタンス内のアプリケーションは、アプリケーションが存在するポッドから外部サービスに直接アクセスしません。代わりに、アプリケーションは出口ゲートウェイを介して外部サービスにアクセスします。
次のコマンドを実行して、ゲートウェイポッドのアクセスログを表示します。
説明出口ゲートウェイポッドに複数のレプリカがある場合、アクセスログはそれらのいずれかで生成されます。アクセスログを見つけるには、これらのポッドレプリカでこのコマンドを 1 つずつ実行する必要があります。
出口ゲートウェイのアクセスログ機能を有効にしている場合は、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 アプリケーションが存在するポッドの IP アドレスを示します。設定が完了すると、指定された外部サービスへのアクセスリクエストは出口ゲートウェイを通過します。ASM が提供する可観測性とセキュリティ機能を使用して、出口ゲートウェイの送信トラフィックを効率的に管理できます。
参考資料
ASM が提供する可観測性とセキュリティ機能を使用して、出口ゲートウェイの送信トラフィックをより効率的に管理できます。詳細については、「可観測性」および「トラフィックセキュリティと動的証明書のロード」をご参照ください。
ASMEgressTrafficPolicy CustomResourceDefinition (CRD) フィールドを使用して、出口ゲートウェイを使用して送信トラフィックを管理する方法をカスタマイズできます。詳細については、「送信トラフィックポリシーを使用して送信トラフィックを管理する」をご参照ください。
ゲートウェイの機能の詳細については、「ASM ゲートウェイの概要」をご参照ください。