本トピックでは、Service Mesh (ASM) エグレスゲートウェイを用いて外部の LLM サービスにアクセスする方法について説明します。この方法は、クライアントがクラスター内に実行されており、サイドカープロキシが注入済みであるシナリオに最適です。
前提条件
-
ACK クラスターがバージョン 1.22 以降のASM インスタンスに追加されています。
-
サイドカーインジェクションポリシーが設定されています。
-
Ingress Gateway が作成されました。
-
sleep サンプルアプリケーションがデプロイ済みです。詳細については、「sleep テストアプリケーションの作成」をご参照ください。
-
Alibaba Cloud Model Studio を有効化し、有効な API キーを取得していること。
概要
エグレスゲートウェイを使用しない場合、クライアントからのリクエストはサイドカープロキシによってキャッチされ、その後 LLM サービスプロバイダーに転送されます。サイドカーはクライアントと同じ Pod 内にデプロイされるため、API キーの漏洩や不正アクセスといったセキュリティリスクが発生します。これらのリスクが懸念される場合は、エグレスゲートウェイの使用を強く推奨します。
ASM エグレスゲートウェイをリクエストパスに導入することで、セキュリティが強化されます。エグレスゲートウェイはクライアントとは独立してデプロイされるため、ACK クラスターの RBAC 機構を活用してゲートウェイ管理権限を制限できます。また、API キーは動的に注入され、認証および権限付与ポリシーがエグレスゲートウェイで適用されるため、ASM ゲートウェイが提供する包括的なセキュリティ機能を活用できます。
以下に、本トピックで使用するリクエストパスを示します。
ステップ 1:エグレスゲートウェイおよびゲートウェイの作成
-
エグレスゲートウェイを作成し、ポート 80 を設定して相互 TLS (mTLS) 認証を有効化します。詳細については、「エグレスゲートウェイの作成」をご参照ください。
-
以下の内容で
egress-gw.yamlという名前のファイルを作成します。apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: egress-gw namespace: istio-system spec: selector: istio: egressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTPS tls: mode: ISTIO_MUTUAL -
ASM インスタンスの kubeconfig を使用して、以下のコマンドを実行し、ゲートウェイを作成します。
kubectl apply -f egress-gw.yaml
ステップ 2:ゲートウェイスコープの LLMProvider の作成
LLMProvider をエグレスゲートウェイにスコープ指定することで、API キーがエグレスゲートウェイのメモリ内でのみ格納され、クライアントからはアクセスできないようになります。
-
以下の内容で
dashscope-qwen.yamlという名前のファイルを作成します。apiVersion: istio.alibabacloud.com/v1beta1 kind: LLMProvider metadata: name: dashscope-qwen namespace: istio-system spec: workloadSelector: labels: istio: egressgateway host: dashscope.aliyuncs.com path: /compatible-mode/v1/chat/completions configs: defaultConfig: openAIConfig: model: qwen1.5-72b-chat # Qwen オープンソース大規模言語モデルシリーズ stream: false apiKey: ${API_KEY} -
以下のコマンドを実行して、LLMProvider を作成します。
kubectl apply -f dashscope-qwen.yaml
ステップ 3:LLMRoute の作成
-
トラフィックをエグレスゲートウェイにルーティングするため、以下の内容で
dashscope-route.yamlという名前のファイルを作成します。apiVersion: istio.alibabacloud.com/v1beta1 kind: LLMRoute metadata: name: dashscope-route spec: host: dashscope.aliyuncs.com gateways: - mesh - istio-system/egress-gw rules: - name: mesh-route # サイドカーが dashscope.aliyuncs.com へのリクエストを受信した後、リクエストをエグレスゲートウェイに転送します。 matches: - gateways: - mesh backendRefs: - providerHost: istio-egressgateway.istio-system.svc.cluster.local - name: egress-gw-route # エグレスゲートウェイが dashscope.aliyuncs.com へのリクエストを受信した後、リクエストを実際のプロバイダーに転送します。 matches: - gateways: - istio-system/egress-gw backendRefs: - providerHost: dashscope.aliyuncs.com -
以下のコマンドを実行して、LLMRoute を作成します。
kubectl apply -f dashscope-route.yaml
ステップ 4:構成のテスト
ACK クラスターの kubeconfig を使用して、以下のコマンドを実行し、構成をテストします。
kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' --header 'Content-Type: application/json' --data '{
"messages": [
{"role": "user", "content": "自分について教えてください"}
]
}'
期待される出力:
{"choices":[{"message":{"role":"assistant","content":"私は Alibaba Cloud が提供する大規模言語モデルであり、名前は Qwen です。主な機能は、ユーザーの質問に回答したり、情報を提供したり、会話をすることです。自然言語でユーザーの質問を理解し、それに応じた回答や提案を生成できます。また、新しい知識を学習し、さまざまなシナリオに応用することも可能です。何かご質問やお手伝いが必要な場合は、いつでもお知らせください。全力でサポートいたします。"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":3,"completion_tokens":72,"total_tokens":75},"created":1720680044,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-1c33b950-3220-9bfe-9066-xxxxxxxxxxxx"}
ステップ 5:権限付与ポリシーの構成
-
以下の内容で
authpolicy.yamlという名前のファイルを作成します。apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: test namespace: istio-system spec: action: DENY rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep to: - operation: hosts: - dashscope.aliyuncs.com selector: matchLabels: istio: egressgateway -
ASM の kubeconfig を使用して、以下のコマンドを実行し、権限付与ポリシーを適用します。
kubectl apply -f authpolicy.yaml -
ステップ 4 のコマンドを再度実行します。
期待される出力:
RBAC: access deniedリクエストは拒否されます。
ASM ゲートウェイは、LLM リクエストに対しても通常の HTTP リクエストと同様のセキュリティ機能(権限付与ポリシー、JWT 認証、カスタム権限付与サービスなど)を提供します。これらのポリシーをエグレスゲートウェイで適用することで、アプリケーションのセキュリティをより効果的に強化できます。