All Products
Search
Document Center

Container Service for Kubernetes:Terapkan server protokol Agent2Agent (A2A) di Knative

Last Updated:Jun 21, 2026

Agent2Agent (A2A) adalah standar terbuka yang dirancang untuk memungkinkan komunikasi dan kolaborasi lancar antar agen AI. Penerapan server A2A di Knative memanfaatkan fitur-fitur seperti penskalaan otomatis—termasuk scale-in hingga nol—untuk memungkinkan penggunaan sumber daya sesuai permintaan dan iterasi versi yang cepat.

Cara kerja

Agen AI memiliki kemampuan inferensi, perencanaan, dan memori, sehingga dapat belajar secara otonom serta menyelesaikan tugas atas nama pengguna. Mirip dengan cara MCP menyediakan standar akses data untuk LLM, protokol Agent2Agent (A2A) menetapkan kerangka kerja standar untuk interoperabilitas antar agen.

Penerapan server A2A di Knative melibatkan interaksi inti berikut:

  • Discovery: Setelah diterapkan, layanan mengekspos antarmukanya melalui agent card standar, memungkinkan agen lain mengkueri keterampilannya (AgentSkill) dan kemampuannya (AgentCapabilities).

  • Komunikasi: Gunakan kemampuan gateway dan routing layanan Knative untuk menangani pertukaran pesan standar melalui HTTP atau gRPC.

  • Kolaborasi: Agen mendelegasikan tugas dan mengoordinasikan aksi melalui API.

Lihat spesifikasi A2A untuk arsitektur protokol dan konsep utama komunikasi agen.

Persiapan

  • Terapkan Knative di kluster Anda. Untuk informasi lebih lanjut, lihat Deploy and manage Knative components.

  • Anda telah deployed Knative di kluster ACS.

  • Anda telah memperoleh alamat akses gateway.

    Anda dapat menemukannya di halaman Add-ons atau Services. Contoh berikut menunjukkan cara menemukannya.

    Di bagian bawah halaman Service Management, lihat alamat Access Gateway. Formatnya sebagai berikut: alb-<instance ID>.cn-hangzhou.alb.aliyuncsslb.com.

Langkah 1: Deploy server A2A

Contoh ini menerapkan layanan agen dasar bernama helloworld-agent-server.

  1. Buat file a2a-service.yaml.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-agent-server
      # Perbarui namespace sesuai kebutuhan
      namespace: default 
      annotations:
        # Gunakan domain wildcard untuk validasi cepat
        knative.aliyun.com/serving-ingress: / 
    spec:
      template:
        spec:
          containers:
          # Ganti {region} dengan wilayah Anda yang sebenarnya, misalnya cn-hangzhou
          - image: registry-{region}-vpc.ack.aliyuncs.com/acs/knative-samples-a2a:v1.0-952c112
            name: user-container
            env:
            # INVOKE menentukan URL invoke yang dikembalikan dalam Agent Card. Ganti dengan alamat gateway Anda.
            - name: INVOKE
              value: http://<YOUR_GATEWAY_ADDRESS>/invoke
            ports:
            - containerPort: 9001
              name: http1
              protocol: TCP
  2. Terapkan layanan tersebut.

    kubectl apply -f a2a-service.yaml
  3. Periksa status Knative Service.

    kubectl get ksvc helloworld-agent-server

    Output yang diharapkan:

    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    

Langkah 2: Verifikasi layanan dan ambil agent card

Setelah penerapan, verifikasi bahwa layanan mengembalikan agent card yang sesuai dengan protokol A2A.

  1. Dapatkan alamat gateway dan nama domain default layanan.

    1. Di halaman ACK Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Applications > Knative.

    2. Masuk ke ACS console. Di panel navigasi kiri, klik Clusters.

    3. Di halaman Clusters, klik nama kluster target. Di panel navigasi kiri, pilih Applications > Knative.

    4. Di halaman Services, dapatkan Default Domain layanan tersebut.

      Berikut ini menampilkan Gateway dan Default Domain.

      Alamat gateway mengikuti format berikut: alb-<instance ID>.cn-hangzhou.alb.aliyuncsslb.com. Layanan helloworld-agent-server berada dalam status sukses, dan nama domain default-nya adalah helloworld-agent-server.default.example.com.

  2. Akses titik akhir metadata layanan.

    # Ganti <GATEWAY_ADDRESS> dengan alamat gateway Anda yang sebenarnya
    curl http://<GATEWAY_ADDRESS>/.well-known/agent-card.json | jq .

    Tinjau output yang diharapkan.
    Output harus mencakup kemampuan agen (capabilities), deskripsi (description), dan daftar keterampilan (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": ""
    }

Langkah 3: Panggil layanan menggunakan klien A2A

Tulis kode klien dalam Golang untuk mensimulasikan agen lain yang berkomunikasi dengan server A2A yang telah diterapkan.

  1. Siapkan lingkungan pengembangan Anda dan instal Go.

  2. Buat file bernama main.go dan tambahkan kode berikut.

    package main
    import (
    	"context"
    	"flag"
    	"log"
    	// Impor pustaka inti untuk protokol A2A
    	"github.com/a2aproject/a2a-go/a2a"
    	"github.com/a2aproject/a2a-go/a2aclient"
    	"github.com/a2aproject/a2a-go/a2aclient/agentcard"
    	// Impor pustaka terkait gRPC
    	"google.golang.org/grpc"
    	"google.golang.org/grpc/credentials/insecure"
    )
    // Ganti <GATEWAY_ADDRESS> dengan alamat gateway Anda yang sebenarnya
    var cardURL = flag.String("card-url", "http://<GATEWAY_ADDRESS>", "Base URL of AgentCard client.")
    func main() {
    	flag.Parse()
    	ctx := context.Background()
    	// Service discovery
    	card, err := agentcard.DefaultResolver.Resolve(ctx, *cardURL)
    	if err != nil {
    		log.Fatalf("Failed to resolve an AgentCard: %v", err)
    	}
    	// Konfigurasikan lapisan transport
    	withInsecureGRPC := a2aclient.WithGRPCTransport(grpc.WithTransportCredentials(insecure.NewCredentials()))
    	// Buat klien
    	client, err := a2aclient.NewFromCard(ctx, card, withInsecureGRPC)
    	if err != nil {
    		log.Fatalf("Failed to create a client: %v", err)
    	}
    	// Bangun pesan
    	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. Jalankan kode untuk pengujian.

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

    Output berikut menunjukkan bahwa klien berhasil terhubung ke layanan Knative dan menerima respons dari server.

    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:}

Rekomendasi lingkungan produksi

  • Domain kustom dan HTTPS: Jangan gunakan domain pengujian di lingkungan produksi. Konfigurasikan nama domain kustom dan aktifkan sertifikat HTTPS untuk mengamankan komunikasi antar agen.

  • Optimalisasi cold start: Jika panggilan agen jarang terjadi, Knative akan menskalakan instans hingga nol. Untuk menghindari latensi cold-start pada permintaan pertama, konfigurasikan jumlah instans minimum (MinScale) atau configure reserved instances.

Tagihan

Knative itu sendiri tidak dikenai biaya tambahan. Namun, Anda akan ditagih untuk layanan cloud yang Anda gunakan, seperti resource komputasi dan jaringan. Untuk informasi lebih lanjut, lihat Cloud service costs dan Billing.