Container Service for Kubernetes (ACK) クラスター内の Model Context Protocol (MCP) サービスを外部の大規模言語モデル (LLM) の呼び出しに公開するには、ack-agent-gateway 拡張機能をインストールします。この拡張機能は Gateway API に基づいており、MCP トラフィックを迅速かつ安全にルーティングできます。
シナリオ
バージョン 1.32 以降を実行する ACK マネージドクラスター。
クラスターにバージョン 1.3.0 以降を実行する Gateway API コンポーネントがインストールされていること。
ack-agent-gateway のインストール
ack-agent-gateway は、Gateway API 標準を実装するゲートウェイコンポーネントです。Gateway API の標準化されたトラフィック管理モデルを使用して、MCP サービストラフィックを簡単に設定および管理するのに役立ちます。
ACK クラスターページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
Helm ページで、作成 をクリックします。[Chart] セクションで、ack-agent-gateway を検索して選択します。デフォルト設定のまま、次 をクリックします。
デフォルトでは、コンポーネントは ack-agent-gateway 名前空間にインストールされます。アプリケーションはコンポーネント名を使用して公開されます。
値 ページで、最新の Chart バージョンを選択し、OK をクリックします。
インストールが完了したら、Helm ページでコンポーネントを表示できます。コンポーネントのステータスは デプロイ済み です。
ステップ 1: サンプル MCP サービスのデプロイ
このステップでは、公式のサンプル MCP サービスをデプロイします。このサービスは後でゲートウェイの機能を検証するために使用できます。
次の内容で
mcp-server.yamlという名前のファイルを作成します。この YAML ファイルは、default名前空間にサンプルサービスをデプロイするためのDeploymentとServiceを定義します。apiVersion: apps/v1 kind: Deployment metadata: name: demo-mcp spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: demo-mcp template: metadata: labels: app.kubernetes.io/name: demo-mcp spec: containers: - image: registry-cn-hangzhou.ack.aliyuncs.com/dev/sample-mcp-server-fetch:v0.2.0 imagePullPolicy: IfNotPresent name: mcp ports: - containerPort: 8000 name: server protocol: TCP --- apiVersion: v1 kind: Service metadata: name: demo-mcp-server spec: ports: - name: server port: 8000 protocol: TCP targetPort: 8000 selector: app.kubernetes.io/name: demo-mcp sessionAffinity: None type: ClusterIPサンプル MCP サービスをデプロイします。
kubectl apply -f mcp-server.yamlPod のステータスを確認します。
kubectl get pod -l app.kubernetes.io/name=demo-mcp期待される出力:Pod が
Running状態であることを確認します。NAME READY STATUS RESTARTS AGE demo-mcp-58fddf4cd9-8jvzn 1/1 Running 0 3s
ステップ 2: Gateway とルーティングルールの作成
このステップでは、デプロイされた MCP サービス用のゲートウェイエントリを作成します。これを行うには、Gateway、HTTPRoute、および ack-agent-gateway のカスタムリソース定義 (CRD) である Backend を使用します。
Backend(CRD):標準の Gateway API バックエンドリファレンス (backendRef) では、ストリーマブル HTTP などの特定の MCP プロトコルプロパティを詳細に記述できません。この問題を解決するために、ack-agent-gateway は `Backend` CRD を導入しています。この CRD は Gateway API の機能を拡張し、バックエンドサービスのプロトコルタイプとアクセスパスをより正確に定義できます。Gateway:トラフィックエントリポイントを定義します。リスナーポートとプロトコルを指定し、その実装としてack-agent-gatewayを関連付けます。HTTPRoute:GatewayからカスタムのBackendリソースにリクエストを転送するトラフィックルーティングルールを定義します。
次の内容で
mcp-gateway.yamlという名前のファイルを作成します。# MCP バックエンドサービスの詳細を定義 apiVersion: agentgateway.alibabacloud.com/v1alpha1 kind: Backend metadata: name: test-mcp spec: type: MCP # バックエンドタイプを MCP として定義 mcp: targets: - name: mcp-target # Target の一意の識別子 static: # バックエンド Kubernetes Service の FQDN host: demo-mcp-server.default.svc.cluster.local # MCP サービスのプロトコルパス path: /mcp port: 8000 # MCP が使用するトランスポートプロトコルを定義。ここではストリーマブル HTTP protocol: StreamableHTTP --- # ゲートウェイインスタンスをトラフィックエントリポイントとして定義 apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: test-mcp-gateway spec: gatewayClassName: ack-agent-gateway # ゲートウェイコントローラーとして ack-agent-gateway を指定 listeners: - name: http port: 80 protocol: HTTP allowedRoutes: namespaces: from: Same # 同じ名前空間で作成されたルーティングルールのみをこのゲートウェイに関連付けることを許可 --- # トラフィックを MCP バックエンドに転送するルーティングルールを定義 apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: route-for-mcp-backend spec: parentRefs: - group: gateway.networking.k8s.io kind: Gateway name: test-mcp-gateway # 上記で作成した Gateway に関連付け rules: - backendRefs: # 注意:ここで参照されるバックエンドは、カスタムの Backend CRD - group: agentgateway.alibabacloud.com kind: Backend name: test-mcpゲートウェイとルーティングルールをデプロイします。
kubectl apply -f mcp-gateway.yamlゲートウェイのパブリック IP アドレスを取得します。
kubectl get gateway test-mcp-gatewayADDRESSフィールドからゲートウェイの IP アドレスを記録します。このアドレスはテストに使用します。NAME CLASS ADDRESS PROGRAMMED AGE test-mcp-gateway ack-agent-gateway 114.55.xx.xx True 13m
ステップ 3: サービス接続性のテスト
ローカルマシンに Node.js 環境がインストールされていることを確認してください。このステップでは、MCP Inspector ツールを使用してクライアントをシミュレートし、ゲートウェイ経由で MCP サービスへのアクセスをテストします。
ローカルのコマンドラインターミナルで、次のコマンドを実行して MCP Inspector をインストールし、起動します。
npx @modelcontextprotocol/inspector@v0.17.5コマンドが実行されると、ターミナルはローカルエンドポイントを出力します。通常は
http://localhost:xxxxの形式です。このエンドポイントをブラウザで開きます。開いた MCP Inspector ページで、次の情報を入力します。
Transport Type:
Streamable HTTPを選択します。URL:
http://<GATEWAY_IP>:80/mcpを入力します。<GATEWAY_IP>を前のステップで取得したゲートウェイアドレス (ADDRESS) に置き換えます。
[Connect] ボタンをクリックします。接続が成功すると、ページに接続済みステータスが表示されます。
(任意) をクリックして、MCP サービスが提供するツールのリストを取得して表示します。このステップで、サービスの可用性をさらに検証します。
ステップ 4: API キー認証の追加 (任意)
このステップでは、アプリケーションコードを一切変更せずに、TrafficPolicy リソースを使用して MCP サービスに API キー認証を追加する方法を示します。
TrafficPolicy(CRD):ack-agent-gateway が提供する CRD で、ルーティングルールに高度な機能を追加します。これはポリシーアタッチメントの実装であり、認証やレート制限などのポリシーをHTTPRouteから分離します。Secret:API キーの認証情報を安全に保存するために使用されます。
API キー認証は単純な認証方式です。認証情報が漏洩すると悪用される可能性があります。認証情報は慎重に管理および保護する必要があります。
次の内容で
mcp-api-key.yamlという名前のファイルを作成します。この YAML ファイルは、2 つの API キーを含むSecretと、API キー認証ポリシーをHTTPRouteにアタッチするTrafficPolicyを定義します。apiVersion: v1 kind: Secret metadata: name: mcp-api-key stringData: # キー (key1 など) は識別子にすぎません。値 (key-value-foo など) がクライアントが提供する必要のある実際の認証情報です。 key1: 'key-value-foo' key2: 'key-value-bar' --- apiVersion: agentgateway.alibabacloud.com/v1alpha1 kind: TrafficPolicy metadata: name: test-mcp-apikey-auth spec: targetRefs: # ポリシーをアタッチするターゲット - group: gateway.networking.k8s.io kind: HTTPRoute name: route-for-mcp-backend # 事前に作成した HTTPRoute にアタッチ traffic: authentication: apiKeyAuth: secretRef: name: mcp-api-key # 認証情報を保存する Secret を参照API キー認証ポリシーを適用します。
kubectl apply -f mcp-api-key.yamlMCP Inspector ページに戻り、認証を検証します。
ページを更新し、再度 [Connect] ボタンをクリックします。
接続は失敗し、ページに Connection Error が表示されます。MCP Inspector を実行しているコマンドラインターミナルには、
api key authentication failureのようなエラーログが出力されます。これは、ゲートウェイの認証ポリシーが有効であることを示しています。ページ上の [Authentication] ボタンをクリックします。
Secretで定義された認証情報の 1 つ、例えばkey-value-fooを入力します。その後、[Connect] ボタンをクリックします。接続が成功すると、API キー認証が成功したことを示します。
リソースのクリーンアップ
不要な課金を避けるため、実験が終了したら、このチュートリアルで作成したすべての Kubernetes リソースとクラウドリソースを削除してください。
このチュートリアルで作成したすべての Kubernetes リソースを削除します。
# 任意のステップ 4 を実行した場合は、まず認証関連のリソースを削除します kubectl delete -f mcp-api-key.yaml # ゲートウェイとルーティングルールを削除します kubectl delete -f mcp-gateway.yaml # バックエンドのサンプルサービスを削除します kubectl delete -f mcp-server.yamlServer Load Balancer (SLB) インスタンスがリリースされたことを確認します。
Gatewayリソースを削除すると、関連付けられた SLB インスタンスが自動的に削除されます。Server Load Balancer コンソールにログインして、インスタンスが削除されたことを確認します。