In diesem Dokument wird beschrieben, wie Sie Maglev-Load-Balancing für Dienste in GKE Dataplane V2 konfigurieren und überprüfen.
Maglev ist ein Algorithmus für konsistentes Hashing, der Load-Balancing mit hohem Durchsatz und niedriger Latenz bietet. Maglev minimiert Paketverluste und Verbindungsunterbrechungen, wenn Backend-Pods skaliert, aktualisiert oder neu geplant werden. So wird dafür gesorgt, dass derselbe Flow immer demselben Backend zugeordnet wird.
Weitere Informationen finden Sie im Maglev-Consistent-Hashing-Algorithmus.
Wir empfehlen diese Funktion für Arbeitslasten mit langlebigen Verbindungen oder zustandsorientierte Anwendungen, bei denen Backend-Änderungen bestehende Abläufe nicht unterbrechen dürfen.
Informationen zum Ressourcen-Overhead und zu Skalierbarkeitsaspekten finden Sie unter GKE Dataplane V2-Konzepte.
Hinweis
Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:
- Aktivieren Sie die Google Kubernetes Engine API. Google Kubernetes Engine API aktivieren
- Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem Befehl
gcloud components updateab. In früheren gcloud CLI-Versionen werden die Befehle in diesem Dokument möglicherweise nicht unterstützt.
Voraussetzungen und Einschränkungen
- GKE-Version:1.36.0-gke.2882000 und höher
- GKE Dataplane V2: aktiviert
- Clustermodi: Autopilot und Standard
GKE-Cluster mit GKE Dataplane V2 erstellen
Damit Sie Maglev verwenden können, benötigen Sie einen GKE-Cluster mit aktiviertem GKE Dataplane V2.
Autopilot
Für Autopilot-Cluster ist GKE Dataplane V2 standardmäßig aktiviert. Führen Sie den folgenden Befehl aus, um einen Autopilot-Cluster zu erstellen und seine Konfiguration abzurufen:
gcloud container clusters create-auto CLUSTER_NAME \
--region=COMPUTE_REGION \
--release-channel=rapid
gcloud container clusters get-credentials CLUSTER_NAME \
--region=COMPUTE_REGION
Standard
Verwenden Sie das Flag --enable-dataplane-v2, um GKE Dataplane V2 in einem Standardcluster zu aktivieren. Führen Sie den folgenden Befehl aus, um einen Standardcluster zu erstellen und seine Konfiguration abzurufen:
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
Backend-Anwendung bereitstellen
Bevor Sie Ihre Load-Balancing-Dienste konfigurieren, müssen Sie eine Backend-Anwendung bereitstellen, die den Traffic verarbeitet. In diesem Deployment werden fünf Replikate der hello-app-Beispielanwendung ausgeführt.
Speichern Sie das folgende Manifest als
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: 8080Wenden Sie das Manifest an:
kubectl apply -f echo-backend.yaml
Load-Balancing-Dienste konfigurieren
Sie können Services so konfigurieren, dass entweder der Maglev-Load-Balancing-Algorithmus oder der standardmäßige zufällige Load-Balancing-Algorithmus verwendet wird. Beide Dienste sind auf das Deployment echo-backend ausgerichtet, das im vorherigen Schritt erstellt wurde.
Maglev-Dienst konfigurieren
Wenn Sie Maglev-Load-Balancing aktivieren möchten, fügen Sie bei der Erstellung den Dienstmetadaten die Annotation gke.networking.io/lb-algorithm: "maglev" hinzu.
Speichern Sie das folgende Manifest als
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: 8080Wenden Sie das Manifest an:
kubectl apply -f maglev-service.yaml
Zufälligen Dienst konfigurieren
Standardmäßig verwenden Dienste einen zufälligen Load-Balancing-Algorithmus. Sie müssen keine Annotation angeben, um den Standardalgorithmus zu verwenden. Im folgenden Beispiel wird er jedoch explizit konfiguriert, um ihn mit anderen Algorithmen vergleichen zu können.
Speichern Sie das folgende Manifest als
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: 8080Wenden Sie das Manifest an:
kubectl apply -f random-service.yaml
Traffickonsistenz prüfen
Sie können die Unterschiede bei der Routing-Konsistenz zwischen Maglev und zufälligem Load-Balancing überprüfen, indem Sie Testclient-Pods bereitstellen, die Traffic von einem festen Quellport senden.
Maglev-Traffic-Konsistenz prüfen
Maglev leitet Anfragen vom selben Quellport konsistent an denselben Backend-Pod weiter.
Speichern Sie das folgende Manifest als
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 doneDas Flag
--local-porterzwingt den Quellport und der HeaderConnection: closeträgt dazu bei, dass der Client den Quellport sofort für nachfolgende Anfragen wiederverwenden kann.Wenden Sie das Manifest an:
kubectl apply -f client-maglev.yamlPrüfen Sie die Logs, während der Pod ausgeführt wird:
kubectl logs client-maglevErwartete Ausgabe:
In der Ausgabe wird derselbe Hostname wiederholt ausgegeben. Das bedeutet, dass der gesamte Traffic vom Client konsistent an denselben Backend-Pod weitergeleitet wird:
Hostname: echo-backend-5c78f66dbf-abcde Hostname: echo-backend-5c78f66dbf-abcde
Standardmäßige (zufällige) Traffic-Verteilung prüfen
Der Standarddienst verteilt den Traffic vom selben Quellport auf verschiedene Backend-Pods.
Speichern Sie das folgende Manifest als
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 doneWenden Sie das Manifest an:
kubectl apply -f client-random.yamlPrüfen Sie die Logs, während der Pod ausgeführt wird:
kubectl logs client-randomErwartete Ausgabe:
Die Ausgabe zeigt mehrere unterschiedliche Hostnamen, was darauf hindeutet, dass der Traffic auf verschiedene Pods verteilt wird:
Hostname: echo-backend-5c78f66dbf-abcde Hostname: echo-backend-5c78f66dbf-fghij Hostname: echo-backend-5c78f66dbf-klmno ...
Bereinigen
Führen Sie die folgenden Befehle aus, um die in dieser Anleitung verwendeten Ressourcen zu bereinigen:
Löschen Sie die Client-Pods, -Dienste und das Deployment:
kubectl delete service maglev-service random-service kubectl delete deployment echo-backend kubectl delete pod client-maglev client-randomLöschen Sie die GKE-Cluster:
Autopilot
gcloud container clusters delete CLUSTER_NAME --region=COMPUTE_REGION
Standard
gcloud container clusters delete CLUSTER_NAME --zone=COMPUTE_ZONE