すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Knative で Agent2Agent (A2A) プロトコルサーバーをデプロイする

最終更新日:Mar 25, 2026

Agent2Agent (A2A) プロトコルは、AI エージェント間のシームレスなコミュニケーションとコラボレーションを可能にするために設計されたオープン標準です。Knative に A2A サーバーをデプロイすることで、オートスケーリング (ゼロへのスケーリングを含む) などの機能を活用でき、オンデマンドのリソース消費と迅速なバージョンイテレーションが可能になります。

仕組み

AI エージェントは推論、計画、メモリの能力を持ち、自律的に学習してユーザーのためのタスクを完了させることができます。一部のプロトコルが大規模言語モデル (LLM) がデータやツールにアクセスするための標準を提供するのと同様に、A2A プロトコルはエージェント間の相互運用性のための標準化されたフレームワークを定義します。

Knative に A2A サーバーをデプロイするには、以下のコアなやり取りが含まれます。

  • ディスカバリー:デプロイ後、サービスは標準の Agent Card を通じてインターフェイスを公開します。これにより、他のエージェントはその スキル (AgentSkill) と 機能 (AgentCapabilities) をクエリできます。

  • コミュニケーション:エージェントは、Knative のゲートウェイとサービスルーティングによって処理される標準の HTTP または gRPC メッセージ交換を通じて通信します。

  • コラボレーション:エージェントは API を通じてタスクをデリゲートし、アクションを調整します。

エージェントコミュニケーションのプロトコルアーキテクチャとそのコアコンセプトについては、A2A 仕様をご参照ください。

前提条件

  • クラスターに Knative をデプロイ済みであること。詳細については、「Knative コンポーネントのデプロイと管理」をご参照ください。

  • ゲートウェイアドレスを取得済みであること。

    アドレスは、Knative コンソールの アドオン管理 タブまたは サービス管理 タブで確認できます。

    image

手順1:A2A サーバーのデプロイ

この例では、`helloworld-agent-server` という名前の基本的なエージェントサービスをデプロイします。

  1. a2a-service.yaml」ファイルを作成します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-agent-server
      # 要件に応じて名前空間を変更します。
      namespace: default 
      annotations:
        # 迅速な検証のためにワイルドカードドメイン名を使用します。
        knative.aliyun.com/serving-ingress: / 
    spec:
      template:
        spec:
          containers:
          # {region} を実際のリージョン (例:cn-hangzhou) に置き換えます。
          - image: registry-{region}-vpc.ack.aliyuncs.com/acs/knative-samples-a2a:v1.0-952c112
            name: user-container
            env:
            # INVOKE は Agent Card で返される呼び出し URL を定義します。プレースホルダーをサービスのアクセスゲートウェイアドレスに置き換えてください。
            - name: INVOKE
              value: http://<YOUR_GATEWAY_ADDRESS>/invoke
            ports:
            - containerPort: 9001
              name: http1
              protocol: TCP
  2. サービスをデプロイします。

    kubectl apply -f a2a-service.yaml
  3. Knative サービスの状態を確認します。

    kubectl get ksvc helloworld-agent-server

    期待される出力:

    NAME                      URL                                                  LATESTCREATED                   LATESTREADY                     READY   REASON
    helloworld-agent-server   http://helloworld-agent-server.default.example.com   helloworld-agent-server-00001   helloworld-agent-server-00001   True    

手順2:サービスの検証と Agent Card の取得

サービスをデプロイした後、A2A プロトコルに準拠した Agent Card が返されることを確認します。

  1. ゲートウェイアドレスとサービスのデフォルトドメイン名を取得します。

    1. ACK クラスターページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、Applications > Knative をクリックします。

    2. サービス管理 タブで、サービスの デフォルトドメイン を取得します。

      次の図は、ゲートウェイデフォルトドメイン を示しています。

      image

  2. サービスのメタデータエンドポイントにアクセスします。

    # <GATEWAY_ADDRESS> を取得したゲートウェイアドレスに置き換えます。
    curl http://<GATEWAY_ADDRESS>/.well-known/agent-card.json | jq .

    期待される出力を表示します。
    出力には、エージェントの機能(capabilities)、説明(description)、およびスキル(skills)が含まれている必要があります。



    {
      "capabilities": {
        "streaming": true
      },
      "defaultInputModes": [
        "text"
      ],
      "defaultOutputModes": [
        "text"
      ],
      "description": "Just a hello world agent",
      "name": "Hello World Agent",
      "preferredTransport": "JSONRPC",
      "protocolVersion": "",
      "skills": [
        {
          "description": "Returns a 'Hello, world!'",
          "examples": [
            "hi",
            "hello"
          ],
          "id": "hello_world",
          "name": "Hello, world!",
          "tags": [
            "hello world"
          ]
        }
      ],
      "url": "http://XXX/invoke",
      "version": ""
    }

手順3:A2A クライアントによるサービスの呼び出し

Go を使用して、デプロイされた A2A サーバーと通信する別のエージェントをシミュレートするクライアントコードを作成します。

  1. 開発環境を準備します。Go 言語環境をインストールします。

  2. `main.go` ファイルを作成し、次のコードを追加します。

    package main
    
    import (
    	"context"
    	"flag"
    	"log"
    
    	// A2A プロトコルのコアライブラリをインポートします。
    	"github.com/a2aproject/a2a-go/a2a"
    	"github.com/a2aproject/a2a-go/a2aclient"
    	"github.com/a2aproject/a2a-go/a2aclient/agentcard"
    
    	// gRPC 関連のライブラリをインポートします。
    	"google.golang.org/grpc"
    	"google.golang.org/grpc/credentials/insecure"
    )
    
    // <GATEWAY_ADDRESS> を実際のゲートウェイアドレスに置き換えます。
    var cardURL = flag.String("card-url", "http://<GATEWAY_ADDRESS>", "Base URL of AgentCard client.")
    
    func main() {
    	flag.Parse()
    	ctx := context.Background()
    
    	// サービスをディスカバリーします。
    	card, err := agentcard.DefaultResolver.Resolve(ctx, *cardURL)
    	if err != nil {
    		log.Fatalf("Failed to resolve an AgentCard: %v", err)
    	}
    
    	// トランスポートレイヤーを設定します。
    	withInsecureGRPC := a2aclient.WithGRPCTransport(grpc.WithTransportCredentials(insecure.NewCredentials()))
    
    	// クライアントを作成します。
    	client, err := a2aclient.NewFromCard(ctx, card, withInsecureGRPC)
    	if err != nil {
    		log.Fatalf("Failed to create a client: %v", err)
    	}
    
    	// メッセージを構築します。
    	msg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: "Hello, world"})
    	resp, err := client.SendMessage(ctx, &a2a.MessageSendParams{Message: msg})
    	if err != nil {
    		log.Fatalf("Failed to send a message: %v", err)
    	}
    
    	log.Printf("Server responded with: %+v", resp)
    }
  3. コードを実行してテストします。

    go mod init a2a-demo
    go mod tidy
    go run main.go

    次の出力は、クライアントが Knative サービスに正常に接続し、応答を受信したことを示しています。

    2025/11/27 17:24:21 Server responded with: &{ID:019ac4a0-c386-7cdc-9aad-d40fb8f98ae2 ContextID: Extensions:[] Metadata:map[] Parts:[{Text:Hello, world! Metadata:map[]}] ReferenceTasks:[] Role:agent TaskID:}

本番環境に関する推奨事項

  • カスタムドメイン名と HTTPS:本番環境では、テストドメイン名を使用しないでください。カスタムドメイン名を設定し、HTTPS 証明書を有効にしてエージェント間の通信を保護することを推奨します。

  • コールドスタートの最適化:エージェントが頻繁に呼び出されない場合、Knative はインスタンス数をゼロにスケールダウンします。コールドスタートのレイテンシーがユーザーエクスペリエンスに影響を与えるのを防ぐために、最小インスタンス数 (MinScale) を設定するか、リザーブドインスタンスを設定することができます。

課金

Knative 自体に追加費用はかかりません。ただし、Knative の使用中にプロビジョニングされる、コンピューティングリソース (Elastic Compute Service (ECS)) やネットワークリソース (Application Load Balancer) などの基盤となるクラウドリソースの費用はお客様の負担となります。これらのリソースは、各クラウドサービスによって個別に請求されます。料金の詳細については、「クラウドリソース料金」をご参照ください。