Menyesuaikan traffic GKE Gateway menggunakan Service Extensions

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

Halaman ini ditujukan untuk admin Akun dan Identitas GKE serta Developer yang perlu mengonfigurasi logika pengelolaan traffic kustom menggunakan Service Extensions.

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-tugas seperti pemisahan traffic lanjutan, autentikasi kustom, atau pencatatan 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.
  • GCPEdgeExtension: ekstensi ini memungkinkan Anda memengaruhi pemilihan layanan backend dan kunci cache Cloud CDN dengan mengubah header permintaan. Fitur ini didukung secara eksklusif untuk Load Balancer Terkelola Eksternal Global.

Ekstensi terhubung ke Gateway. Untuk Gateway cluster tunggal, ekstensi merujuk ke resource Service, resource GCPWasmPlugin, atau resource googleAPIServiceName. Untuk Gateway multi-cluster, ekstensi merujuk ke resource ServiceImport atau resource googleAPIServiceName.

  • Merujuk resource Service atau resource ServiceImport: 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.

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

  • Merujuk Layanan Google API: Anda juga dapat merujuk layanan Google API secara langsung 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

Dalam diagram berikut, resource GCPTrafficExtension dilampirkan ke Gateway dan merujuk ke 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 dan 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
  • Untuk 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 Cloud de Confiance 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.
  • Untuk menggunakan resource ServiceImport, cluster Anda harus menggunakan GKE versi 1.34.3 atau yang lebih baru.
  • Anda harus memiliki resource Gateway yang dikonfigurasi untuk Gateway multi-cluster internal. Resource ini dapat berupa Load Balancer Aplikasi eksternal global, Load Balancer Aplikasi internal lintas-region, Load Balancer Aplikasi eksternal regional, atau Gateway Load Balancer Aplikasi internal regional.
  • Cluster Anda harus mengaktifkan Gateway API.
  • Anda harus memiliki resource Gateway yang dikonfigurasi. Resource ini dapat berupa Load Balancer Aplikasi eksternal global, Load Balancer Aplikasi eksternal regional, atau Gateway 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 eksternal regional (Class Gateway gke-l7-regional-external-managed-mc)
  • Load Balancer Aplikasi internal regional (gke-l7-rilb Gateway Class)
  • Load Balancer Aplikasi internal regional (gke-l7-rilb-mc Gateway Class)
  • Load Balancer Aplikasi internal lintas region (Class Gateway gke-l7-cross-regional-internal-managed-mc)
GCPTrafficExtension didukung untuk load balancer berikut:
  • Load Balancer Aplikasi eksternal regional (Class Gateway gke-l7-regional-external-managed)
  • Load Balancer Aplikasi eksternal regional (Class Gateway gke-l7-regional-external-managed-mc)
  • Load Balancer Aplikasi internal regional (gke-l7-rilb Gateway Class)
  • Load Balancer Aplikasi internal regional (gke-l7-rilb-mc Gateway Class)
  • Load Balancer Aplikasi eksternal global (gke-l7-global-external-managed Gateway Class)
  • Load Balancer Aplikasi eksternal global (gke-l7-global-external-managed-mc Gateway Class)
  • Load Balancer Aplikasi internal lintas region (Class Gateway gke-l7-cross-regional-internal-managed-mc)
GCPEdgeExtension didukung secara eksklusif untuk Load Balancer Terkelola Eksternal Global (Class Gateway gke-l7-global-external-managed).
Rantai dan spesifikasi ekstensi
  • Untuk GCPTrafficExtension, setiap ExtensionChain dapat memiliki maksimal 3 Extensions.
  • Untuk GCPRoutingExtension dan GCPEdgeExtension, setiap ExtensionChain dibatasi hingga 1 Extension.
  • Semua jenis ekstensi (Traffic, Routing, dan Edge) dapat memiliki maksimum 5 ExtensionChains per resource.
Waktu tunggu
  • Waktu tunggu untuk setiap pesan individual di stream dalam Ekstensi harus antara 10 dan 10.000 milidetik. Waktu tunggu default adalah satu detik.
MatchCondition
  • 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.
  • Untuk GCPEdgeExtension:
    • Atribut respons (misalnya, response.code) di CELMatcher tidak didukung.
    • Atribut permintaan yang tidak didukung mencakup backend_service_name dan backend_service_project_number.
    • Jumlah ekspresi reguler dibatasi hingga 1.
  • Hanya kolom backendRefs jenis Service atau ServiceImport yang didukung di CELExpression.
  • Kolom backendRefs tidak didukung dengan gke-l7-global-external-managed dan gke-l7-global-external-managed-mc Gateway Classes
Header
  • Daftar ForwardHeaders dalam Extension dapat berisi maksimum 50 nama header HTTP.
Metadata
  • Peta Metadata dalam Extension dapat memiliki maksimal 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
  • SupportedEvents diperlukan untuk GCPTrafficExtension.
  • SupportedEvents bersifat opsional untuk GCPRoutingExtension.
  • Untuk GCPEdgeExtension, daftar SupportedEvents hanya boleh berisi RequestHeaders.
  • Jika tidak ditentukan, peristiwa RequestHeaders diasumsikan didukung.
RequestBodySendMode
  • RequestBodySendMode hanya dapat digunakan dengan backendRefs jenis Service atau ServiceImport.
  • RequestBodySendMode hanya dapat ditetapkan jika SupportedEvents menyertakan RequestBody.
  • Jika SupportedEvents menyertakan RequestBody, tetapi RequestBodySendMode tidak ditetapkan, nilai default Streamed akan digunakan.
  • Jika RequestBodySendMode ditetapkan ke FullDuplexStreamed, SupportedEvents harus menyertakan RequestBody dan RequestTrailers.
  • Untuk GCPTrafficExtension, hanya FullDuplexStreamed yang didukung.
ResponseBodySendMode
  • Kolom ResponseBodySendMode hanya didukung untuk GCPTrafficExtension.
  • ResponseBodySendMode hanya dapat digunakan dengan backendRefs jenis Service atau ServiceImport.
  • Kolom hanya dapat ditetapkan jika SupportedEvents menyertakan ResponseBody.
  • Jika SupportedEvents menyertakan ResponseBody, tetapi ResponseBodySendMode tidak ditetapkan, nilai default Streamed akan digunakan.
  • Jika kolom ini disetel ke FullDuplexStreamed, SupportedEvents harus menyertakan ResponseBody dan ResponseTrailers.
Referensi resource
  • Untuk GCPEdgeExtension, satu-satunya jenis backend yang didukung adalah GCPWasmPlugin.
  • Kolom googleAPIServiceName tidak didukung untuk GCPEdgeExtension.
  • Gateway, ekstensi Edge, dan plugin harus berada di namespace yang sama.
GCPWasmPlugin
  • Kolom GCPWasmPlugin hanya didukung untuk GCPTrafficExtension dan GCPEdgeExtension.
  • 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
  • Kolom googleAPIServiceName hanya didukung untuk GCPTrafficExtension.
  • authority tidak boleh ditetapkan, jika googleAPIServiceName ditetapkan.
  • Tepat satu dari backendRef atau googleAPIServiceName dapat ditetapkan untuk Extension.
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.
  • 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.
observabilityMode Kolom observabilityMode dapat ditetapkan di Extension dengan batasan berikut:
  • Didukung untuk cluster GKE pada versi 1.35.0-gke.3047000 atau yang lebih baru.
  • Didukung oleh resource GCPTrafficExtension dan GCPRoutingExtension yang terlampir ke gateway dengan Class Gateway regional.
  • observabilityMode yang diaktifkan hanya didukung jika kolom requestBodySendMode dan responseBodySendMode tidak ditetapkan, atau ditetapkan ke Streamed.

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. Men-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 callout 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 bagi layanan info, ganti kode berikut:

    • SECRET_NAME: nama secret untuk layanan info 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 definisi Deployment dan 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:public-image-e42d951
              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_PATH
                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
      

      Ganti kode berikut:

      • POD_NAME: nama Pod Anda.
      • SECRET_NAME: nama rahasia untuk layanan panggilan Anda.
      • TLS_SERVER_CERT_PATH: jalur ke sertifikat server TLS dalam Pod.
      • TLS_SERVER_PRIVKEY: jalur ke kunci pribadi server TLS dalam Pod.
    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 Anda untuk menyertakan nama host atau jalur yang akan memicu ekstensi perutean.

    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
        

        Ganti GATEWAY_NAME dengan nama Gateway Anda.

        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 resource Cloud de Confiance 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 update 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"
      }
      

Mengonfigurasi GCPTrafficExtension

Anda dapat menggunakan GCPTrafficExtension untuk menggunakan kemampuan pengelolaan traffic lanjutan dalam lingkungan Cloud de Confiance . 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, perutean, transformasi, dan kebijakan keamanan yang canggih.

  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
          supportedEvents:
            - RequestHeaders
            - RequestBody
            - ResponseHeaders
            - ResponseBody
      

      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. Bagian ini menampilkan kolom Spec, yang berisi definisi 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 Cloud de Confiance yang mendasarinya. Anotasi networking.gke.io/lb-traffic-extensions mengonfirmasi pengikatan.

    3. Periksa status ekstensi:

      Untuk memeriksa status ekstensi GCPTrafficExtension, jalankan perintah berikut:

      kubectl describe gcptrafficextension my-traffic-extension
      

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

      Output resource GCPTrafficExtension mirip dengan berikut:

      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 update 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 menyisipkan logika kustom langsung ke jalur data load balancer menggunakan GCPWasmPlugin dengan GCPTrafficExtension atau GCPEdgeExtension. 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 GCPWasmPlugin CustomResourceDefinition (CRD) yang berisi kode kustom untuk modul Wasm Anda. Anda dapat menggunakan GCPWasmPlugin dengan GCPTrafficExtension atau GCPEdgeExtension untuk GatewayClass gke-l7-global-external-managed.

  2. Mengonfigurasi ekstensi layanan: konfigurasi salah satu ekstensi berikut dengan GCPWasmPlugin:

Men-deploy GCPWasmPlugin

GCPWasmPlugin memungkinkan Anda menyuntikkan logika kustom yang ditulis pengguna langsung ke jalur data load balancer Cloud de Confiance . Resource GCPWasmPlugin mengarah 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>
    

Konfigurasi GCPTrafficExtension

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 Cloud de Confiance 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>
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda.

      Output menampilkan detail GCPTrafficExtension bernama gcp-traffic-extension-with-plugin dalam namespace default. File ini menampilkan kolom Spec, yang berisi definisi 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
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda.

      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 Cloud de Confianceyang 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 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 update 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 akan menampilkan Hello World.

Mengonfigurasi GCPEdgeExtension dengan GCPWasmPlugin

Untuk menambahkan logika kustom ke Load Balancer Aplikasi eksternal global menggunakan modul WebAssembly (Wasm), konfigurasikan GCPEdgeExtension yang mereferensikan GCPWasmPlugin.

  1. Simpan manifes GCPEdgeExtension berikut sebagai gcp-edge-extension-with-plugin.yaml:

    kind: GCPEdgeExtension
    apiVersion: networking.gke.io/v1
    metadata:
      name: gcp-edge-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.startsWith("/serviceextensions")
        extensions:
        - name: ext1
          supportedEvents:
          - RequestHeaders
          backendRef:
            group: "networking.gke.io"
            kind: GCPWasmPlugin
            name: gcp-wasm-plugin
    

    Ganti GATEWAY_NAME dengan nama Gateway Anda.

  2. Terapkan manifes ke cluster Anda:

    kubectl apply -f gcp-edge-extension-with-plugin.yaml
    
  3. Verifikasi konfigurasi GCPEdgeExtension dan pengikatannya ke Gateway:

    1. Periksa status ekstensi:

      Untuk memeriksa status ekstensi GCPEdgeExtension, jalankan perintah berikut:

      kubectl describe gcpedgeextensions.networking.gke.io gcp-edge-extension-with-plugin
      

      Pastikan GCPEdgeExtension memiliki status Programmed dengan alasan ProgrammingSucceeded. Pemrosesan perintah ini mungkin membutuhkan waktu beberapa menit.

    2. Verifikasi binding Gateway:

      Jalankan perintah berikut:

      kubectl describe gateway GATEWAY_NAME
      

      Ganti GATEWAY_NAME dengan nama Gateway Anda.

      Pastikan GCPEdgeExtension terikat ke Gateway. Pemrosesan perintah ini mungkin memerlukan waktu beberapa menit. Output-nya mencakup anotasi networking.gke.io/lb-edge-extensions, yang mengonfirmasi link antara Gateway dan ekstensi edge.

Mengirim traffic ke ekstensi

Setelah men-deploy Gateway dan GCPEdgeExtension, uji logika perutean dengan mengirim traffic ke aplikasi Anda.

  1. Untuk mengakses aplikasi Anda, dapatkan alamat IP Gateway Anda:

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

    Outputnya adalah alamat IP Gateway. Dalam perintah berikut, ganti GATEWAY_IP_ADDRESS dengan alamat IP dari output.

  2. Kirim permintaan ke URL dasar:

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

    Gateway merutekan permintaan ke layanan default, seperti store-v1.

  3. Kirim permintaan ke jalur yang ditentukan di celMatcher Anda, seperti /serviceextensions:

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

    Ekstensi memicu plugin Wasm, yang merutekan permintaan ke layanan sekunder, seperti store-v2.

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 versi 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 melayani semua traffic.
    • wasm-plugin-version-v2 memiliki weight 0, yang berarti 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 Cloud de Confiance , 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 tertentu 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, GCPRoutingExtension, atau GCPEdgeExtension 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 pada 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 pada 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 balon kata 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 teks promosi 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 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 panggilan 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 untuk GCPTrafficExtension atau GCPEdgeExtension:

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 Cloud de Confiance atau arahkan ekstensi ke GCPWasmPlugin yang ada.

Langkah berikutnya