Dokumen ini memandu Anda men-deploy aplikasi contoh di dua cluster GKE di region yang berbeda, dan menunjukkan cara Gateway multi-cluster merutekan traffic secara cerdas saat melebihi batas kapasitas Service.
Load balancing berbasis kapasitas adalah fitur Gateway multi-cluster yang membantu Anda membangun aplikasi yang sangat andal dan tangguh. Dengan menentukan kapasitas Layanan, Anda dapat melindunginya dari kelebihan beban dan membantu memastikan pengalaman yang konsisten bagi pengguna Anda. Saat Layanan di satu cluster mencapai kapasitasnya, load balancer akan otomatis mengalihkan traffic ke cluster lain dengan kapasitas yang tersedia. Untuk mengetahui informasi selengkapnya tentang pengelolaan traffic, lihat Pengelolaan traffic GKE.
Dalam tutorial ini, Anda akan menggunakan aplikasi store contoh untuk mensimulasikan skenario dunia nyata dengan layanan belanja online dimiliki dan dioperasikan oleh tim terpisah serta di-deploy di seluruh fleet cluster GKE bersama.
Sebelum memulai
Gateway Multi-cluster memerlukan beberapa persiapan lingkungan sebelum dapat di-deploy. Sebelum melanjutkan, ikuti langkah-langkah di bagian Menyiapkan lingkungan untuk Gateway multi-cluster:
Deploy cluster GKE
Daftarkan cluster Anda ke fleet (jika belum terdaftar).
Aktifkan Service multi-cluster dan pengontrol Gateway multi-cluster.
Terakhir, tinjau batasan dan masalah umum GKE Gateway Controller sebelum Anda menggunakan controller di lingkungan Anda.
Men-deploy load balancing berbasis kapasitas
Latihan di bagian ini menunjukkan konsep load balancing dan kapasitas Service secara global dengan men-deploy aplikasi di dua cluster GKE di region berbeda. Traffic yang dihasilkan dikirim di berbagai tingkat permintaan per detik (RPS) untuk menunjukkan cara menyeimbangkan traffic di seluruh cluster dan region.
Diagram berikut menunjukkan topologi yang akan Anda deploy dan bagaimana traffic melakukan overflow antara cluster dan region ketika traffic telah melebihi kapasitas Service:
Menyiapkan lingkungan Anda
Ikuti Menyiapkan lingkungan Anda untuk Gateway multi-cluster untuk menyiapkan lingkungan Anda.
Pastikan resource GatewayClass sudah diinstal di cluster konfigurasi:
kubectl get gatewayclasses --context=gke-west-1Output-nya mirip dengan berikut ini:
NAME CONTROLLER ACCEPTED AGE gke-l7-global-external-managed networking.gke.io/gateway True 16h gke-l7-global-external-managed-mc networking.gke.io/gateway True 14h gke-l7-gxlb networking.gke.io/gateway True 16h gke-l7-gxlb-mc networking.gke.io/gateway True 14h gke-l7-regional-external-managed networking.gke.io/gateway True 16h gke-l7-regional-external-managed-mc networking.gke.io/gateway True 14h gke-l7-rilb networking.gke.io/gateway True 16h gke-l7-rilb-mc networking.gke.io/gateway True 14h
Men-deploy aplikasi
Deploy contoh server aplikasi web ke kedua cluster:
kubectl apply --context gke-west-1 -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-traffic-deploy.yaml
kubectl apply --context gke-east-1 -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-traffic-deploy.yaml
Output-nya mirip dengan berikut ini:
namespace/store created
deployment.apps/store created
Men-deploy Service, Gateway, dan HTTPRoute
Terapkan manifes
Serviceberikut ke clustergke-west-1dangke-east-1:cat << EOF | kubectl apply --context gke-west-1 -f - apiVersion: v1 kind: Service metadata: name: store namespace: traffic-test annotations: networking.gke.io/max-rate-per-endpoint: "10" spec: ports: - port: 8080 targetPort: 8080 name: http selector: app: store type: ClusterIP --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store namespace: traffic-test EOFcat << EOF | kubectl apply --context gke-east-1 -f - apiVersion: v1 kind: Service metadata: name: store namespace: traffic-test annotations: networking.gke.io/max-rate-per-endpoint: "10" spec: ports: - port: 8080 targetPort: 8080 name: http selector: app: store type: ClusterIP --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store namespace: traffic-test EOFLayanan dianotasi dengan
max-rate-per-endpointyang ditetapkan ke 10 permintaan per detik. Dengan 2 replika per cluster, setiap Service memiliki kapasitas 20 RPS per cluster.Untuk mengetahui informasi selengkapnya tentang cara memilih tingkat kapasitas Service untuk Service Anda, lihat Menentukan kapasitas Service.
Terapkan manifes
Gatewayberikut ke cluster konfigurasi,gke-west-1dalam contoh ini:cat << EOF | kubectl apply --context gke-west-1 -f - kind: Gateway apiVersion: gateway.networking.k8s.io/v1 metadata: name: store namespace: traffic-test spec: gatewayClassName: gke-l7-global-external-managed-mc listeners: - name: http protocol: HTTP port: 80 allowedRoutes: kinds: - kind: HTTPRoute EOFManifes menjelaskan Gateway eksternal multi-cluster yang men-deploy Load Balancer Aplikasi eksternal dengan alamat IP yang dapat diakses publik.
Terapkan manifes
HTTPRouteberikut ke cluster konfigurasi,gke-west-1dalam contoh ini:cat << EOF | kubectl apply --context gke-west-1 -f - kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1 metadata: name: store namespace: traffic-test labels: gateway: store spec: parentRefs: - kind: Gateway namespace: traffic-test name: store rules: - backendRefs: - name: store group: net.gke.io kind: ServiceImport port: 8080 EOFManifes menjelaskan HTTPRoute yang mengonfigurasi Gateway dengan aturan perutean yang mengarahkan semua traffic ke ServiceImport penyimpanan. ServiceImport
storeakan mengelompokkan Pod Servicestoredi kedua cluster dan memungkinkannya ditangani oleh load balancer sebagai satu Service.Anda dapat memeriksa peristiwa Gateway setelah beberapa menit untuk melihat apakah peristiwa sudah selesai di-deploy:
kubectl describe gateway store -n traffic-test --context gke-west-1Outputnya mirip dengan hal berikut ini:
... Status: Addresses: Type: IPAddress Value: 34.102.159.147 Conditions: Last Transition Time: 2023-10-12T21:40:59Z Message: The OSS Gateway API has deprecated this condition, do not depend on it. Observed Generation: 1 Reason: Scheduled Status: True Type: Scheduled Last Transition Time: 2023-10-12T21:40:59Z Message: Observed Generation: 1 Reason: Accepted Status: True Type: Accepted Last Transition Time: 2023-10-12T21:40:59Z Message: Observed Generation: 1 Reason: Programmed Status: True Type: Programmed Last Transition Time: 2023-10-12T21:40:59Z Message: The OSS Gateway API has altered the "Ready" condition semantics and reservedit for future use. GKE Gateway will stop emitting it in a future update, use "Programmed" instead. Observed Generation: 1 Reason: Ready Status: True Type: Ready Listeners: Attached Routes: 1 Conditions: Last Transition Time: 2023-10-12T21:40:59Z Message: Observed Generation: 1 Reason: Programmed Status: True Type: Programmed Last Transition Time: 2023-10-12T21:40:59Z Message: The OSS Gateway API has altered the "Ready" condition semantics and reservedit for future use. GKE Gateway will stop emitting it in a future update, use "Programmed" instead. Observed Generation: 1 Reason: Ready Status: True Type: Ready Name: http Supported Kinds: Group: gateway.networking.k8s.io Kind: HTTPRoute Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 12m mc-gateway-controller traffic-test/store Normal SYNC 6m43s mc-gateway-controller traffic-test/store Normal UPDATE 5m40s (x4 over 12m) mc-gateway-controller traffic-test/store Normal SYNC 118s (x6 over 10m) mc-gateway-controller SYNC on traffic-test/store was a successOutput ini menunjukkan bahwa Gateway berhasil di-deploy. Mungkin masih perlu waktu beberapa menit hingga traffic mulai diteruskan setelah Gateway di-deploy. Catat alamat IP di output ini karena akan digunakan pada langkah berikut.
Mengonfirmasi traffic
Pastikan traffic meneruskan ke aplikasi dengan menguji alamat IP Gateway menggunakan perintah curl:
curl GATEWAY_IP_ADDRESS
Output-nya mirip dengan berikut ini:
{
"cluster_name": "gke-west-1",
"host_header": "34.117.182.69",
"pod_name": "store-54785664b5-mxstv",
"pod_name_emoji": "👳🏿",
"project_id": "project",
"timestamp": "2021-11-01T14:06:38",
"zone": "us-west1-a"
}
Output ini menampilkan metadata Pod yang menunjukkan region tempat permintaan disalurkan.
Memverifikasi traffic menggunakan pengujian beban
Untuk memastikan bahwa load balancer berfungsi, Anda dapat men-deploy generator traffic di
cluster gke-west-1. Generator traffic akan menghasilkan traffic di berbagai
level beban untuk menunjukkan kapasitas dan kemampuan tambahan dari load
balancer. Langkah-langkah berikut menunjukkan tiga tingkat beban:
- 10 RPS, yang berada di bawah kapasitas untuk Service penyimpanan di
gke-west-1. - 30 RPS, yang melebihi kapasitas untuk Service penyimpanan
gke-west-1dan menyebabkan traffic mengalami overflow kegke-east-1. - 60 RPS, yang melebihi kapasitas untuk Service di kedua cluster.
Mengonfigurasi dasbor
Dapatkan nama URLmap dasar untuk Gateway Anda:
kubectl get gateway store -n traffic-test --context=gke-west-1 -o=jsonpath="{.metadata.annotations.networking\.gke\.io/url-maps}"Outputnya mirip dengan hal berikut ini:
/projects/PROJECT_NUMBER/global/urlMaps/gkemcg1-traffic-test-store-armvfyupay1tDi konsol Google Cloud , buka halaman Metrics Explorer.
Di bagian Select a metric, klik CODE: MQL.
Masukkan kueri berikut untuk mengamati metrik traffic untuk Service penyimpanan di kedua cluster Anda:
fetch https_lb_rule | metric 'loadbalancing.googleapis.com/https/backend_request_count' | filter (resource.url_map_name == 'GATEWAY_URL_MAP') | align rate(1m) | every 1m | group_by [resource.backend_scope], [value_backend_request_count_aggregate: aggregate(value.backend_request_count)]Ganti
GATEWAY_URL_MAPdengan nama peta URL dari langkah sebelumnya.Klik Jalankan kueri. Tunggu minimal 5 menit setelah men-deploy generator beban di bagian berikutnya agar metrik ditampilkan dalam diagram.
Menguji dengan 10 RPS
Deploy Pod ke cluster
gke-west-1Anda:kubectl run --context gke-west-1 -i --tty --rm loadgen \ --image=cyrilbkr/httperf \ --restart=Never \ -- /bin/sh -c 'httperf \ --server=GATEWAY_IP_ADDRESS \ --hog --uri="/zone" --port 80 --wsess=100000,1,1 --rate 10'Ganti
GATEWAY_IP_ADDRESSdengan alamat IP Gateway dari langkah sebelumnya.Output-nya mirip dengan yang berikut ini, dan menunjukkan bahwa generator traffic sedang mengirimkan traffic:
If you don't see a command prompt, try pressing enter.Generator beban terus mengirimkan 10 RPS ke Gateway. Meskipun traffic berasal dari dalam region Google Cloud , load balancer memperlakukannya sebagai traffic klien yang berasal dari Pantai Barat AS. Untuk menyimulasikan keberagaman klien yang realistis, generator beban akan mengirimkan setiap permintaan HTTP sebagai koneksi TCP baru, yang berarti traffic didistribusikan di seluruh Pod backend secara lebih merata.
Generator memerlukan waktu hingga 5 menit agar dapat menghasilkan traffic untuk dasbor.
Lihat dasbor Metrics Explorer Anda. Dua baris muncul, yang menunjukkan jumlah traffic yang di-load balancing ke setiap cluster:

Anda akan melihat bahwa
us-west1-amenerima traffic sekitar 10 RPS, sedangkanus-east1-btidak menerima traffic apa pun. Karena generator traffic berjalan dius-west1, semua traffic dikirim ke Service di clustergke-west-1.Hentikan generator beban menggunakan Ctrl+C, lalu hapus pod:
kubectl delete pod loadgen --context gke-west-1
Menguji dengan 30 RPS
Deploy generator beban lagi, tetapi kali ini dikonfigurasi untuk mengirim 30 RPS:
kubectl run --context gke-west-1 -i --tty --rm loadgen \ --image=cyrilbkr/httperf \ --restart=Never \ -- /bin/sh -c 'httperf \ --server=GATEWAY_IP_ADDRESS \ --hog --uri="/zone" --port 80 --wsess=100000,1,1 --rate 30'Generator memerlukan waktu hingga 5 menit agar dapat menghasilkan traffic untuk dasbor.
Melihat dasbor Cloud Ops Anda.

Anda akan melihat bahwa sekitar 20 RPS dikirim ke
us-west1-adan 10 RPS keus-east1-b. Hal ini menunjukkan bahwa Service digke-west-1telah digunakan sepenuhnya dan mengalami overflow 10 RPS traffic ke Service digke-east-1.Hentikan generator beban menggunakan Ctrl+C, lalu hapus Pod:
kubectl delete pod loadgen --context gke-west-1
Menguji dengan 60 RPS
Deploy generator beban yang dikonfigurasi untuk mengirim 60 RPS:
kubectl run --context gke-west-1 -i --tty --rm loadgen \ --image=cyrilbkr/httperf \ --restart=Never \ -- /bin/sh -c 'httperf \ --server=GATEWAY_IP_ADDRESS \ --hog --uri="/zone" --port 80 --wsess=100000,1,1 --rate 60'Tunggu 5 menit, lalu lihat dasbor Cloud Ops Anda. Sekarang, dasbor seharusnya sudah menunjukkan bahwa kedua cluster menerima sekitar 30 RPS. Karena semua Service digunakan berlebihan secara global, tidak ada spillover traffic dan Service akan menyerap semua traffic semaksimal mungkin.

Hentikan generator beban menggunakan Ctrl+C, lalu hapus Pod:
kubectl delete pod loadgen --context gke-west-1
Pembersihan
Setelah menyelesaikan latihan dalam dokumen ini, ikuti langkah-langkah berikut untuk menghapus resource dan mencegah timbulnya biaya yang tidak diinginkan pada akun Anda:
Batalkan pendaftaran cluster dari fleet jika tidak perlu didaftarkan untuk tujuan lain.
Nonaktifkan fitur
multiclusterservicediscovery:gcloud container fleet multi-cluster-services disableNonaktifkan Multi Cluster Ingress:
gcloud container fleet ingress disableNonaktifkan API:
gcloud services disable \ multiclusterservicediscovery.googleapis.com \ multiclusteringress.googleapis.com \ trafficdirector.googleapis.com \ --project=PROJECT_ID
Pemecahan masalah
Tidak ada upstream yang sehat
Gejala:
Masalah berikut dapat terjadi saat Anda membuat Gateway, tetapi tidak dapat mengakses layanan backend (kode respons 503):
no healthy upstream
Alasan:
Pesan error ini menunjukkan bahwa pemeriksa health check tidak dapat menemukan layanan backend yang sehat. Mungkin saja layanan backend Anda dalam kondisi baik, tetapi Anda mungkin perlu menyesuaikan health check.
Solusi:
Untuk mengatasi masalah ini, sesuaikan health check Anda berdasarkan persyaratan aplikasi Anda (misalnya, /health) menggunakan HealthCheckPolicy.
Langkah berikutnya
- Pelajari Pengontrol gateway lebih lanjut.