Menyesuaikan traffic GKE Gateway menggunakan Ekstensi Layanan

Halaman ini menjelaskan cara Google Kubernetes Engine (GKE) menggunakan Ekstensi Layanan untuk menambahkan logika kustom ke dalam Cloud Load Balancing.

Halaman ini ditujukan bagi admin Identitas dan akun GKE serta Developer yang perlu mengonfigurasi logika pengelolaan traffic kustom menggunakan Ekstensi Layanan.

Sebelum membaca halaman ini, pastikan Anda memahami hal-hal berikut:

Ringkasan

GKE menggunakan Ekstensi Layanan untuk menambahkan logika kustom ke Cloud Load Balancing. Anda dapat menggunakan Ekstensi Layanan untuk tugas seperti pembagian traffic lanjutan, autentikasi kustom, atau logging permintaan.

Pengontrol Gateway GKE mendukung Ekstensi Layanan berikut:

  • GCPRoutingExtension: ekstensi ini menambahkan logika kustom ke Cloud Load Balancing untuk mengontrol perutean traffic.
  • GCPTrafficExtension: ekstensi ini menyisipkan logika kustom ke Cloud Load Balancing untuk mengubah traffic. Logika ini diterapkan ke traffic setelah layanan dipilih. Load balancer dapat menambahkan atau mengubah header dan payload permintaan dan respons HTTP. GCPTrafficExtension tidak memengaruhi pemilihan layanan atau kebijakan keamanan layanan.

Ekstensi dilampirkan ke Gateway dan mereferensikan Service, GCPWasmPlugin, atau googleAPIServiceName.

  • Merujuk Layanan: dalam model ini, Anda men-deploy logika kustom sebagai aplikasi backend terpisah, yang diekspos sebagai Layanan Kubernetes. Load balancer melakukan panggilan ke layanan ini untuk memproses traffic. Pendekatan ini serbaguna dan memungkinkan Anda menerapkan logika perutean kustom atau melakukan manipulasi traffic, seperti modifikasi header atau pemeriksaan payload. Anda mereferensikan Layanan dengan GCPRoutingExtension atau GCPTrafficExtension.

  • Merujuk resource GCPWasmPlugin: untuk kasus penggunaan berperforma tinggi, Anda dapat menyisipkan logika kustom yang ditulis pengguna langsung ke jalur data load balancerGoogle Cloud menggunakan modul WebAssembly (Wasm). Anda menentukan resource GCPWasmPlugin yang mengarah ke image modul Wasm di Artifact Registry. Metode ini hanya digunakan dengan GCPTrafficExtension dan Load Balancer Aplikasi eksternal global.

  • Merujuk Layanan Google API: Anda juga dapat merujuk layanan Google API secara langsung dengan menggunakan kolom googleAPIServiceName dalam GCPTrafficExtension.

Dalam diagram berikut, resource GCPRoutingExtension dilampirkan ke Gateway dan mereferensikan beberapa Layanan. Ekstensi mengontrol perutean traffic ke Layanan.

Resource `GCPRoutingExtension` dilampirkan ke Gateway dan
        mereferensikan Layanan. Ekstensi
        mengontrol perutean traffic.
Gambar: Cara kerja GCPRoutingExtension dengan Gateway

Pada diagram berikut, resource GCPTrafficExtension dilampirkan ke Gateway dan mereferensikan Layanan, GoogleAPIServiceName, atau GCPWasmPlugin. Ekstensi mengubah header dan payload permintaan dan respons.

Resource `GCPTrafficExtension` dilampirkan ke Gateway dan
        mereferensikan Layanan, `GoogleAPIServiceName`, atau `GCPWasmPlugin`. Ekstensi
        mengubah header dan payload permintaan serta respons.
Gambar: Cara kerja GCPTrafficExtension dengan Gateway

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah gcloud components update. Versi gcloud CLI yang lebih lama mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
  • Aktifkan Compute Engine API, Network Services API, dan Model Armor API jika diperlukan.

    Buka Aktifkan akses ke API dan ikuti petunjuknya.

  • Untuk mengetahui informasi mendetail tentang harga Google Cloud Ekstensi Layanan, lihat Harga.

  • Tinjau peran dan izin yang diperlukan di Kontrol akses Ekstensi Layanan.

  • Pahami kuota dan batas di kuota Ekstensi Layanan.

  • Jika Anda ingin menggunakan pencocok Common Expression Language (CEL), tinjau atribut dan operator yang didukung dalam referensi bahasa pencocok CEL.

  • Tinjau pembatasan dan batasan untuk Ekstensi Layanan.

Persyaratan GKE Gateway Controller

  • Cluster Anda harus menggunakan GKE versi 1.33 atau yang lebih baru.
  • Untuk menggunakan GCPWasmPlugin, cluster Anda harus menggunakan GKE versi 1.33.3 atau yang lebih baru.
  • Cluster Anda harus mengaktifkan Gateway API.
  • Anda harus memiliki resource Gatewayyang dikonfigurasi. Resource ini dapat berupa Gateway Load Balancer Aplikasi eksternal global, Load Balancer Aplikasi eksternal regional, atau Load Balancer Aplikasi internal regional. Jika Anda menggunakan resource GCPWasmPlugin, Anda hanya boleh men-deploy Gateway Load Balancer Aplikasi eksternal global.
  • Anda harus memiliki resource HTTPRoute yang dikonfigurasi.

Batas dan pembatasan

Tabel berikut mencantumkan batasan yang terkait dengan konfigurasi Ekstensi Layanan Gateway di GKE:

Kategori Batas dan pembatasan
Load Balancer GCPRoutingExtension didukung untuk load balancer berikut:
  • Load Balancer Aplikasi eksternal regional (Class Gateway gke-l7-regional-external-managed)
  • Load Balancer Aplikasi internal regional(gke-l7-rilb Gateway Class)
GCPTrafficExtension didukung untuk load balancer berikut:
  • Load Balancer Aplikasi eksternal regional (Class Gateway gke-l7-regional-external-managed)
  • Load Balancer Aplikasi internal regional (gke-l7-rilb Gateway Class)
  • Load Balancer Aplikasi eksternal global (gke-l7-global-external-managed Gateway Class)
Rantai dan spesifikasi ekstensi
  • Untuk GCPTrafficExtension, setiap ExtensionChain dapat memiliki maksimum 3 Extensions.
  • Untuk GCPRoutingExtension, setiap ExtensionChain dibatasi hingga 1 Extension.
  • GCPTrafficExtensionSpec dan GCPRoutingExtensionSpec masing-masing dapat memiliki maksimal 5 ExtensionChains.
Pengaturan waktu dan pencocokan
  • Waktu tunggu untuk setiap pesan individual di stream dalam Ekstensi harus antara 10 dan 10.000 milidetik. Batas satu detik ini berlaku untuk ekstensi Rute dan Traffic.
  • Setiap MatchCondition dalam ExtensionChain dibatasi hingga maksimum 10 CELExpressions.
  • String MatchCondition yang dihasilkan dan dikirim ke GCE memiliki batas karakter 512.
  • String CELMatcher dalam CELExpression memiliki panjang maksimum 512 karakter dan harus mematuhi pola tertentu. Kami tidak mendukung kolom BackendRefs dari CELExpression.
Header dan metadata
  • Daftar ForwardHeaders dalam Extension dapat berisi maksimum 50 nama header HTTP.
  • Peta Metadata dalam Extension dapat memiliki maksimum 16 properti.
  • Kunci dalam peta Metadata harus memiliki panjang antara 1 dan 63 karakter.
  • Nilai dalam peta Metadata harus memiliki panjang antara 1 dan 1.023 karakter.
Acara
  • Untuk GCPRoutingExtension, jika requestBodySendMode tidak ditetapkan, daftar supportedEvents hanya dapat berisi peristiwa RequestHeaders.
  • Untuk GCPRoutingExtension, jika requestBodySendMode disetel ke FullDuplexStreamed, daftar supportedEvents hanya dapat berisi peristiwa RequestHeaders, RequestBody, dan RequestTrailers.
GCPTrafficExtension
  • Kolom responseBodySendMode hanya didukung untuk GCPTrafficExtension.
  • Kolom googleAPIServiceName hanya didukung untuk GCPTrafficExtension.
  • Kolom GCPWasmPlugin hanya didukung untuk GCPTrafficExtension.
GCPWasmPlugin
  • Ekstensi dengan GCPWasmPlugin tidak mendukung kolom berikut:
    • authority
    • timeout
    • metadata
    • requestBodySendMode
    • responseBodySendMode
  • Ekstensi dengan dukungan GCPWasmPlugin hanya mendukung peristiwa RequestHeaders, RequestBody, ResponseHeaders, dan ResponseBody.
googleAPIServiceName dan backendRef Saat Anda mereferensikan Layanan yang menggunakan backendRef dalam Ekstensi, Anda harus memenuhi kondisi berikut:
  • Harus menggunakan HTTP2 sebagai appProtocol.
  • Harus berada di namespace yang sama dengan Ekstensi dan Gateway yang dirujuk oleh Ekstensi.
  • Tidak dapat menggunakan IAP.
  • Tidak dapat menggunakan kebijakan keamanan Google Cloud Armor (kolom securityPolicy dari GCPBackendPolicyConfig.
  • Tidak dapat menggunakan Cloud CDN.
  • Harus menetapkan tepat satu di antara backendRef atau googleAPIServiceName untuk Extension.
  • Harus menetapkan authority, jika backendRef ditetapkan dan kind adalah Service.
  • Tidak boleh menetapkan authority, jika googleAPIServiceName ditetapkan.
  • Konfigurasi requestBodySendMode untuk ekstensi hanya dengan menggunakan backendRef dan Service.
  • Konfigurasi responseBodySendMode untuk ekstensi hanya dengan menggunakan backendRef dan Service.

Merujuk ke Layanan

Di Ekstensi Layanan, Anda dapat merujuk ke Layanan yang menghosting logika kustom yang ingin Anda jalankan oleh load balancer. Gateway tidak memiliki Ekstensi Layanan secara default.

Untuk mengonfigurasi Ekstensi Layanan GKE, ikuti langkah-langkah berikut:

  1. Deploy Layanan panggilan balik backend: buat Layanan Kubernetes yang merepresentasikan layanan backend untuk eksekusi logika kustom. Load balancer memanggil layanan ini.

  2. Mengonfigurasi Ekstensi Layanan: gunakan ekstensi yang sesuai berdasarkan jenis load balancer Anda.

    1. GCPRoutingExtension untuk Gateway regional: gunakan ekstensi ini untuk Load Balancer Aplikasi eksternal regional dan Load Balancer Aplikasi internal regional guna menerapkan logika perutean kustom dalam region.

    2. GCPTrafficExtension untuk Gateway eksternal global, eksternal regional, dan internal: gunakan ekstensi ini untuk Load Balancer Aplikasi eksternal global, Load Balancer Aplikasi eksternal regional, dan Load Balancer Aplikasi internal regional untuk melakukan manipulasi traffic, seperti modifikasi header atau pemeriksaan payload, di berbagai jenis load balancer.

Men-deploy layanan panggilan balik backend

Layanan panggilan menerapkan logika kustom untuk Ekstensi Layanan Gateway di GKE. Gateway memanggil aplikasi backend ini, berdasarkan konfigurasi GCPTrafficExtension atau GCPRoutingExtension, untuk mengubah atau merutekan traffic.

Anda men-deploy layanan info untuk menambahkan logika kustom ke Gateway. Layanan terpisah ini menangani pemrosesan kustom, seperti manipulasi header, transformasi payload, atau perutean traffic.

Untuk men-deploy layanan yang dapat berfungsi sebagai info untuk Gateway Anda, lakukan langkah-langkah berikut:

  1. (Opsional) Buat secret untuk TLS: Perintah ini membuat secret Kubernetes berjenis TLS yang berisi sertifikat TLS dan kunci pribadi Anda.

    Untuk membuat secret TLS untuk layanan info, ganti kode berikut:

    • SECRET_NAME: nama secret untuk layanan panggilan keluar Anda
    • path-to-cert: jalur file ke sertifikat Anda
    • path-to-key: jalur file ke kunci Anda
  2. Untuk memverifikasi bahwa secret telah ditambahkan, jalankan perintah berikut:

    kubectl get secrets SECRET_NAME
    

    Ganti SECRET_NAME dengan nama rahasia untuk layanan panggilan Anda.

    Outputnya akan mirip dengan berikut ini:

    NAME            TYPE                DATA   AGE
    SECRET_NAME     kubernetes.io/tls   2      12s
    
  3. Tentukan resource Deployment dan Service.

    Anda harus menentukan hal berikut:

    • Deployment: untuk mengelola pod aplikasi yang berisi logika kustom untuk Ekstensi Layanan Anda.
    • Service: untuk mengekspos pod aplikasi yang dikelola oleh Deployment sebagai layanan jaringan.
    1. Buat contoh manifes extension-service-app.yaml yang memiliki Deployment dan definisi Service:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
      name: extension-service-app
      spec:
      selector:
          matchLabels:
            app: store
        replicas: 1
        template:
          metadata:
            labels:
              app: store
          spec:
            containers:
            - name: serviceextensions
              image: us-docker.pkg.dev/service-extensions-samples/callouts/python-example-basic:main
              ports:
              - containerPort: 8080
              - containerPort: 443
              volumeMounts:
              - name: certs
                mountPath: "/etc/certs/"
                readOnly: true
              env:
              - name: POD_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: NAMESPACE
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
              - name: TLS_SERVER_CERT
                value: "/etc/certs/path-to-cert"
              - name: TLS_SERVER_PRIVKEY
                value: "/etc/certs/path-to-key"
                resources:
                requests:
                  cpu: 10m
            volumes:
            - name: certs
              secret:
                secretName: SECRET_NAME
                optional: false
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: extension-service
      spec:
        ports:
        - port: 443
          targetPort: 443
          appProtocol: HTTP2
        selector:
          app: store
      
    2. Terapkan manifes extension-service-app.yaml:

      kubectl apply -f extension-service-app.yaml
      
  4. Verifikasi konfigurasi Anda:

    1. Pastikan aplikasi telah di-deploy:

      kubectl get pod --selector app=store
      

      Setelah aplikasi mulai berjalan, outputnya akan mirip dengan berikut ini:

      NAME                                     READY   STATUS    RESTARTS   AGE
      extension-service-app-85f466bc9b-b5mf4   1/1     Running   0          7s
      
    2. Pastikan bahwa Service telah di-deploy:

      kubectl get service extension-service
      

      Outputnya mirip dengan berikut ini, yang menampilkan Layanan untuk setiap Deployment toko:

      NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
      extension-service   ClusterIP   34.118.225.9   <none>        443/TCP   2m40s
      

Mengonfigurasi Ekstensi Layanan

Anda dapat mengonfigurasi GCPRoutingExtension atau GCPTrafficExtension untuk menyesuaikan aliran traffic.

Mengonfigurasi GCPRoutingExtension untuk Gateway regional

Anda dapat mengalihkan traffic menggunakan GCPRoutingExtension. Untuk mengonfigurasi GCPRoutingExtension, perbarui HTTPRoute untuk menentukan permintaan untuk host service-extensions.com.

  1. Perbarui HTTPRoute. Ubah HTTPRoute untuk menyertakan nama host atau jalur yang akan memicu ekstensi pemilihan rute.

    1. Simpan manifes contoh berikut sebagai file store-route.yaml:

      kind: HTTPRoute
      apiVersion: gateway.networking.k8s.io/v1
      metadata:
        name: store
      spec:
        parentRefs:
        - kind: Gateway
          name:GATEWAY_NAME
        hostnames:
        - "store.example.com"
        - "service-extensions.example.com"
        rules:
        - backendRefs:
          - name: store-v1
            port: 8080
        - matches:
          - headers:
            - name: env
              value: canary
          backendRefs:
          - name: store-v2
            port: 8080
        - matches:
          - path:
              value: /de
          backendRefs:
          - name: store-german
            port: 8080
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda.

    2. Terapkan manifes store-route.yaml:

      kubectl apply -f store-route.yaml
      
  2. Tentukan GCPRoutingExtension.

    1. Simpan konfigurasi GCPRoutingExtension dalam file gcp-routing-extension.yaml contoh:

      kind: GCPRoutingExtension
      apiVersion: networking.gke.io/v1
      metadata:
        name: my-gateway-extension
        namespace: default
      spec:
        targetRefs:
        - group: "gateway.networking.k8s.io"
          kind: Gateway
          name: GATEWAY_NAME
        extensionChains:
        - name: chain1
          matchCondition:
            celExpressions:
            - celMatcher: request.path.contains("serviceextensions")
          extensions:
          - name: ext1
            authority: "myext.com"
            timeout: 1s
              backendRef:
                group: ""
              kind: Service
              name: extension-service
              port: 443
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda.

    2. Terapkan manifes contoh ke cluster Anda:

      kubectl apply -f gcp-routing-extension.yaml
      
  3. Verifikasi konfigurasi GCPRoutingExtension dan pengikatannya ke Gateway.

    1. Periksa deployment GCPRoutingExtension:

      kubectl describe gcproutingextension my-gateway-extension
      

      Outputnya mirip dengan hal berikut ini:

      Name:         my-gateway-extension
      Namespace:    default
      Labels:       <none>
      Annotations:  <none>
      API Version:  networking.gke.io/v1
      Kind:         GCPRoutingExtension
      Metadata:
        Creation Timestamp:  2025-03-02T17:12:30Z
        Generation:        1
        Resource Version:  31283253
        UID:               ec8efaa0-d8e7-4e1b-9fd4-0ae0ef3c74d0
      Spec:
        Extension Chains:
          Extensions:
            Authority:    myext.com
            Backend Ref:
              Group:
              Kind: Service
              Name: extension-service
              Port: 443
            Name:       ext1
            Timeout:    1s
          Match Condition:
            Cel Expressions:
              Cel Matcher: request.path.contains("serviceextensions")
          Name:  chain1
        Target Refs:
          Group: gateway.networking.k8s.io
          Kind: Gateway
          Name: GATEWAY_NAME
      Events:  <none>
      

      Output menampilkan detail GCPRoutingExtension, yang diberi nama my-gateway-extension, dalam namespace default. Output menampilkan kolom Spec, yang berisi definisi perilaku ekstensi.

    2. Verifikasi binding Gateway:

      1. Pastikan GCPRoutingExtension terikat ke Gateway. Proses ini mungkin memerlukan waktu beberapa menit:

        kubectl describe gateway GATEWAY_NAME
        

        Outputnya mirip dengan hal berikut ini:

        Name:         GATEWAY_NAME
        Namespace:    default
        Labels:       none
        Annotations:  networking.gke.io/addresses: /projects/1234567890/regions/us-central1/addresses/test-hgbk-default-internal-http-5ypwen3x2gcr
                      networking.gke.io/backend-services:
                        /projects/1234567890/regions/us-central1/backendServices/test-hgbk-default-extension-service-443-rduk21fwhoj0, /projects/1234567890/re...
                      networking.gke.io/firewalls: /projects/1234567890/global/firewalls/test-hgbk-l7-default-us-central1
                      networking.gke.io/forwarding-rules: /projects/1234567890/regions/us-central1/forwardingRules/test-hgbk-default-internal-http-qn7dk9i9zm73
                      networking.gke.io/health-checks:
                        /projects/1234567890/regions/us-central1/healthChecks/test-hgbk-default-extension-service-443-rduk21fwhoj0, /projects/1234567890/regio...
                      networking.gke.io/last-reconcile-time: 2025-03-02T17:15:02Z
                      networking.gke.io/lb-route-extensions:
                        /projects/1234567890/locations/us-central1/lbRouteExtensions/test-hgbk-default-internal-http-lwh0op4qorb0
                      networking.gke.io/lb-traffic-extensions:
                      networking.gke.io/ssl-certificates:
                      networking.gke.io/target-http-proxies:
                        /projects/1234567890/regions/us-central1/targetHttpProxies/test-hgbk-default-internal-http-2jzr7e3xclhj
                      networking.gke.io/target-https-proxies:
                      networking.gke.io/url-maps: /projects/1234567890/regions/us-central1/urlMaps/test-hgbk-default-internal-http-2jzr7e3xclhj
        API Version:  gateway.networking.k8s.io/v1
        Kind:         Gateway
        Metadata:
          Creation Timestamp:  2025-03-02T16:37:50Z
          Finalizers:
          gateway.finalizer.networking.gke.io
          Generation:        1
          Resource Version:  31284863
          UID:               fd512611-bad2-438e-abfd-5619474fbf31
        ...
        

        Output menampilkan anotasi, yang digunakan GKE untuk menyimpan link antara Gateway dan resourceGoogle Cloud yang mendasarinya. Anotasi networking.gke.io/lb-route-extensions mengonfirmasi pengikatan gateway ke GCPRoutingExtension.

      2. Periksa status ekstensi dengan mengonfirmasi bahwa GCPRoutingExtension memiliki status Programmed dengan alasan ProgrammingSucceeded. Perintah ini mungkin memerlukan waktu beberapa menit.

        kubectl describe gcproutingextension my-gateway-extension
        

        Outputnya mirip dengan hal berikut ini:

        Name:         my-gateway-extension
        Namespace:    default
        Labels:       <none>
        Annotations:  <none>
        API Version:  networking.gke.io/v1
        Kind:         GCPRoutingExtension
        Metadata:
          Creation Timestamp:  2025-03-02T17:12:30Z
          Generation:          1
          Resource Version:    31284378
          UID:                 ec8efaa0-d8e7-4e1b-9fd4-0ae0ef3c74d0
        Spec:
          Extension Chains:
            Extensions:
              Authority:  myext.com
              Backend Ref:
                Group:
                Kind:   Service
                Name:   extension-service
                Port:   443
              Name:     ext1
              Timeout:  1s
            Match Condition:
              Cel Expressions:
                Cel Matcher:  request.path.contains("serviceextensions")
            Name:             chain1
          Target Refs:
            Group:  gateway.networking.k8s.io
            Kind:   Gateway
            Name:   GATEWAY_NAME
        Status:
          Ancestors:
            Ancestor Ref:
              Group:      gateway.networking.k8s.io
              Kind:       Gateway
              Name:       GATEWAY_NAME
              Namespace:  default
            Conditions:
              Last Transition Time:  2025-03-02T17:14:15Z
              Message:
              Reason:                Accepted
              Status:                True
              Type:                  Accepted
              Last Transition Time:  2025-03-02T17:14:15Z
              Message:
              Reason:                ProgrammingSucceeded
              Status:                True
              Type:                  Programmed
            Controller Name:         networking.gke.io/gateway
        Events:
          Type    Reason  Age                From                   Message
          ----    ------  ----               ----                   -------
          Normal  ADD     2m31s              sc-gateway-controller  default/my-gateway-extension
        Normal  SYNC    51s (x2 over 98s)  sc-gateway-controller  Attachment of GCPRoutingExtension "default/my-gateway-extension" to AncestorRef {Group:       "gateway.networking.k8s.io",
        Kind:        "Gateway",
        Namespace:   "default",
        Name:        "GATEWAY_NAME",
        SectionName: nil,
        Port:        nil} was a success
          Normal  SYNC    23s           sc-gateway-controller  Reconciliation of GCPRoutingExtension "default/my-gateway-extension" to AncestorRef {Group:       "gateway.networking.k8s.io",
        Kind:        "Gateway",
        Namespace:   "default",
        Name:        "GATEWAY_NAME",
        SectionName: nil,
        Port:        nil} was a success
        

        Kolom Status.Conditions menampilkan kondisi Programmed dengan Status: True dan Reason: ProgrammingSucceeded. Informasi ini mengonfirmasi bahwa ekstensi berhasil diterapkan.

  4. Kirim traffic ke aplikasi Anda.

    Setelah Gateway, Rute, dan aplikasi di-deploy di cluster, Anda dapat meneruskan traffic ke aplikasi.

    1. Untuk mengakses aplikasi, Anda perlu menemukan alamat IP Gateway Anda.

      Di terminal, gunakan perintah berikut:

      kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda.

      Perintah ini menampilkan alamat IP Gateway. Dalam perintah lanjutan, ganti GATEWAY_IP_ADDRESS dengan alamat IP dari output.

    2. Uji pembaruan jalur dengan membuka layanan toko versi serviceextensions di store.example.com/serviceextensions:

      curl http://store.example.com/serviceextensions --resolve store.example.com:80:GATEWAY_IP_ADDRESS -v
      

      Outputnya mirip dengan hal berikut ini:

      {
      "cluster_name": "gke1",
      "host_header": "service-extensions.com",
      "metadata": "store-v1",
      "pod_name": "store-v1-5d9554f847-cvxpd",
      "pod_name_emoji": "💇🏼‍♀️",
      "project_id": "gateway-demo",
      "timestamp": "2025-03-15T12:00:00",
      "zone": "us-central1-c"
      }
      

Konfigurasi GCPTrafficExtension

Anda dapat menggunakan GCPTrafficExtension untuk menggunakan kemampuan pengelolaan traffic lanjutan dalam lingkungan Google Cloud . Anda dapat mengonfigurasi ekstensi ini di seluruh Load Balancer Aplikasi eksternal global, Load Balancer Aplikasi eksternal regional, dan Load Balancer Aplikasi internal regional. Anda dapat menggunakan GCPTrafficExtension untuk menerapkan logika permintaan dan respons HTTP kustom, pemilihan rute yang canggih, transformasi, dan kebijakan keamanan.

  1. Perbarui HTTPRoute. Ubah HTTPRoute untuk menyertakan nama host atau jalur yang akan memicu ekstensi traffic.

    1. Simpan manifes contoh berikut sebagai file store-route.yaml:

      kind: HTTPRoute
      apiVersion: gateway.networking.k8s.io/v1
      metadata:
        name: store
      spec:
        parentRefs:
        - kind: Gateway
          name: GATEWAY_NAME
        hostnames:
        - "store.example.com"
        - "service-extensions.example.com"
        rules:
        - backendRefs:
          - name: store-v1
            port: 8080
        - matches:
          - headers:
            - name: env
              value: canary
          backendRefs:
          - name: store-v2
            port: 8080
        - matches:
          - path:
              value: /de
          backendRefs:
          - name: store-german
            port: 8080
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda, seperti internal-http, external-http, atau global-external-http.

    2. Terapkan manifes store-route.yaml ke cluster Anda:

      kubectl apply -f store-route.yaml
      
  2. Tentukan GCPTrafficExtension.

    1. Simpan konfigurasi GCPTrafficExtension ke file gcp-traffic-extension.yaml contoh:

      kind: GCPTrafficExtension
      apiVersion: networking.gke.io/v1
      metadata:
        name: my-traffic-extension
        namespace: default
      spec:
        targetRefs:
        - group: "gateway.networking.k8s.io"
          kind: Gateway
          name: GATEWAY_NAME
        extensionChains:
        - name: chain1
          matchCondition:
            celExpressions:
            - celMatcher: request.path.contains("serviceextensions")
          extensions:
          - name: ext1
            authority: "myext.com"
            timeout: 1s
            backendRef:
              group: ""
              kind: Service
              name: extension-service
              port: 443
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda, sebagai internal-http, external-http, atau global-external-http.

    2. Terapkan manifes contoh ke cluster Anda:

      kubectl apply -f gcp-traffic-extension.yaml
      
  3. Verifikasi konfigurasi GCPTrafficExtension dan pengikatannya ke Gateway.

    1. Periksa deployment GCPTrafficExtension:

      kubectl describe gcptrafficextension my-traffic-extension
      

      Outputnya mirip dengan hal berikut ini:

      Name:         my-traffic-extension
      Namespace:    default
      Labels:       <none>
      Annotations:  <none>
      API Version:  networking.gke.io/v1
      Kind:         GCPTrafficExtension
      Metadata:
        Creation Timestamp:  2025-03-02T17:12:30Z
        Generation:        1
        Resource Version:  31283253
        UID:               ec8efaa0-d8e7-4e1b-9fd4-0ae0ef3c74d0
      Spec:
        Extension Chains:
          Extensions:
            Authority:    myext.com
            Backend Ref:
              Group:
              Kind: Service
              Name: extension-service
              Port: 443
            Name:       ext1
            Timeout:    1s
          Match Condition:
            Cel Expressions:
              Cel Matcher: request.path.contains("serviceextensions")
          Name:  chain1
        Target Refs:
          Group: gateway.networking.k8s.io
          Kind: Gateway
          Name: GATEWAY_NAME
      Events:  <none>
      

      Output menampilkan detail GCPTrafficExtension bernama my-traffic-extension dalam namespace default. File ini menampilkan kolom Spec, yang berisi definisi tentang perilaku ekstensi.

    2. Verifikasi binding Gateway:

      Pastikan GCPTrafficExtension terikat ke Gateway. Perintah ini mungkin memerlukan waktu beberapa menit untuk diselesaikan:

      kubectl describe gateway GATEWAY_NAME
      

      Outputnya mirip dengan hal berikut ini:

      Name:         GATEWAY_NAME
      Namespace:    default
      Labels:       <none>
      Annotations:  networking.gke.io/addresses: /projects/1234567890/regions/us-central1/addresses/test-hgbk-default-internal-http-5ypwen3x2gcr
                    networking.gke.io/backend-services:
                      /projects/1234567890/regions/us-central1/backendServices/test-hgbk-default-extension-service-443-rduk21fwhoj0, /projects/1234567890/re...
                    networking.gke.io/firewalls: /projects/1234567890/global/firewalls/test-hgbk-l7-default-us-central1
                    networking.gke.io/forwarding-rules: /projects/1234567890/regions/us-central1/forwardingRules/test-hgbk-default-internal-http-qn7dk9i9zm73
                    networking.gke.io/health-checks:
                      /projects/1234567890/regions/us-central1/healthChecks/test-hgbk-default-extension-service-443-rduk21fwhoj0, /projects/1234567890/regio...
                    networking.gke.io/last-reconcile-time: 2025-03-02T17:15:02Z
                    networking.gke.io/lb-traffic-extensions:
                      /projects/1234567890/locations/us-central1/lbTrafficExtensions/test-hgbk-default-internal-http-lwh0op4qorb0
                    networking.gke.io/ssl-certificates:
                    networking.gke.io/target-http-proxies:
                      /projects/1234567890/regions/us-central1/targetHttpProxies/test-hgbk-default-internal-http-2jzr7e3xclhj
                    networking.gke.io/target-https-proxies:
                    networking.gke.io/url-maps: /projects/1234567890/regions/us-central1/urlMaps/test-hgbk-default-internal-http-2jzr7e3xclhj
      API Version:  gateway.networking.k8s.io/v1
      Kind:         Gateway
      Metadata:
        Creation Timestamp:  2025-03-02T16:37:50Z
        Finalizers:
          gateway.finalizer.networking.gke.io
        Generation:        1
        Resource Version:  31284863
        UID:               fd512611-bad2-438e-abfd-5619474fbf31
      ...
      

      Output menampilkan anotasi, yang digunakan GKE untuk menyimpan link antara Gateway dan resource Google Cloud yang mendasarinya. Anotasi networking.gke.io/lb-traffic-extensions mengonfirmasi pengikatan.

    3. Periksa status ekstensi:

      Pastikan bahwa GCPTrafficExtension memiliki status Programmed dengan alasan ProgrammingSucceeded. Pemrosesan perintah ini dapat memerlukan waktu beberapa menit.

      Untuk memeriksa status ekstensi GCPTrafficExtension, jalankan perintah berikut:

      kubectl describe gcptrafficextension my-traffic-extension
      

      Output resource GCPTrafficExtension mirip dengan berikut ini:

      Name:         my-traffic-extension
      Namespace:    default
      Labels:       <none>
      Annotations:  <none>
      API Version:  networking.gke.io/v1
      Kind:         GCPTrafficExtension
      Metadata:
        Creation Timestamp:  2025-03-02T17:12:30Z
        Generation:          1
        Resource Version:    31284378
        UID:                 ec8efaa0-d8e7-4e1b-9fd4-0ae0ef3c74d0
      Spec:
        Extension Chains:
          Extensions:
            Authority:  myext.com
            Backend Ref:
              Group:
              Kind:   Service
              Name:   extension-service
              Port:   443
            Name:     ext1
            Timeout:  1s
          Match Condition:
            Cel Expressions:
              Cel Matcher:  request.path.contains("serviceextensions")
          Name:             chain1
        Target Refs:
          Group:  gateway.networking.k8s.io
          Kind:   Gateway
          Name:   GATEWAY_NAME
      Status:
        Ancestors:
          Ancestor Ref:
            Group:      gateway.networking.k8s.io
            Kind:       Gateway
            Name:       GATEWAY_NAME
            Namespace:  default
          Conditions:
            Last Transition Time:  2025-03-02T17:14:15Z
            Message:
            Reason:                Accepted
            Status:                True
            Type:                  Accepted
            Last Transition Time:  2025-03-02T17:14:15Z
            Message:
            Reason:                ProgrammingSucceeded
            Status:                True
            Type:                  Programmed
          Controller Name:         networking.gke.io/gateway
      Events:
        Type    Reason  Age                From                   Message
        ----    ------  ----               ----                   -------
        Normal  ADD     2m31s              sc-gateway-controller  default/my-traffic-extension
        Normal  SYNC    51s (x2 over 98s)  sc-gateway-controller  Attachment of GCPTrafficExtension "default/my-gateway-extension" to AncestorRef {Group:       "gateway.networking.k8s.io",
        Kind:        "Gateway",
        Namespace:   "default",
        Name:        "GATEWAY_NAME",
        SectionName: nil,
        Port:        nil} was a success
        Normal  SYNC    23s           sc-gateway-controller  Reconciliation of GCPTrafficExtension "default/my-traffic-extension" to AncestorRef {Group:       "gateway.networking.k8s.io",
        Kind:        "Gateway",
        Namespace:   "default",
        Name:        "GATEWAY_NAME",
        SectionName: nil,
        Port:        nil} was a success
      

      Kolom Status.Conditions menampilkan kondisi Programmed dengan Status: True dan Reason: ProgrammingSucceeded. Informasi ini mengonfirmasi bahwa ekstensi berhasil diterapkan.

  4. Kirim traffic ke aplikasi Anda.

    Setelah Gateway, Rute, dan aplikasi di-deploy di cluster, Anda dapat meneruskan traffic ke aplikasi.

    1. Untuk mengakses aplikasi, Anda perlu menemukan alamat IP Gateway Anda.

      Di terminal, gunakan perintah berikut:

      kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda.

      Perintah ini menampilkan alamat IP Gateway. Dalam perintah lanjutan, ganti GATEWAY_IP_ADDRESS dengan alamat IP dari output.

    2. Uji pembaruan jalur dengan membuka layanan toko versi serviceextensions di store.example.com/serviceextensions:

      curl http://store.example.com/serviceextensions --resolve store.example.com:80:GATEWAY_IP_ADDRESS -v
      

      Outputnya mirip dengan hal berikut ini:

      {
      *   Request completely sent off
      < HTTP/1.1 200 OK
      < server: Werkzeug/2.3.7 Python/3.11.3
      < date: Sun, 02 Mar 2025 16:58:10 GMT
      < content-type: application/json
      < access-control-allow-origin: *
      < hello: service-extensions
      < via: 1.1 google
      < transfer-encoding: chunked
      }
      

Merujuk ke resource GCPWasmPlugin

Anda dapat menyuntikkan logika kustom langsung ke jalur data load balancer menggunakan GCPWasmPlugin dengan GCPTrafficExtension. Metode ini memungkinkan Anda men-deploy kemampuan pengelolaan traffic kustom yang dikemas sebagai modul Wasm.

Untuk mengonfigurasi Ekstensi Layanan GKE, ikuti langkah-langkah berikut:

  1. Deploy GCPWasmPlugin: buat dan deploy definisi resource kustom (CRD) GCPWasmPlugin yang berisi kode kustom untuk modul Wasm Anda. Anda hanya dapat menggunakan GCPWasmPlugin dengan GCPTrafficExtension untuk GatewayClass gke-l7-global-external-managed.

  2. Konfigurasi Ekstensi Layanan: gunakan GCPTrafficExtension untuk Load Balancer Aplikasi eksternal global.

Men-deploy GCPWasmPlugin

GCPWasmPlugin memungkinkan Anda menyuntikkan logika kustom yang ditulis pengguna langsung ke jalur data load balancer Google Cloud . Resource GCPWasmPlugin menunjuk ke image modul Wasm di Artifact Registry, yang kemudian dieksekusi oleh load balancer.

Sebelum melanjutkan langkah-langkah berikut, pastikan Anda telah mengupload modul Wasm ke repositori Artifact Registry. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan kode plugin.

Untuk men-deploy resource GCPWasmPlugin, selesaikan langkah-langkah berikut:

  1. Simpan manifes berikut sebagai wasm-plugin.yaml:

    kind: GCPWasmPlugin
    apiVersion: networking.gke.io/v1
    metadata:
      name: gcp-wasm-plugin
    spec:
      versions:
      - name: wasm-plugin-version
        description: "Test wasm plugin version"
        image: "us-docker.pkg.dev/service-extensions-samples/plugins/local-reply:main"
        weight: 1000000
      logConfig:
        enabled: true
        # Configures the sampling rate of activity logs.
        # The value of the field must be in range [0, 1e6].
        sampleRate: 1000000
        # Specifies the lowest level of logs that are exported to Cloud Logging.
        minLogLevel: INFO
    

    Perhatikan hal berikut:

    • spec.versions.name: nama versi harus unik dalam resource GCPWasmPlugin. Anda dapat mencantumkan hingga 10 versi, dan hanya satu versi yang harus memiliki bobot selain nol.
    • spec.versions.image: mereferensikan image yang berisi kode plugin yang disimpan di Artifact Registry.
    • spec.versions.weight: menentukan bobot versi plugin. Bobot harus berupa angka antara 0 dan 1.000.000, inklusif.
    • spec.logConfig: menentukan apakah akan mengaktifkan Cloud Logging untuk plugin ini. Jika nilai tidak ditentukan, Cloud Logging akan dinonaktifkan secara default.
    • spec.logConfig.sampleRate: mengonfigurasi frekuensi pengambilan sampel log aktivitas. Tarif harus berupa angka antara 0 dan 1.000.000, inklusif. Jika tidak ditentukan saat Cloud Logging diaktifkan, nilai defaultnya adalah 1,000,000 (100% permintaan dicatat).
    • spec.logConfig.minLogLevel: menentukan tingkat log terendah yang diekspor ke Cloud Logging. Jika nilai tidak ditentukan saat Cloud Logging diaktifkan, kolom akan disetel ke INFO secara default.
  2. Terapkan manifes wasm-plugin.yaml:

    kubectl apply -f wasm-plugin.yaml
    
  3. Verifikasi bahwa plugin telah di-deploy:

    kubectl describe gcpwasmplugins.networking.gke.io gcp-wasm-plugin
    

    Outputnya mirip dengan hal berikut ini:

    Name:         gcp-wasm-plugin
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         GCPWasmPlugin
    Metadata:
      Creation Timestamp:  2025-08-08T19:54:18Z
      Generation:          1
      Resource Version:    44578
      UID:                 549a12c7-91d1-43ad-a406-d6157a799b79
    Spec:
      Log Config:
        Enabled: true
        Min Log Level: INFO
        Sample Rate: 1000000
      Versions:
        Description:  Test wasm plugin version
        Image:        us-docker.pkg.dev/service-extensions-samples/plugins/local-reply:main
        Name:         wasm-plugin-version
        Weight:       1000000
      Events:     <none>
    

Mengonfigurasi Ekstensi Layanan

Untuk menambahkan logika kustom ke Load Balancer Aplikasi eksternal global, Anda dapat mengonfigurasi GCPTrafficExtension untuk menggunakan GCPWasmPlugin. Anda dapat menggunakan GCPTrafficExtension untuk menggunakan kemampuan pengelolaan traffic lanjutan dalam lingkungan Google Cloud Anda. Anda dapat mengonfigurasi ekstensi ini di seluruh Load Balancer Aplikasi eksternal global.

Untuk mengonfigurasi GCPTrafficExtension agar menggunakan GCPWasmPlugin, selesaikan langkah-langkah berikut:

  1. Tentukan GCPTrafficExtension.

    1. Simpan konfigurasi GCPTrafficExtension sebagai gcp-traffic-extension-with-plugin.yaml:

      kind: GCPTrafficExtension
      apiVersion: networking.gke.io/v1
      metadata:
        name: gcp-traffic-extension-with-plugin
        namespace: default
      spec:
        targetRefs:
        - group: "gateway.networking.k8s.io"
          kind: Gateway
          name: GATEWAY_NAME
        extensionChains:
        - name: chain1
          matchCondition:
            celExpressions:
            - celMatcher: request.path.contains("serviceextensions")
          extensions:
          - name: ext1
            supportedEvents:
            - RequestHeaders
            - ResponseHeaders
            backendRef:
              group: "networking.gke.io"
              kind: GCPWasmPlugin
              name: gcp-wasm-plugin
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda, seperti global-external-http.

    2. Terapkan manifes contoh ke cluster Anda:

      kubectl apply -f gcp-traffic-extension-with-plugin.yaml
      
  2. Verifikasi konfigurasi GCPTrafficExtension dan pengikatannya ke Gateway.

    1. Periksa deployment GCPTrafficExtension:

      kubectl describe gcptrafficextensions.networking.gke.io gcp-traffic-extension-with-plugin
      

      Outputnya mirip dengan hal berikut ini:

      Name:         gcp-traffic-extension-with-plugin
      Namespace:    default
      Labels:       <none>
      Annotations:  <none>
      API Version:  networking.gke.io/v1
      Kind:         GCPTrafficExtension
      Metadata:
        Creation Timestamp:  2025-03-02T17:12:30Z
        Generation:        1
        Resource Version:  31283253
        UID:               ec8efaa0-d8e7-4e1b-9fd4-0ae0ef3c74d0
      Spec:
        Extension Chains:
          Extensions:
            Backend Ref:
              Group: networking.gke.io
              Kind: GCPWasmPlugin
              Name: gcp-wasm-plugin
            Name:       ext1
            Supported Events:
              RequestHeaders
              ResponseHeaders
          Match Condition:
            Cel Expressions:
              Cel Matcher: request.path.contains("serviceextensions")
          Name:  chain1
        Target Refs:
          Group: gateway.networking.k8s.io
          Kind: Gateway
          Name: GATEWAY_NAME
      Events:  <none>
      

      Output menampilkan detail GCPTrafficExtension bernama gcp-traffic-extension-with-plugin dalam namespace default. File ini menampilkan kolom Spec, yang berisi definisi tentang perilaku ekstensi.

    2. Verifikasi binding Gateway:

      Pastikan GCPTrafficExtension terikat ke Gateway. Perintah ini mungkin memerlukan waktu beberapa menit untuk diselesaikan:

      kubectl describe gateway GATEWAY_NAME
      

      Outputnya mirip dengan hal berikut ini:

      Name:         GATEWAY_NAME
      Namespace:    default
      Labels:       <none>
      Annotations:  networking.gke.io/addresses: /projects/922988411345/global/addresses/test-k18j-default-external-http-2jfqxrkgd0fm
                    networking.gke.io/backend-services:
                      /projects/922988411345/global/backendServices/test-k18j-default-gw-serve404-80-8zjp3d8cqfsu, /projects/922988411345/global/backendServices...
                      networking.gke.io/certmap: store-example-com-map
                      networking.gke.io/firewalls: /projects/922988411345/global/firewalls/test-k18j-l7-default-global
                      networking.gke.io/forwarding-rules: /projects/922988411345/global/forwardingRules/test-k18j-default-external-http-wt1tl0cwi6zr
                      networking.gke.io/health-checks:
                        /projects/922988411345/global/healthChecks/test-k18j-default-gw-serve404-80-8zjp3d8cqfsu, /projects/922988411345/global/healthChecks/test-...
                      networking.gke.io/last-reconcile-time: 2025-08-08T20:27:35Z
                      networking.gke.io/lb-route-extensions:
                      networking.gke.io/lb-traffic-extensions:
                        projects/922988411345/locations/global/lbTrafficExtensions/test-k18j-default-external-http-0tdum40yts35
                      networking.gke.io/ssl-certificates:
                      networking.gke.io/target-http-proxies:
                      networking.gke.io/target-https-proxies: /projects/922988411345/global/targetHttpsProxies/test-k18j-default-external-http-jy9mc97xb5yh
                      networking.gke.io/url-maps: /projects/922988411345/global/urlMaps/test-k18j-default-external-http-jy9mc97xb5yh
                      networking.gke.io/wasm-plugin-versions:
                        projects/922988411345/locations/global/wasmPlugins/test-k18j-default-gcp-wasm-plugin-itle20jj9nyk/versions/test-k18j-wasm-plugin-version-i...
                      networking.gke.io/wasm-plugins: projects/922988411345/locations/global/wasmPlugins/test-k18j-default-gcp-wasm-plugin-itle20jj9nyk
      API Version:  gateway.networking.k8s.io/v1
      Kind:         Gateway
      Metadata:
        Creation Timestamp:  2025-03-02T16:37:50Z
        Finalizers:
          gateway.finalizer.networking.gke.io
        Generation:        1
        Resource Version:  31284863
        UID:               fd512611-bad2-438e-abfd-5619474fbf31
      Spec:
        Gateway Class Name:  gke-l7-global-external-managed
        Listeners:
          Allowed Routes:
            Namespaces:
              From:  Same
          Name:      https
          Port:      443
          Protocol:  HTTPS
      ...
      

      Output menampilkan anotasi, yang digunakan GKE untuk menyimpan link antara Gateway dan resource Google Cloudyang mendasarinya. Anotasi networking.gke.io/lb-traffic-extensions, networking.gke.io/wasm-plugin-versions, dan networking.gke.io/wasm-plugins mengonfirmasi pengikatan.

    3. Periksa status ekstensi:

      Pastikan bahwa GCPTrafficExtension memiliki status Programmed dengan alasan ProgrammingSucceeded. Pemrosesan perintah ini dapat memerlukan waktu beberapa menit.

      kubectl describe gcptrafficextensions.networking.gke.io gcp-traffic-extension-with-plugin
      

      Outputnya mirip dengan hal berikut ini:

      Name:         gcp-traffic-extension-with-plugin
      Namespace:    default
      Labels:       <none>
      Annotations:  <none>
      API Version:  networking.gke.io/v1
      Kind:         GCPTrafficExtension
      Metadata:
        Creation Timestamp:  2025-08-08T20:08:09Z
        Generation:          1
        Resource Version:    56528
        UID:                 1389f790-9663-45ca-ac4e-a2c082f43359
      Spec:
        Extension Chains:
          Extensions:
            Backend Ref:
              Group:  networking.gke.io
              Kind:   GCPWasmPlugin
              Name:   gcp-wasm-plugin
            Name:     ext1
            Supported Events:
              RequestHeaders
              ResponseHeaders
          Match Condition:
            Cel Expressions:
              Cel Matcher:  request.path.contains("serviceextensions")
          Name:             chain1
        Target Refs:
          Group:  gateway.networking.k8s.io
          Kind:   Gateway
          Name:   external-http
      Status:
        Ancestors:
          Ancestor Ref:
            Group:      gateway.networking.k8s.io
            Kind:       Gateway
            Name:       external-http
            Namespace:  default
          Conditions:
            Last Transition Time:  2025-08-08T20:16:13Z
            Message:
            Observed Generation:   1
            Reason:                Accepted
            Status:                True
            Type:                  Accepted
            Last Transition Time:  2025-08-08T20:16:13Z
            Message:
            Observed Generation:   1
            Reason:                ResolvedRefs
            Status:                True
            Type:                  ResolvedRefs
            Last Transition Time:  2025-08-08T20:16:13Z
            Message:
            Observed Generation:   1
            Reason:                ProgrammingSucceeded
            Status:                True
            Type:                  Programmed
          Controller Name:         networking.gke.io/gateway
      Events:
        Type    Reason  Age                  From                   Message
        ----    ------  ----                 ----                   -------
        Normal  ADD     19m                  sc-gateway-controller  default/gcp-traffic-extension-with-plugin
        Normal  SYNC    3m25s (x4 over 11m)  sc-gateway-controller  Attachment of GCPTrafficExtension "default/gcp-traffic-extension-with-plugin" to AncestorRef {Group:       "gateway.networking.k8s.io",
      Kind:        "Gateway",
      Namespace:   "default",
      Name:        "external-http",
      SectionName: nil,
      Port:        nil} was a success
        Normal  SYNC  3m25s (x4 over 11m)  sc-gateway-controller  All the object references were able to be resolved for GCPTrafficExtension "default/gcp-traffic-extension-with-plugin" bound to AncestorRef {Group:       "gateway.networking.k8s.io",
      Kind:        "Gateway",
      Namespace:   "default",
      Name:        "external-http",
      SectionName: nil,
      Port:        nil}
        Normal  SYNC  3m25s (x4 over 11m)  sc-gateway-controller  Programming of GCPTrafficExtension "default/gcp-traffic-extension-with-plugin" to AncestorRef {Group:       "gateway.networking.k8s.io",
      Kind:        "Gateway",
      Namespace:   "default",
      Name:        "external-http",
      SectionName: nil,
      Port:        nil} was a success
      
    4. Periksa status plugin.

      Pastikan resource GCPWasmPlugin memiliki status Programmed dengan alasan ProgrammingSucceeded. Pemrosesan perintah ini dapat memerlukan waktu beberapa menit.

      kubectl describe gcpwasmplugins.networking.gke.io gcp-wasm-plugin
      

      Outputnya mirip dengan hal berikut ini:

      Name:         gcp-wasm-plugin
      Namespace:    default
      Labels:       <none>
      Annotations:  <none>
      API Version:  networking.gke.io/v1
      Kind:         GCPWasmPlugin
      Metadata:
        Creation Timestamp:  2025-08-08T19:54:18Z
        Generation:          1
        Resource Version:    44578
        UID:                 549a12c7-91d1-43ad-a406-d6157a799b79
      Spec:
        Log Config:
          Enabled: true
          Min Log Level: INFO
          Sample Rate: 1000000
        Versions:
          Description:  Test wasm plugin version
          Image:        us-docker.pkg.dev/service-extensions-samples/plugins/local-reply:main
          Name:         wasm-plugin-version
          Weight:       1000000
      Status:
        Ancestors:
          Ancestor Ref:
            Group:      gateway.networking.k8s.io
            Kind:       Gateway
            Name:       external-http
            Namespace:  default
          Conditions:
            Last Transition Time:  2025-08-08T19:59:06Z
            Message:
            Observed Generation:   1
            Reason:                Accepted
            Status:                True
            Type:                  Accepted
            Last Transition Time:  2025-08-08T19:59:06Z
            Message:
            Observed Generation:   1
            Reason:                ResolvedRefs
            Status:                True
            Type:                  ResolvedRefs
            Last Transition Time:  2025-08-08T19:59:06Z
            Message:
            Observed Generation:   1
            Reason:                ProgrammingSucceeded
            Status:                True
            Type:                  Programmed
          Controller Name:         networking.gke.io/gateway
      Events:
        Type    Reason  Age                 From                   Message
        ----    ------  ----                ----                   -------
        Normal  ADD     31m                 sc-gateway-controller  default/gcp-wasm-plugin
        Normal  SYNC    2m1s (x7 over 26m)  sc-gateway-controller  Attachment of WasmPlugin "default/gcp-wasm-plugin" to AncestorRef {Group:       "gateway.networking.k8s.io",
      Kind:        "Gateway",
      Namespace:   "default",
      Name:        "external-http",
      SectionName: nil,
      Port:        nil} was a success
        Normal  SYNC  2m1s (x7 over 26m)  sc-gateway-controller  All the object references were able to be resolved for WasmPlugin "default/gcp-wasm-plugin" bound to AncestorRef {Group:       "gateway.networking.k8s.io",
      Kind:        "Gateway",
      Namespace:   "default",
      Name:        "external-http",
      SectionName: nil,
      Port:        nil}
        Normal  SYNC  2m1s (x7 over 26m)  sc-gateway-controller  Programming of WasmPlugin "default/gcp-wasm-plugin" to AncestorRef {Group:       "gateway.networking.k8s.io",
      Kind:        "Gateway",
      Namespace:   "default",
      Name:        "external-http",
      SectionName: nil,
      Port:        nil} was a success
      
  3. Kirim traffic ke aplikasi Anda.

    Setelah Gateway, Rute, dan aplikasi di-deploy di cluster, Anda dapat meneruskan traffic ke aplikasi.

    1. Untuk mengakses aplikasi, Anda perlu menemukan alamat IP Gateway Anda.

      Di terminal, gunakan perintah berikut:

      kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda.

      Perintah ini menampilkan alamat IP Gateway. Dalam perintah lanjutan, ganti GATEWAY_IP_ADDRESS dengan alamat IP dari output.

    2. Uji pembaruan jalur dengan membuka layanan toko versi serviceextensions di store.example.com/serviceextensions:

      curl https://store.example.com/serviceextensions --resolve store.example.com:443:GATEWAY_IP_ADDRESS --cacert cacert.pem -v
      

      Output menampilkan Hello World.

Mengelola resource GCPWasmPlugin

Anda dapat mengupdate CRD GCPWasmPlugin dan memantau plugin.

Perbarui GCPWasmPlugin

Untuk memperbarui resource GCPWasmPlugin, ikuti langkah-langkah berikut:

  1. Lakukan perubahan di manifes GCPWasmPlugin Anda dan ikuti langkah-langkah yang dijelaskan dalam Men-deploy GCPWasmPlugin.

    Misalnya, untuk memiliki dua versi plugin, dengan satu versi melayani traffic dan yang lainnya tidak, perbarui file wasm-plugin.yaml Anda menjadi berikut:

    kind: GCPWasmPlugin
    apiVersion: networking.gke.io/v1
    metadata:
      name: gcp-wasm-plugin
    spec:
      versions:
      - name: wasm-plugin-version-v1
        description: "Serving Wasm Plugin version"
        image: "us-docker.pkg.dev/service-extensions-samples/plugins/local-reply:main"
        weight: 1000000
      - name: wasm-plugin-version-v2
        description: "Non serving Wasm Plugin version"
        image: "us-docker.pkg.dev/service-extensions-samples/plugins/local-reply:main"
        weight: 0
      logConfig:
        enabled: true
        sampleRate: 1000000
        minLogLevel: INFO
    

    Dalam contoh ini, hal berikut berlaku:

    • wasm-plugin-version-v1 memiliki weight 1000000, yang berarti ia melayani semua traffic.
    • wasm-plugin-version-v2 memiliki weight 0, yang berarti model tersebut tidak menayangkan traffic apa pun.
  2. Untuk memastikan Gateway diupdate, jalankan perintah berikut. Perintah ini mungkin memerlukan waktu beberapa menit untuk diselesaikan:

    kubectl describe gateway GATEWAY_NAME
    

    Ganti GATEWAY_NAME dengan nama Gateway Anda.

Memantau GCPWasmPlugin

Untuk melihat metrik GCPWasmPlugin di konsol Google Cloud , lihat Memantau dari perspektif plugin.

Saat Anda mencapai langkah dalam panduan yang mengharuskan Anda memilih nilai dari daftar Filter versi plugin, cari format prefix−WASM_PLUGIN_VERSION_NAME_FROM_FILE−suffix, dengan WASM_PLUGIN_VERSION_NAME_FROM_FILE adalah nama versi spesifik yang Anda tentukan dalam file konfigurasi GCPWasmPlugin.

Memecahkan masalah ekstensi traffic di Gateway

Bagian ini memberikan tips pemecahan masalah untuk mengonfigurasi ekstensi traffic di Gateway.

Gateway tidak ditemukan

Error berikut menunjukkan bahwa resource Gateway yang ditentukan di kolom targetRefs dari resource GCPTrafficExtension atau GCPRoutingExtension tidak ada:

error: failed to create resource: GCPTrafficExtension.networking.gke.io "my-traffic-extension" is invalid: spec.gatewayRef: gateway "my-gateway" not found in namespace "default"

Untuk mengatasi masalah ini, pastikan resource Gateway yang ditentukan di kolom targetRefs dari resource GCPTrafficExtension atau GCPRoutingExtension ada di namespace yang ditentukan.

Layanan atau port layanan tidak ditemukan

Error berikut menunjukkan bahwa Layanan atau port Layanan yang ditentukan di kolom backendRef pada resource GCPTrafficExtension atau GCPRoutingExtension tidak ada:

error: failed to create resource: GCPTrafficExtension.networking.gke.io "my-traffic-extension" is invalid: spec.service: service "callout-service" not found in namespace "default"

Untuk mengatasi masalah ini, pastikan Service dan port Service yang ditentukan di kolom backendRef resource GCPTrafficExtension atau GCPRoutingExtension ada di namespace yang ditentukan.

Tidak ada endpoint jaringan di NEG

Error berikut menunjukkan bahwa tidak ada endpoint jaringan di NEG yang terkait dengan Service yang ditentukan di kolom backendRef dari resource GCPTrafficExtension atau GCPRoutingExtension:

error: failed to create resource: GCPTrafficExtension.networking.gke.io "my-traffic-extension" is invalid: spec.service: no network endpoints found for service "callout-service"

Untuk mengatasi masalah ini, pastikan bahwa Service yang ditentukan di kolom backendRef pada resource GCPTrafficExtension atau GCPRoutingExtension memiliki endpoint jaringan.

Tidak ada balasan atau balasan dengan error saat mengirim permintaan

Jika Anda tidak menerima balasan, atau jika Anda menerima balasan dengan error saat Anda mengirim permintaan, hal ini mungkin menunjukkan bahwa Layanan info tidak berfungsi dengan benar.

Untuk mengatasi masalah ini, periksa log Layanan panggilan untuk menemukan error.

Kode error 404 di payload JSON

Error berikut menunjukkan bahwa Service anotasi tidak ditemukan atau tidak merespons permintaan:

{
  "error": {
    "code": 404,
    "message": "Requested entity was not found.",
    "status": "NOT_FOUND"
  }
}

Untuk mengatasi masalah ini, pastikan Layanan info promo berjalan, memproses di port yang benar, dan dikonfigurasi dengan benar di resource GCPTrafficExtension atau GCPRoutingExtension.

Kode error 500 di payload JSON

Error berikut menunjukkan bahwa Layanan balon teks mengalami error server internal:

{
  "error": {
    "code": 500,
    "message": "Internal server error.",
    "status": "INTERNAL"
  }
}

Untuk mengatasi masalah ini, periksa log Layanan panggilan untuk mengidentifikasi penyebab error server internal.

GCPWasmPlugin tidak ada

Error berikut menunjukkan bahwa resource GCPWasmPlugin tidak ada di project Anda:

Status:
  Ancestors:
    Ancestor Ref:
      Group:      gateway.networking.k8s.io
      Kind:       Gateway
      Name:       external-http
      Namespace:  default
    Conditions:
      Last Transition Time:  2025-03-06T16:27:57Z
      Message:
      Reason:                Accepted
      Status:                True
      Type:                  Accepted
      Last Transition Time:  2025-03-06T16:27:57Z
      Message:               error cause: invalid-wasm-plugin: GCPWasmPlugin default/my-wasm-plugin in GCPTrafficExtension default/my-gateway-plugin-extension does not exist
      Reason:                GCPWasmPluginNotFound
      Status:                False
      Type:                  ResolvedRefs
    Controller Name:         networking.gke.io/gateway

Untuk mengatasi masalah ini, buat GCPWasmPlugin yang sesuai di project Google Cloud atau arahkan ekstensi ke GCPWasmPlugin yang ada.

Langkah berikutnya