Dokumen ini menunjukkan cara mengonfigurasi dan memverifikasi load balancing Maglev untuk Layanan di GKE Dataplane V2.
Maglev adalah algoritma hashing yang konsisten yang menyediakan load balancing ber-throughput tinggi dan berlatensi rendah. Maglev meminimalkan paket yang terputus dan gangguan koneksi saat Pod backend diskalakan, diperbarui, atau dijadwalkan ulang dengan membantu memastikan bahwa alur yang sama secara konsisten dipetakan ke backend yang sama.
Untuk mengetahui informasi selengkapnya, lihat makalah penelitian algoritma hashing yang konsisten Maglev.
Kami merekomendasikan fitur ini untuk beban kerja dengan koneksi yang berjalan lama atau aplikasi stateful yang perubahan backend-nya tidak boleh mengganggu alur yang ada.
Untuk mengetahui informasi tentang overhead resource dan pertimbangan skalabilitas, lihat Konsep GKE Dataplane V2.
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.
Prasyarat dan batas
- Versi GKE: 1.36.0-gke.2882000 dan yang lebih baru
- GKE Dataplane V2: diaktifkan
- Mode cluster: Autopilot dan Standard
Buat cluster GKE dengan GKE Dataplane V2
Untuk menggunakan Maglev, Anda harus memiliki cluster GKE dengan GKE Dataplane V2 yang diaktifkan.
Autopilot
GKE Dataplane V2 diaktifkan secara default di cluster Autopilot. Untuk membuat cluster Autopilot dan mengambil konfigurasinya, jalankan perintah berikut:
gcloud container clusters create-auto CLUSTER_NAME \
--region=COMPUTE_REGION \
--release-channel=rapid
gcloud container clusters get-credentials CLUSTER_NAME \
--region=COMPUTE_REGION
Standar
Untuk mengaktifkan GKE Dataplane V2 di cluster Standard, gunakan tanda --enable-dataplane-v2. Untuk membuat cluster Standard dan mengambil konfigurasinya, jalankan perintah berikut:
gcloud container clusters create CLUSTER_NAME \
--zone=COMPUTE_ZONE \
--enable-dataplane-v2 \
--cluster-version=1.36.0-gke.2882000
gcloud container clusters get-credentials CLUSTER_NAME \
--zone=COMPUTE_ZONE
Men-deploy aplikasi backend
Sebelum mengonfigurasi Service load balancing, deploy aplikasi backend untuk menangani traffic. Deployment ini menjalankan lima replika aplikasi contoh hello-app.
Simpan manifes berikut sebagai
echo-backend.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: echo-backend spec: replicas: 5 selector: matchLabels: app: echo-backend template: metadata: labels: app: echo-backend spec: containers: - name: hello image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0" ports: - containerPort: 8080Terapkan manifes:
kubectl apply -f echo-backend.yaml
Mengonfigurasi Service load balancing
Anda dapat mengonfigurasi Layanan untuk menggunakan algoritma load balancing Maglev
atau algoritma load balancing acak default. Kedua Service menargetkan Deployment echo-backend yang dibuat pada langkah sebelumnya.
Mengonfigurasi Layanan Maglev
Untuk mengaktifkan load balancing Maglev, tambahkan anotasi gke.networking.io/lb-algorithm: "maglev"
ke metadata Service selama pembuatan.
Simpan manifes berikut sebagai
maglev-service.yaml:apiVersion: v1 kind: Service metadata: name: maglev-service annotations: gke.networking.io/lb-algorithm: "maglev" spec: selector: app: echo-backend ports: - protocol: TCP port: 80 targetPort: 8080Terapkan manifes:
kubectl apply -f maglev-service.yaml
Mengonfigurasi Layanan acak
Secara default, Service menggunakan algoritma load balancing acak. Anda tidak perlu menentukan anotasi untuk menggunakan algoritma default, tetapi contoh berikut secara eksplisit mengonfigurasinya untuk perbandingan.
Simpan manifes berikut sebagai
random-service.yaml:apiVersion: v1 kind: Service metadata: name: random-service annotations: gke.networking.io/lb-algorithm: "random" spec: selector: app: echo-backend ports: - protocol: TCP port: 80 targetPort: 8080Terapkan manifes:
kubectl apply -f random-service.yaml
Memverifikasi konsistensi traffic
Anda dapat memverifikasi perbedaan konsistensi pemilihan rute antara Maglev dan load balancing acak dengan men-deploy Pod klien pengujian yang mengirim traffic dari port sumber tetap.
Memverifikasi konsistensi traffic Maglev
Maglev merutekan permintaan dari port sumber yang sama secara konsisten ke Pod backend yang sama.
Simpan manifes berikut sebagai
client-maglev.yaml:apiVersion: v1 kind: Pod metadata: name: client-maglev spec: restartPolicy: Never containers: - name: curl image: curlimages/curl:8.2.0 command: ["/bin/sh", "-c"] args: - | while true; do curl -s -H "Connection: close" http://maglev-service:80 --local-port 54321 | grep Hostname sleep 0.5 doneFlag
--local-portmemaksa port sumber, dan headerConnection: closemembantu memastikan bahwa klien dapat segera menggunakan kembali port sumber untuk permintaan berikutnya.Terapkan manifes:
kubectl apply -f client-maglev.yamlSaat Pod berjalan, periksa log:
kubectl logs client-maglevOutput yang diharapkan:
Output menampilkan nama host yang sama yang dicetak berulang kali, yang menunjukkan bahwa semua traffic dari klien secara konsisten dirutekan ke Pod backend yang sama:
Hostname: echo-backend-5c78f66dbf-abcde Hostname: echo-backend-5c78f66dbf-abcde
Memverifikasi distribusi traffic default (acak)
Service default mendistribusikan traffic dari port sumber yang sama ke berbagai Pod backend.
Simpan manifes berikut sebagai
client-random.yaml:apiVersion: v1 kind: Pod metadata: name: client-random spec: restartPolicy: Never containers: - name: curl image: curlimages/curl:8.2.0 command: ["/bin/sh", "-c"] args: - | while true; do curl -s -H "Connection: close" http://random-service:80 --local-port 54321 | grep Hostname sleep 0.5 doneTerapkan manifes:
kubectl apply -f client-random.yamlSaat Pod berjalan, periksa log:
kubectl logs client-randomOutput yang diharapkan:
Output menampilkan beberapa nama host yang berbeda, yang menunjukkan bahwa traffic didistribusikan ke berbagai Pod:
Hostname: echo-backend-5c78f66dbf-abcde Hostname: echo-backend-5c78f66dbf-fghij Hostname: echo-backend-5c78f66dbf-klmno ...
Pembersihan
Untuk membersihkan resource yang digunakan dalam tutorial ini, jalankan perintah berikut:
Hapus Pod, Layanan, dan Deployment klien:
kubectl delete service maglev-service random-service kubectl delete deployment echo-backend kubectl delete pod client-maglev client-randomHapus cluster GKE:
Autopilot
gcloud container clusters delete CLUSTER_NAME --region=COMPUTE_REGION
Standar
gcloud container clusters delete CLUSTER_NAME --zone=COMPUTE_ZONE