Menyesuaikan traffic GKE Gateway menggunakan Ekstensi Layanan


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

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

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

Ringkasan

GKE menggunakan Ekstensi Layanan untuk menambahkan logika kustom ke Cloud Load Balancing. Ekstensi dilampirkan ke Gateway dan mereferensikan Service atau GoogleAPIServiceName. GoogleAPIServiceName didukung hanya untuk GCPTrafficExtensions.

Anda dapat mengubah header dan payload HTTP untuk permintaan dan respons, atau mengontrol perutean traffic, tanpa memengaruhi pemilihan layanan backend atau kebijakan keamanan. Anda dapat menggunakan Ekstensi Layanan untuk tugas seperti pemisahan traffic lanjutan, autentikasi kustom, atau pencatatan permintaan.

Pengontrol Gateway GKE mendukung Ekstensi Layanan berikut:

  • GCPRoutingExtension: ekstensi ini menambahkan logika kustom ke dalam Cloud Load Balancing untuk mengontrol perutean 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
        mengontrol perutean traffic.
    Gambar: Cara kerja GCPRoutingExtension dengan Gateway
  • GCPTrafficExtension: ekstensi ini menyisipkan logika kustom ke Cloud Load Balancing. Dengan demikian, layanan ekstensi dapat 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
        mengubah header dan payload permintaan dan respons.
    Gambar: Cara kerja GCPTrafficExtension dengan Gateway

Trusted Cloud by S3NS Kompatibilitas Ekstensi Layanan dengan GatewayClass

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

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.
  • 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 Trusted Cloud Ekstensi Layanan, lihat Harga.

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

  • Pahami kuota dan batas di kuota Ekstensi Layanan.

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

  • Tinjau pembatasan dan batasan untuk Ekstensi Layanan.

Persyaratan GKE Gateway Controller

  • Cluster Anda harus menggunakan GKE versi 1.33 atau yang lebih baru.
  • 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 (Class Gateway gke-l7-regional-external-managed dan gke-l7-rilb) dan tidak didukung oleh Class Gateway gke-l7-global-external-managed.
Rantai dan spesifikasi ekstensi
  • Untuk GCPTrafficExtension, setiap ExtensionChain dapat memiliki maksimal 3 Extensions.
  • Untuk GCPRoutingExtension, setiap ExtensionChain dibatasi hingga 1 Extension.
  • Setiap GCPTrafficExtensionSpec dan GCPRoutingExtensionSpec dapat memiliki maksimal 5 ExtensionChains.
Pengaturan waktu dan pencocokan
  • Waktu tunggu untuk setiap pesan individual di stream 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 maksimum 10 CELExpressions.
  • String MatchCondition yang dihasilkan dan dikirim ke GCE memiliki batas karakter 512.
  • String CELMatcher dalam CELExpression memiliki panjang maksimum 512 karakter dan harus mematuhi pola tertentu. Kami tidak mendukung kolom BackendRefs dari CELExpression.
Header dan metadata
  • Daftar ForwardHeaders dalam Extension dapat berisi maksimum 50 nama header HTTP.
  • Peta Metadata dalam Extension dapat memiliki maksimum 16 properti.
  • Kunci dalam peta Metadata harus memiliki panjang antara 1 dan 63 karakter.
  • Nilai dalam peta Metadata harus memiliki panjang antara 1 dan 1.023 karakter.
Acara
  • Untuk GCPRoutingExtension, jika requestBodySendMode tidak ditetapkan, daftar supportedEvents hanya dapat berisi peristiwa RequestHeaders.
  • Untuk GCPRoutingExtension, jika requestBodySendMode disetel ke FullDuplexStreamed, daftar supportedEvents hanya dapat berisi peristiwa RequestHeaders, RequestBody, dan RequestTrailers.
GCPTrafficExtension
  • Kolom responseBodySendMode hanya didukung untuk GCPTrafficExtension.
  • Kolom googleAPIServiceName hanya didukung untuk GCPTrafficExtension.
googleAPIServiceName dan backendRef Saat Anda mereferensikan Layanan yang menggunakan backendRef dalam Ekstensi, Anda harus memenuhi kondisi berikut:
  • Harus menggunakan HTTP2 sebagai appProtocol.
  • Harus berada di namespace yang sama dengan Ekstensi dan Gateway yang dirujuk oleh Ekstensi.
  • Tidak dapat menggunakan IAP.
  • Tidak dapat menggunakan kebijakan keamanan Google Cloud Armor (kolom securityPolicy dari GCPBackendPolicyConfig.
  • Tidak dapat menggunakan Cloud CDN.
  • Harus menetapkan tepat satu di antara backendRef atau googleAPIServiceName untuk Extension.
  • Harus menetapkan authority, jika backendRef ditetapkan.
  • Harus menetapkan authority, jika googleAPIServiceName ditetapkan.
  • Konfigurasi requestBodySendMode untuk ekstensi dengan hanya menggunakan backendRef.
  • Konfigurasi responseBodySendMode untuk ekstensi dengan hanya menggunakan backendRef.

Mengonfigurasi Ekstensi Layanan GKE

Anda dapat menyesuaikan perutean 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 mengetahui informasi selengkapnya tentang men-deploy Gateway, lihat Men-deploy Gateway.

  2. Men-deploy Layanan panggilan balik backend: buat Layanan Kubernetes yang merepresentasikan layanan backend untuk eksekusi logika kustom. Load balancer memanggil layanan ini.

  3. Konfigurasi Ekstensi Layanan: konfigurasi 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 guna menerapkan logika perutean kustom dalam region.

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

Men-deploy layanan panggilan balik backend

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

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

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

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

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

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

    kubectl get secrets SECRET_NAME
    

    Ganti SECRET_NAME dengan nama rahasia untuk layanan panggilan Anda.

    Outputnya akan mirip dengan berikut ini:

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

    Anda harus menentukan hal berikut:

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

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

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

    1. Pastikan aplikasi telah di-deploy:

      kubectl get pod --selector app=store
      

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

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

      kubectl get service extension-service
      

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

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

Mengonfigurasi Ekstensi Layanan

Anda dapat mengonfigurasi GCPRoutingExtension atau GCPTrafficExtension untuk menyesuaikan aliran traffic.

Mengonfigurasi GCPRoutingExtension untuk Gateway regional

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

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

    1. Simpan contoh manifes 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 sampel ke cluster Anda:

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

    1. Periksa deployment GCPRoutingExtension:

      kubectl describe gcproutingextension my-gateway-extension
      

      Outputnya mirip dengan hal berikut ini:

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

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

    2. Verifikasi binding Gateway:

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

        kubectl describe gateway GATEWAY_NAME
        

        Outputnya mirip dengan hal berikut ini:

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

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

      2. Periksa status ekstensi dengan mengonfirmasi bahwa GCPRoutingExtension memiliki status 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, Rute, dan aplikasi di-deploy di cluster, Anda dapat meneruskan traffic ke aplikasi.

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

      Di terminal, gunakan perintah berikut:

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

      Ganti GATEWAY_NAME dengan nama Gateway Anda.

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

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

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

      Outputnya mirip dengan hal berikut ini:

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

Konfigurasi GCPTrafficExtension

Anda dapat menggunakan GCPTrafficExtension untuk menggunakan kemampuan pengelolaan traffic lanjutan dalam lingkungan Trusted 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 contoh manifes berikut sebagai file store-route.yaml:

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

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

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

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

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

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

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

    2. Terapkan manifes sampel ke cluster Anda:

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

    1. Periksa deployment GCPTrafficExtension:

      kubectl describe gcptrafficextension my-traffic-extension
      

      Outputnya mirip dengan hal berikut ini:

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

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

    2. Verifikasi binding Gateway:

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

      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 Trusted Cloud yang mendasarinya. Anotasi networking.gke.io/lb-traffic-extensions mengonfirmasi pengikatan.

    3. Periksa status ekstensi:

      Konfirmasi bahwa 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, Rute, dan aplikasi di-deploy di cluster, Anda dapat meneruskan traffic ke aplikasi.

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

      Di terminal, gunakan perintah berikut:

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

      Ganti GATEWAY_NAME dengan nama Gateway Anda.

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

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

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

      Outputnya mirip dengan hal berikut ini:

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

Memecahkan masalah ekstensi traffic di Gateway

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

Gateway tidak ditemukan

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

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

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

Layanan atau port layanan tidak ditemukan

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

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

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

Tidak ada endpoint jaringan di NEG

Error berikut menunjukkan bahwa tidak ada endpoint jaringan di NEG yang terkait dengan Layanan 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 info tidak berfungsi dengan benar.

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

Kode error 404 di payload JSON

Error berikut menunjukkan bahwa Service balon 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 promosi berjalan, mendengarkan di port yang benar, dan dikonfigurasi dengan benar di resource GCPTrafficExtension atau GCPRoutingExtension.

Kode error 500 di payload JSON

Error berikut menunjukkan bahwa Layanan callout 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.

Langkah berikutnya