Menyesuaikan traffic GKE Gateway menggunakan Ekstensi Layanan


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

Halaman ini ditujukan untuk 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. Ekstensi dilampirkan ke Gateway dan mereferensikan Service atau GoogleAPIServiceName. GoogleAPIServiceName hanya didukung untuk GCPTrafficExtensions.

Anda dapat mengubah header dan payload HTTP untuk permintaan dan respons, atau mengontrol pemilihan layanan backend atau kebijakan keamanan. Anda dapat menggunakan Ekstensi Layanan untuk tugas seperti pemisahan 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 pemilihan rute traffic. Fitur ini didukung untuk Load Balancer Aplikasi eksternal regional dan Load Balancer Aplikasi internal regional.

    Resource `GCPRoutingExtension` dilampirkan ke Gateway dan
        mereferensikan Layanan. Ekstensi ini
        mengontrol pemilihan rute traffic.
    Gambar: Cara kerja `GCPRoutingExtension` dengan Gateway
  • GCPTrafficExtension: ekstensi ini menyisipkan logika kustom ke Cloud Load Balancing. Hal ini memungkinkan layanan ekstensi mengubah header dan payload permintaan dan respons. GCPTrafficExtension tidak memengaruhi pemilihan layanan backend atau kebijakan keamanan layanan backend.

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

Google Cloud Kompatibilitas Ekstensi Layanan dengan GatewayClass

Tabel berikut menjelaskan kompatibilitas ekstensi layanan Google Cloud dengan GatewayClass yang berbeda:

GatewayClass GCPRoutingExtension GCPTrafficExtension
gke-l7-rilb Didukung Didukung
gke-l7-regional-external-managed Didukung Didukung
gke-l7-global-external-managed Tidak didukung Didukung

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan 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 gcloud components update.

Persyaratan GKE Gateway Controller

  • Cluster Anda harus menggunakan GKE versi 1.28 atau yang lebih baru.
  • Cluster Anda harus mengaktifkan Gateway API.
  • Anda harus memiliki resource Gateway yang dikonfigurasi.
  • 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 hanya didukung untuk Load Balancer Aplikasi eksternal regional dan Load Balancer Aplikasi internal regional (gke-l7-regional-external-managed dan Class Gateway gke-l7-rilb) dan tidak didukung oleh Class Gateway gke-l7-global-external-managed.
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 di streaming dalam Ekstensi harus antara 10 dan 1.000 milidetik. Batas satu detik ini berlaku untuk ekstensi Rute dan Traffic.
  • Setiap MatchCondition dalam ExtensionChain dibatasi hingga maksimal 10 CELExpressions.
  • String MatchCondition yang dihasilkan dan dikirim ke GCE memiliki batas karakter sebesar 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 maksimal 50 nama header HTTP.
  • Peta Metadata dalam Extension dapat memiliki maksimal 16 properti.
  • Kunci dalam peta Metadata harus memiliki panjang antara 1 dan 63 karakter.
  • Panjang nilai dalam peta Metadata harus 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.
googleAPIServiceName dan backendRef Saat mereferensikan Layanan yang menggunakan backendRef di Ekstensi, Anda harus memenuhi kondisi berikut:
  • Harus menggunakan HTTP2 sebagai appProtocol-nya.
  • Harus berada di namespace yang sama dengan Ekstensi dan Gateway yang direferensikan 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 salah satu dari backendRef atau googleAPIServiceName untuk Extension.
  • Harus menetapkan authority, jika backendRef ditetapkan.
  • Harus menetapkan authority, jika googleAPIServiceName ditetapkan.
  • Konfigurasikan requestBodySendMode untuk ekstensi hanya menggunakan backendRef.
  • Konfigurasikan responseBodySendMode untuk ekstensi hanya menggunakan backendRef.

Mengonfigurasi Ekstensi Layanan GKE

Anda dapat menyesuaikan pemilihan rute traffic, mengubah payload permintaan atau respons, dan berintegrasi dengan layanan eksternal dengan mengonfigurasi Ekstensi Layanan GKE. Gateway tidak memiliki Ekstensi Layanan secara default.

Untuk mengonfigurasi Ekstensi Layanan GKE:

  1. Men-deploy Gateway: untuk mengonfigurasi ekstensi Layanan GKE, Anda harus men-deploy Gateway terlebih dahulu, yang mengarahkan traffic eksternal ke cluster Anda. Ini dapat berupa Load Balancer Aplikasi eksternal global, Load Balancer Aplikasi eksternal regional, atau Gateway Load Balancer Aplikasi internal regional.

    Untuk informasi selengkapnya tentang men-deploy Gateway, lihat Men-deploy Gateway.

  2. Men-deploy Layanan info backend: membuat Layanan Kubernetes yang mewakili layanan backend untuk eksekusi logika kustom. Load balancer memanggil layanan ini.

  3. Mengonfigurasi Ekstensi Layanan: konfigurasikan Ekstensi Layanan yang sesuai berdasarkan jenis dan persyaratan load balancer Anda.

    1. GCPRoutingExtension untuk Gateway regional: gunakan ekstensi ini untuk Load Balancer Aplikasi eksternal regional dan Load Balancer Aplikasi internal regional untuk menerapkan logika pemilihan rute 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 perubahan header atau pemeriksaan payload, di berbagai jenis load balancer.

Men-deploy layanan info backend

Layanan info 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 pemilihan rute traffic.

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

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

    Untuk membuat secret TLS bagi layanan info Anda, ganti kode berikut:

    • SECRET_NAME: nama secret untuk layanan callout 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 secret untuk layanan callout Anda.

    Outputnya akan mirip dengan berikut ini:

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

    Anda harus menentukan hal berikut:

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

      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, output-nya akan mirip dengan berikut:

      NAME                                     READY   STATUS    RESTARTS   AGE
      extension-service-app-85f466bc9b-b5mf4   1/1     Running   0          7s
      
    2. Pastikan bahwa Layanan 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 alur 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 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 binding-nya 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 bernama my-gateway-extension, dalam namespace default. Output menampilkan kolom Spec, yang berisi definisi perilaku ekstensi yang seharusnya.

    2. Verifikasi binding Gateway:

      1. Pastikan GCPRoutingExtension terikat ke Gateway. Tindakan 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 menunjukkan anotasi, yang digunakan GKE untuk menyimpan link antara Gateway dan resource Google Cloud yang mendasarinya. Anotasi networking.gke.io/lb-route-extensions mengonfirmasi binding gateway ke GCPRoutingExtension.

      2. Periksa status ekstensi dengan mengonfirmasi bahwa GCPRoutingExtension memiliki status Reconciled dengan alasan ReconciliationSucceeded. 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:                ReconciliationSucceeded
              Status:                True
              Type:                  Reconciled
            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 Reconciled dengan Status: True dan Reason: ReconciliationSucceeded.

        Benar dan Alasan: ReconciliationSucceeded. Informasi ini mengonfirmasi bahwa ekstensi berhasil diterapkan.

  4. Kirim traffic ke aplikasi Anda.

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

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

      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 menghasilkan 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"
      }
      

Mengonfigurasi 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 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, seperti 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 binding-nya 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. Class ini menampilkan kolom Spec, yang berisi definisi perilaku ekstensi.

    2. Verifikasi binding Gateway:

      Pastikan GCPTrafficExtension terikat ke Gateway. Pemrosesan perintah 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-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 menunjukkan anotasi, yang digunakan GKE untuk menyimpan link antara Gateway dan resource Google Cloud yang mendasarinya. Anotasi networking.gke.io/lb-traffic-extensions mengonfirmasi binding.

    3. Periksa status ekstensi:

      Pastikan GCPTrafficExtension memiliki status Reconciled dengan alasan ReconciliationSucceeded. Pemrosesan perintah ini mungkin memerlukan waktu beberapa menit.

      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:    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:                ReconciliationSucceeded
            Status:                True
            Type:                  Reconciled
          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 Reconciled dengan Status: True dan Reason: ReconciliationSucceeded. Informasi ini mengonfirmasi bahwa ekstensi berhasil diterapkan.

  4. Kirim traffic ke aplikasi Anda.

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

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

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

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 port Layanan atau Layanan yang ditentukan di kolom backendRef dari 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 port Layanan dan Layanan 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 dikaitkan dengan Layanan 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 Layanan yang ditentukan di kolom backendRef 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 mengirim permintaan, hal ini mungkin menunjukkan bahwa Layanan info tidak berfungsi dengan benar.

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

Kode error 404 dalam payload JSON

Error berikut menunjukkan bahwa Layanan info 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, bahwa layanan tersebut mendengarkan di port yang benar, dan bahwa layanan dikonfigurasi dengan benar di resource GCPTrafficExtension atau GCPRoutingExtension.

Kode error 500 dalam payload JSON

Error berikut menunjukkan bahwa Layanan info mengalami error server internal:

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

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

Langkah berikutnya