Halaman ini menjelaskan cara Google Kubernetes Engine (GKE) menggunakan Service Extensions 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:
- Konsep dasar jaringan GKE
- GKE Gateway API
- GKE Gateway Controller
- GatewayClass GKE
- Ringkasan Service Extensions
Ringkasan
GKE menggunakan Service Extensions untuk menambahkan logika kustom ke Cloud Load Balancing. Anda dapat menggunakan Service Extensions 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 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.
- GCPAuthzExtension: ekstensi ini memungkinkan Anda mendelegasikan keputusan otorisasi ke mesin otorisasi kustom atau pihak ketiga (seperti firewall aplikasi web eksternal) atau Identity-Aware Proxy. Ekstensi ini digunakan dengan resource GCPAuthzPolicy, yang menerapkan kontrol akses pada traffic yang masuk ke Gateway dan menentukan kapan callout ke ekstensi harus terjadi.
Ekstensi terhubung ke Gateway. Untuk Gateway cluster tunggal, ekstensi mereferensikan resource Service, resource GCPWasmPlugin, atau resource GoogleAPIServiceName. Untuk Gateway multi-cluster, ekstensi mereferensikan resource ServiceImport atau resource GoogleAPIServiceName.
Merujuk resource Layanan 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 Anda 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 dengan menggunakan kolom
googleAPIServiceNamedalam GCPTrafficExtension atau GCPAuthzExtension.
Dalam diagram berikut, resource GCPRoutingExtension dilampirkan ke Gateway dan mereferensikan beberapa Layanan. Ekstensi mengontrol perutean traffic ke Layanan.
Dalam diagram berikut, resource GCPTrafficExtension dilampirkan ke Gateway dan mereferensikan Service, GoogleAPIServiceName, atau GCPWasmPlugin. Ekstensi mengubah header dan payload permintaan dan respons.
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 Service Extensions.
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 batasan dan pembatasan 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 Service Extensions Gateway di GKE:
| Kategori | Batas dan pembatasan |
|---|---|
| Load Balancer |
GCPRoutingExtension didukung untuk load balancer berikut:
gke-l7-global-external-managed).
|
| Rantai dan spesifikasi ekstensi |
|
| Waktu tunggu |
|
| MatchCondition |
|
| Header |
|
| Metadata |
|
| Acara |
|
| RequestBodySendMode |
|
| ResponseBodySendMode |
|
| Referensi resource |
|
| GCPWasmPlugin |
|
| GCPAuthzPolicy dan GCPAuthzExtension |
|
googleAPIServiceName |
|
backendRef |
Saat Anda mereferensikan Layanan yang menggunakan backendRef dalam Ekstensi, Anda harus memenuhi kondisi berikut:
|
observabilityMode |
Kolom observabilityMode dapat ditetapkan di Extension dengan batasan berikut:
|
Merujuk ke Layanan
Di Service Extensions, Anda dapat merujuk ke Layanan yang menghosting logika kustom yang ingin Anda jalankan oleh load balancer. Gateway tidak memiliki Service Extensions secara default.
Untuk mengonfigurasi Ekstensi Layanan GKE, ikuti langkah-langkah berikut:
Men-deploy Layanan panggilan balik backend: buat Layanan Kubernetes yang merepresentasikan layanan backend untuk eksekusi logika kustom. Load balancer memanggil layanan ini.
Mengonfigurasi Service Extensions: gunakan ekstensi yang sesuai berdasarkan jenis load balancer Anda.
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.
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 inspeksi 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 singkat 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:
(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 panggilan balik Anda, ganti kode berikut:
SECRET_NAME: nama secret untuk layanan info Andapath-to-cert: jalur file ke sertifikat Andapath-to-key: jalur file ke kunci Anda
Untuk memverifikasi bahwa secret telah ditambahkan, jalankan perintah berikut:
kubectl get secrets SECRET_NAMEGanti
SECRET_NAMEdengan nama rahasia untuk layanan panggilan Anda.Outputnya akan mirip dengan berikut ini:
NAME TYPE DATA AGE SECRET_NAME kubernetes.io/tls 2 12sTentukan resource Deployment dan Service.
Anda harus menentukan hal berikut:
- Deployment: untuk mengelola pod aplikasi yang berisi logika kustom untuk Service Extensions Anda.
- Service: untuk mengekspos pod aplikasi yang dikelola oleh Deployment sebagai layanan jaringan.
Buat contoh manifes
extension-service-app.yamlyang 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: storeGanti 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.
Terapkan manifes
extension-service-app.yaml:kubectl apply -f extension-service-app.yaml
Verifikasi konfigurasi Anda:
Pastikan aplikasi telah di-deploy:
kubectl get pod --selector app=storeSetelah aplikasi mulai berjalan, outputnya akan mirip dengan berikut ini:
NAME READY STATUS RESTARTS AGE extension-service-app-85f466bc9b-b5mf4 1/1 Running 0 7sPastikan bahwa Service telah di-deploy:
kubectl get service extension-serviceOutputnya 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 merutekan ulang traffic menggunakan GCPRoutingExtension. Untuk mengonfigurasi
GCPRoutingExtension, perbarui HTTPRoute untuk menentukan permintaan untuk host
service-extensions.com.
Perbarui HTTPRoute. Ubah HTTPRoute Anda untuk menyertakan nama host atau jalur yang akan memicu ekstensi perutean.
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: 8080Ganti
GATEWAY_NAMEdengan nama Gateway Anda.Terapkan manifes
store-route.yaml:kubectl apply -f store-route.yaml
Tentukan GCPRoutingExtension.
Simpan konfigurasi GCPRoutingExtension di file
gcp-routing-extension.yamlcontoh: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: 443Ganti
GATEWAY_NAMEdengan nama Gateway Anda.Terapkan manifes contoh ke cluster Anda:
kubectl apply -f gcp-routing-extension.yaml
Verifikasi konfigurasi GCPRoutingExtension dan binding-nya ke Gateway.
Periksa deployment GCPRoutingExtension:
kubectl describe gcproutingextension my-gateway-extensionOutputnya 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 kolomSpec, yang berisi definisi perilaku ekstensi.Verifikasi binding Gateway:
Pastikan bahwa GCPRoutingExtension terikat ke Gateway. Proses ini mungkin memerlukan waktu beberapa menit:
kubectl describe gateway GATEWAY_NAMEGanti
GATEWAY_NAMEdengan 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-extensionsmengonfirmasi pengikatan gateway ke GCPRoutingExtension.Periksa status ekstensi dengan mengonfirmasi bahwa GCPRoutingExtension memiliki status
Programmeddengan alasanProgrammingSucceeded. Perintah ini mungkin memerlukan waktu beberapa menit.kubectl describe gcproutingextension my-gateway-extensionOutputnya 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 successKolom
Status.Conditionsmenampilkan kondisiProgrammeddenganStatus: TruedanReason: ProgrammingSucceeded. Informasi ini mengonfirmasi bahwa ekstensi berhasil diterapkan.
Kirim traffic ke aplikasi Anda.
Setelah Gateway, Rute, dan aplikasi di-deploy di cluster, Anda dapat meneruskan traffic ke aplikasi.
Untuk mengakses aplikasi, Anda harus 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_NAMEdengan nama Gateway Anda.Perintah ini menampilkan alamat IP Gateway. Dalam perintah lanjutan, ganti
GATEWAY_IP_ADDRESSdengan alamat IP dari output.Uji update jalur dengan membuka layanan toko versi
serviceextensionsdistore.example.com/serviceextensions:curl http://store.example.com/serviceextensions --resolve store.example.com:80:GATEWAY_IP_ADDRESS -vOutputnya 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. 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.
Perbarui HTTPRoute. Ubah HTTPRoute untuk menyertakan nama host atau jalur yang akan memicu ekstensi traffic.
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: 8080Ganti
GATEWAY_NAMEdengan nama Gateway Anda, sepertiinternal-http,external-http, atauglobal-external-http.Terapkan manifes
store-route.yamlke cluster Anda:kubectl apply -f store-route.yaml
Tentukan GCPTrafficExtension.
Simpan konfigurasi GCPTrafficExtension ke file
gcp-traffic-extension.yamlcontoh: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 - ResponseBodyGanti
GATEWAY_NAMEdengan nama Gateway Anda, sebagaiinternal-http,external-http, atauglobal-external-http.Terapkan manifes contoh ke cluster Anda:
kubectl apply -f gcp-traffic-extension.yaml
Verifikasi konfigurasi GCPTrafficExtension dan binding-nya ke Gateway.
Periksa deployment GCPTrafficExtension:
kubectl describe gcptrafficextension my-traffic-extensionOutputnya 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-extensiondalam namespace default. Bagian ini menampilkan kolomSpec, yang berisi definisi perilaku ekstensi.Verifikasi binding Gateway:
Pastikan GCPTrafficExtension terikat ke Gateway. Perintah ini mungkin memerlukan waktu beberapa menit untuk diselesaikan:
kubectl describe gateway GATEWAY_NAMEOutputnya 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-extensionsmengonfirmasi pengikatan.Periksa status ekstensi:
Untuk memeriksa status ekstensi GCPTrafficExtension, jalankan perintah berikut:
kubectl describe gcptrafficextension my-traffic-extensionPastikan GCPTrafficExtension memiliki status
Programmeddengan alasanProgrammingSucceeded. Pemrosesan perintah ini dapat memerlukan waktu beberapa menit.Output resource GCPTrafficExtension mirip dengan berikut ini:
Name: my-traffic-extension Namespace: default Labels: <none> Annotations: <none> API Version: networking.gke.io/v1 Kind: GCPTrafficExtension Metadata: Creation Timestamp: 2025-03-02T17:12:30Z Generation: 1 Resource Version: 31284378 UID: ec8efaa0-d8e7-4e1b-9fd4-0ae0ef3c74d0 Spec: Extension Chains: Extensions: Authority: myext.com Backend Ref: Group: Kind: Service Name: extension-service Port: 443 Name: ext1 Timeout: 1s Match Condition: Cel Expressions: Cel Matcher: request.path.contains("serviceextensions") Name: chain1 Target Refs: Group: gateway.networking.k8s.io Kind: Gateway Name: GATEWAY_NAME Status: Ancestors: Ancestor Ref: Group: gateway.networking.k8s.io Kind: Gateway Name: GATEWAY_NAME Namespace: default Conditions: Last Transition Time: 2025-03-02T17:14:15Z Message: Reason: Accepted Status: True Type: Accepted Last Transition Time: 2025-03-02T17:14:15Z Message: Reason: ProgrammingSucceeded Status: True Type: Programmed Controller Name: networking.gke.io/gateway Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 2m31s sc-gateway-controller default/my-traffic-extension Normal SYNC 51s (x2 over 98s) sc-gateway-controller Attachment of GCPTrafficExtension "default/my-gateway-extension" to AncestorRef {Group: "gateway.networking.k8s.io", Kind: "Gateway", Namespace: "default", Name: GATEWAY_NAME, SectionName: nil, Port: nil} was a success Normal SYNC 23s sc-gateway-controller Reconciliation of GCPTrafficExtension "default/my-traffic-extension" to AncestorRef {Group: "gateway.networking.k8s.io", Kind: "Gateway", Namespace: "default", Name: GATEWAY_NAME, SectionName: nil, Port: nil} was a successKolom
Status.Conditionsmenampilkan kondisiProgrammeddenganStatus: TruedanReason: ProgrammingSucceeded. Informasi ini mengonfirmasi bahwa ekstensi berhasil diterapkan.
Kirim traffic ke aplikasi Anda.
Setelah Gateway, Rute, dan aplikasi di-deploy di cluster, Anda dapat meneruskan traffic ke aplikasi.
Untuk mengakses aplikasi, Anda harus 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_NAMEdengan nama Gateway Anda.Perintah ini menampilkan alamat IP Gateway. Dalam perintah lanjutan, ganti
GATEWAY_IP_ADDRESSdengan alamat IP dari output.Uji update jalur dengan membuka layanan toko versi
serviceextensionsdistore.example.com/serviceextensions:curl http://store.example.com/serviceextensions --resolve store.example.com:80:GATEWAY_IP_ADDRESS -vOutputnya 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 }
Mengonfigurasi resource GCPAuthzExtension
Anda dapat menggunakan GCPAuthzExtension dengan GCPAuthzPolicy untuk menerapkan keputusan otorisasi yang kompleks dengan mendelegasikannya ke layanan eksternal atau Identity-Aware Proxy (IAP).
Tentukan GCPAuthzExtension:
Anda dapat mengonfigurasi GCPAuthzExtension untuk mereferensikan layanan ekstensi kustom atau IAP sebagai layanan panggilan.
Opsi 1: Merujuk layanan ekstensi kustom
- Simpan konfigurasi GCPAuthzExtension ke file
gcp-authz-extension.yamlcontoh:
apiVersion: networking.gke.io/v1 kind: GCPAuthzExtension metadata: name: my-authz-ext namespace: default spec: backendRef: kind: Service name: "${authz-service}" forwardHeaders: - Authorization failOpen: false timeout: "0.1s" wireFormat: EXT_PROC_GRPCDalam contoh sebelumnya,
"${authz-service}"adalah layanan ekstensi, yang harus ada di namespace yang sama dengan GCPAuthzPolicy.- Terapkan manifes:
kubectl apply -f gcp-authz-extension.yaml- Simpan konfigurasi GCPAuthzExtension ke file
Opsi 2: Merujuk IAP sebagai layanan info kustom
Anda juga dapat mengonfigurasi IAP sebagai layanan info kustom dengan menentukan
iap.googleapis.comdi kolomgoogleAPIServiceName:- Simpan konfigurasi GCPAuthzExtension ke file
authz-extension-iap.yamlcontoh:
apiVersion: networking.gke.io/v1 kind: GCPAuthzExtension metadata: name: my-authz-ext-iap namespace: default spec: googleAPIServiceName: iap.googleapis.com timeout: 50ms failOpen: false- Terapkan manifes:
kubectl apply -f authz-extension-iap.yaml- Simpan konfigurasi GCPAuthzExtension ke file
Tentukan GCPAuthzPolicy:
GCPAuthzPolicy menargetkan Gateway dan menentukan tindakan yang akan dilakukan pada traffic yang cocok:
Siapkan
CUSTOMkebijakan otorisasi:Tindakan
CUSTOMmendelegasikan keputusan otorisasi ke ekstensi yang Anda buat pada langkah sebelumnya.Simpan manifes berikut ke
gcp-authz-policy.yaml:apiVersion: networking.gke.io/v1 kind: GCPAuthzPolicy metadata: name: my-gateway-authz namespace: default spec: enforcementLevel: L7 targetRefs: - group: gateway.networking.k8s.io kind: Gateway name: "GATEWAY_NAME" rules: - from: sources: - principals: - principal_selector: CLIENT_CERT_URI_SANS principal: exact: "spiffee://cluster.local/ns1/pod1" - to: operations: - paths: - exact: "/api/secure-endpoint" action: CUSTOM customProvider: authzExtension: extensionRefs: - group: networking.gke.io kind: GCPAuthzExtension name: my-authz-extGanti
GATEWAY_NAMEdengan nama Gateway Anda.Terapkan manifes:
kubectl apply -f gcp-authz-policy.yaml
Merujuk ke resource GCPWasmPlugin
Anda dapat menyuntikkan 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:
Deploy GCPWasmPlugin: buat dan deploy CustomResourceDefinition (CRD) GCPWasmPlugin yang berisi kode kustom untuk modul Wasm Anda. Anda dapat menggunakan GCPWasmPlugin dengan GCPTrafficExtension atau GCPEdgeExtension untuk
gke-l7-global-external-managedGatewayClass.Mengonfigurasi ekstensi layanan: mengonfigurasi salah satu ekstensi berikut dengan GCPWasmPlugin:
Deploy GCPWasmPlugin
GCPWasmPlugin memungkinkan Anda menyuntikkan logika kustom yang ditulis pengguna langsung ke jalur data load balancer Cloud de Confiance . Resource GCPWasmPlugin menunjuk ke image modul Wasm di Artifact Registry, yang kemudian dieksekusi oleh load balancer.
Sebelum melanjutkan langkah-langkah berikut, pastikan Anda telah mengupload modul Wasm ke repositori Artifact Registry. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan kode plugin.
Untuk men-deploy resource GCPWasmPlugin, selesaikan langkah-langkah berikut:
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: INFOPerhatikan 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 adalah1,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 keINFOsecara default.
Terapkan manifes
wasm-plugin.yaml:kubectl apply -f wasm-plugin.yamlVerifikasi bahwa plugin telah di-deploy:
kubectl describe gcpwasmplugins.networking.gke.io gcp-wasm-pluginOutputnya mirip dengan hal berikut ini:
Name: gcp-wasm-plugin Namespace: default Labels: <none> Annotations: <none> API Version: networking.gke.io/v1 Kind: GCPWasmPlugin Metadata: Creation Timestamp: 2025-08-08T19:54:18Z Generation: 1 Resource Version: 44578 UID: 549a12c7-91d1-43ad-a406-d6157a799b79 Spec: Log Config: Enabled: true Min Log Level: INFO Sample Rate: 1000000 Versions: Description: Test wasm plugin version Image: us-docker.pkg.dev/service-extensions-samples/plugins/local-reply:main Name: wasm-plugin-version Weight: 1000000 Events: <none>
Mengonfigurasi 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:
Tentukan GCPTrafficExtension.
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-pluginGanti
GATEWAY_NAMEdengan nama Gateway Anda, sepertiglobal-external-http.Terapkan manifes contoh ke cluster Anda:
kubectl apply -f gcp-traffic-extension-with-plugin.yaml
Verifikasi konfigurasi GCPTrafficExtension dan binding-nya ke Gateway.
Periksa deployment GCPTrafficExtension:
kubectl describe gcptrafficextensions.networking.gke.io gcp-traffic-extension-with-pluginOutputnya 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_NAMEdengan nama Gateway Anda.Output menampilkan detail GCPTrafficExtension bernama
gcp-traffic-extension-with-plugindalam namespace default. File ini menampilkan kolomSpec, yang berisi definisi perilaku ekstensi.Verifikasi binding Gateway:
Pastikan GCPTrafficExtension terikat ke Gateway. Perintah ini mungkin memerlukan waktu beberapa menit untuk diselesaikan:
kubectl describe gateway GATEWAY_NAMEGanti
GATEWAY_NAMEdengan 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, dannetworking.gke.io/wasm-pluginsmengonfirmasi pengikatan.Periksa status ekstensi:
Pastikan GCPTrafficExtension memiliki status
Programmeddengan alasanProgrammingSucceeded. Pemrosesan perintah ini dapat memerlukan waktu beberapa menit.kubectl describe gcptrafficextensions.networking.gke.io gcp-traffic-extension-with-pluginOutputnya 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 successPeriksa status plugin.
Konfirmasi bahwa resource GCPWasmPlugin memiliki status
Programmeddengan alasanProgrammingSucceeded. Pemrosesan perintah ini dapat memerlukan waktu beberapa menit.kubectl describe gcpwasmplugins.networking.gke.io gcp-wasm-pluginOutputnya 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
Kirim traffic ke aplikasi Anda.
Setelah Gateway, Rute, dan aplikasi di-deploy di cluster, Anda dapat meneruskan traffic ke aplikasi.
Untuk mengakses aplikasi, Anda harus 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_NAMEdengan nama Gateway Anda.Perintah ini menampilkan alamat IP Gateway. Dalam perintah lanjutan, ganti
GATEWAY_IP_ADDRESSdengan alamat IP dari output.Uji update jalur dengan membuka layanan toko versi
serviceextensionsdistore.example.com/serviceextensions:curl https://store.example.com/serviceextensions --resolve store.example.com:443:GATEWAY_IP_ADDRESS --cacert cacert.pem -vOutput akan menampilkan
Hello World.
Mengonfigurasi GCPEdgeExtension dengan GCPWasmPlugin
Untuk menambahkan logika kustom ke Load Balancer Aplikasi eksternal global menggunakan modul WebAssembly (Wasm), konfigurasi GCPEdgeExtension yang mereferensikan GCPWasmPlugin.
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-pluginGanti
GATEWAY_NAMEdengan nama Gateway Anda.Terapkan manifes ke cluster Anda:
kubectl apply -f gcp-edge-extension-with-plugin.yamlVerifikasi konfigurasi GCPEdgeExtension dan binding-nya ke Gateway:
Periksa status ekstensi:
Untuk memeriksa status ekstensi GCPEdgeExtension, jalankan perintah berikut:
kubectl describe gcpedgeextensions.networking.gke.io gcp-edge-extension-with-pluginPastikan GCPEdgeExtension memiliki status
Programmeddengan alasanProgrammingSucceeded. Pemrosesan perintah ini mungkin membutuhkan waktu beberapa menit.Verifikasi binding Gateway:
Jalankan perintah berikut:
kubectl describe gateway GATEWAY_NAMEGanti
GATEWAY_NAMEdengan nama Gateway Anda.Pastikan GCPEdgeExtension terikat ke Gateway. Pemrosesan perintah ini mungkin memerlukan waktu beberapa menit. Output 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.
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_ADDRESSdengan alamat IP dari output.Kirim permintaan ke URL dasar:
curl http://store.example.com --resolve store.example.com:80:GATEWAY_IP_ADDRESS -vGateway merutekan permintaan ke layanan default, seperti
store-v1.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 -vEkstensi memicu plugin Wasm, yang merutekan permintaan ke layanan sekunder, seperti
store-v2.
Mengelola resource GCPWasmPlugin
Anda dapat mengupdate CRD GCPWasmPlugin dan memantau plugin.
Mengupdate GCPWasmPlugin
Untuk memperbarui resource GCPWasmPlugin, ikuti langkah-langkah berikut:
Lakukan perubahan pada 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.yamlAnda 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: INFODalam contoh ini, hal berikut berlaku:
wasm-plugin-version-v1memilikiweight1000000, yang berarti melayani semua traffic.wasm-plugin-version-v2memilikiweight0, yang berarti tidak menayangkan traffic apa pun.
Untuk memastikan Gateway diupdate, jalankan perintah berikut. Perintah ini mungkin memerlukan waktu beberapa menit untuk diselesaikan:
kubectl describe gateway GATEWAY_NAMEGanti
GATEWAY_NAMEdengan 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
Plugin version filter, cari format
prefix−WASM_PLUGIN_VERSION_NAME_FROM_FILE−suffix, dengan
WASM_PLUGIN_VERSION_NAME_FROM_FILE adalah nama versi spesifik yang Anda tentukan dalam
file konfigurasi GCPWasmPlugin.
Memecahkan masalah ekstensi traffic di Gateway
Bagian ini memberikan tips pemecahan masalah untuk mengonfigurasi ekstensi traffic di Gateway.
Gateway tidak ditemukan
Error berikut menunjukkan bahwa resource Gateway yang ditentukan di kolom
targetRefs dari resource GCPTrafficExtension, 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 dari resource GCPTrafficExtension atau GCPRoutingExtension
ada di namespace yang ditentukan.
Layanan atau port layanan tidak ditemukan
Error berikut menunjukkan bahwa Service atau port Service 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 Layanan 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 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 tambahan berjalan, mendengarkan di port yang benar, dan layanan 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 Cloud de Confiance project atau arahkan ekstensi ke GCPWasmPlugin yang ada.
Langkah berikutnya
- Pelajari GKE Inference Gateway.
- Pelajari cara Menyajikan LLM dengan GKE Inference Gateway.
- Pelajari cara Melihat metrik kemampuan observasi.