Men-deploy Gateway multi-cluster untuk load balancing berbasis kapasitas

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:

  1. Deploy cluster GKE

  2. Daftarkan cluster Anda ke fleet (jika belum terdaftar).

  3. 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:

Traffic yang melakukan overflow dari satu cluster ke cluster lain

Menyiapkan lingkungan Anda

  1. Ikuti Menyiapkan lingkungan Anda untuk Gateway multi-cluster untuk menyiapkan lingkungan Anda.

  2. Pastikan resource GatewayClass sudah diinstal di cluster konfigurasi:

    kubectl get gatewayclasses --context=gke-west-1
    

    Output-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

  1. Terapkan manifes Service berikut ke cluster gke-west-1 dan gke-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
    EOF
    
    cat << 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
    EOF
    

    Layanan dianotasi dengan max-rate-per-endpoint yang 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.

  2. Terapkan manifes Gateway berikut ke cluster konfigurasi, gke-west-1 dalam 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
    EOF
    

    Manifes menjelaskan Gateway eksternal multi-cluster yang men-deploy Load Balancer Aplikasi eksternal dengan alamat IP yang dapat diakses publik.

  3. Terapkan manifes HTTPRoute berikut ke cluster konfigurasi, gke-west-1 dalam 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
    EOF
    

    Manifes menjelaskan HTTPRoute yang mengonfigurasi Gateway dengan aturan perutean yang mengarahkan semua traffic ke ServiceImport penyimpanan. ServiceImport store akan mengelompokkan Pod Service store di 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-1
    

    Outputnya 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 success
    

    Output 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-1 dan menyebabkan traffic mengalami overflow ke gke-east-1.
  • 60 RPS, yang melebihi kapasitas untuk Service di kedua cluster.

Mengonfigurasi dasbor

  1. 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-armvfyupay1t
    
  2. Di konsol Google Cloud , buka halaman Metrics Explorer.

    Buka Metrics explorer

  3. Di bagian Select a metric, klik CODE: MQL.

  4. 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_MAP dengan nama peta URL dari langkah sebelumnya.

  5. Klik Jalankan kueri. Tunggu minimal 5 menit setelah men-deploy generator beban di bagian berikutnya agar metrik ditampilkan dalam diagram.

Menguji dengan 10 RPS

  1. Deploy Pod ke cluster gke-west-1 Anda:

    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_ADDRESS dengan 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.

  2. Lihat dasbor Metrics Explorer Anda. Dua baris muncul, yang menunjukkan jumlah traffic yang di-load balancing ke setiap cluster:

    Grafik yang menampilkan beban traffic yang di-load balancing ke cluster

    Anda akan melihat bahwa us-west1-a menerima traffic sekitar 10 RPS, sedangkan us-east1-b tidak menerima traffic apa pun. Karena generator traffic berjalan di us-west1, semua traffic dikirim ke Service di cluster gke-west-1.

  3. Hentikan generator beban menggunakan Ctrl+C, lalu hapus pod:

    kubectl delete pod loadgen --context gke-west-1
    

Menguji dengan 30 RPS

  1. 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.

  2. Melihat dasbor Cloud Ops Anda.

    Grafik yang menampilkan traffic yang mengalami overflow hingga ke gke-east-1

    Anda akan melihat bahwa sekitar 20 RPS dikirim ke us-west1-a dan 10 RPS ke us-east1-b. Hal ini menunjukkan bahwa Service di gke-west-1 telah digunakan sepenuhnya dan mengalami overflow 10 RPS traffic ke Service di gke-east-1.

  3. Hentikan generator beban menggunakan Ctrl+C, lalu hapus Pod:

    kubectl delete pod loadgen --context gke-west-1
    

Menguji dengan 60 RPS

  1. 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'
    
  2. 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.

    Grafik yang menunjukkan Service yang digunakan berlebihan

  3. 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:

  1. Hapus cluster.

  2. Batalkan pendaftaran cluster dari fleet jika tidak perlu didaftarkan untuk tujuan lain.

  3. Nonaktifkan fitur multiclusterservicediscovery:

    gcloud container fleet multi-cluster-services disable
    
  4. Nonaktifkan Multi Cluster Ingress:

    gcloud container fleet ingress disable
    
  5. Nonaktifkan 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