In diesem Dokument wird erläutert, wie Sie mit der Google Kubernetes Engine (GKE) ein Framework für verteilte Lasttests bereitstellen, das mehrere Container verwendet, um Traffic für eine einfache REST-basierte API zu erstellen. In diesem Dokument wird eine in der App Engine bereitgestellte Webanwendung mit REST-Endpunkten für eingehende HTTP-POST-Anfragen unter Last getestet.
Sie können dasselbe Muster verwenden, um Lasttest-Frameworks für eine Vielzahl von Szenarien und Anwendungen zu erstellen, z. B. Nachrichtensysteme, Datenstrom-Managementsysteme und Datenbanksysteme.
Ziele
- Umgebungsvariablen definieren, um die Deployment-Konfiguration zu steuern
- GKE-Cluster erstellen
- Lasttest durchführen
- Anzahl der Nutzer hochskalieren oder Muster auf andere Anwendungsfälle erweitern (optional)
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
- App Engine
- Artifact Registry
- Cloud Build
- Cloud Storage
- Google Kubernetes Engine
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Vorbereitung
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the App Engine, Artifact Registry, Cloud Build, Compute Engine, Resource Manager, Google Kubernetes Engine, and Identity and Access Management APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the App Engine, Artifact Registry, Cloud Build, Compute Engine, Resource Manager, Google Kubernetes Engine, and Identity and Access Management APIs.
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/serviceusage.serviceUsageAdmin, roles/container.admin, roles/appengine.appAdmin, roles/appengine.appCreator, roles/artifactregistry.admin, roles/resourcemanager.projectIamAdmin, roles/compute.instanceAdmin.v1, roles/iam.serviceAccountUser, roles/cloudbuild.builds.builder, roles/iam.serviceAccountAdmin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Beispielarbeitslast
Das folgende Diagramm zeigt ein Beispiel für eine Arbeitslast, bei der Anfragen vom Client an die Anwendung gesendet werden.
Um diese Interaktion zu modellieren, können Sie Locust verwenden, ein verteiltes, Python-basiertes Tool für Lasttests, mit dem sich Anfragen auf mehrere Zielpfade verteilen lassen. Locust kann zum Beispiel Anfragen an die Zielpfade /login
und /metrics
senden. Die Arbeitslast wird in Locust als Reihe von Aufgaben modelliert.
Architektur
Diese Architektur umfasst zwei Hauptkomponenten:
- Das Locust-Docker-Container-Image
- Den Mechanismus zur Containerorchestrierung und -verwaltung
Das Locust-Docker-Container-Image enthält die Locust-Software. Sie erhalten eine Docker-Datei, wenn Sie das GitHub-Repository klonen, das als Begleitmaterial zu diesem Dokument verfügbar ist. Diese Datei verwendet ein Basis-Python-Image und enthält Skripte, um den Locust-Dienst zu starten und die Aufgaben auszuführen. Jede Locust-Aufgabe wird gewichtet, um konkrete Clients anzugleichen. Eine Registrierung erfolgt zum Beispiel bei tausend Client-Anfragen einmal.
GKE bietet Containerorchestrierung und -verwaltung. Mit GKE können Sie die Anzahl der Containerknoten angeben, die die Grundlage für Ihr Lasttest-Framework bilden. Sie können Ihre Lasttest-Worker auch in Pods organisieren und angeben, wie viele Pods von GKE weiterhin ausgeführt werden sollen.
Gehen Sie so vor, um die Lasttestaufgaben bereitzustellen:
- Stellen Sie einen primären Lasttest bereit, der von Locust als Master bezeichnet wird.
- Stellen Sie eine Gruppe von Lasttest-Workern bereit. Mit diesen Lasttest-Workern können Sie eine erhebliche Menge an Traffic zu Testzwecken generieren.
Das folgende Diagramm zeigt die Architektur, die Lasttests mit einer Beispielanwendung veranschaulicht. Der Master-Pod stellt die Weboberfläche bereit, die zum Ausführen und Überwachen von Lasttests verwendet wird. Die Worker-Pods generieren den REST-Anfrage-Traffic für die zu testende Anwendung und senden Messwerte an den Master.
Informationen zum Lasttest-Master
Der Locust-Master ist der Einstiegspunkt für die Ausführung der Lasttestaufgaben. In der Locust-Masterkonfiguration sind mehrere Elemente angegeben, einschließlich der vom Container verwendeten Standardports:
8089
für die Weboberfläche5557
und5558
für die Kommunikation mit Workern
Diese Informationen werden später verwendet, um die Locust-Worker zu konfigurieren.
Sie stellen einen Service bereit, damit die nötigen Ports über hostname:port
für andere Pods im Cluster zugänglich sind. Die Ports können auch über einen beschreibenden Portnamen referenziert werden.
Mit diesem Service können die Locust-Worker den Master einfach erkennen und zuverlässig mit ihm kommunizieren, auch wenn der Master ausfällt und vom Deployment durch einen neuen Pod ersetzt wird.
Ein zweiter Service wird mit der erforderlichen Annotation bereitgestellt, um einen internen Passthrough-Network-Load-Balancer zu erstellen, der den Locust-Webanwendungsdienst für Clients außerhalb Ihres Clusters zugänglich macht, die dasselbe VPC-Netzwerk verwenden und sich in derselben Google Cloud-Region wie Ihr Cluster befinden.
Nachdem Sie den Locust-Master bereitgestellt haben, können Sie die Weboberfläche über die interne IP-Adresse öffnen, die vom internen Passthrough-Network Load Balancer bereitgestellt wird. Nachdem Sie die Locust-Worker bereitgestellt haben, können Sie die Simulation starten und die Gesamtstatistik über die Locust-Weboberfläche betrachten.
Informationen zu den Lasttest-Workern
Die Locust-Worker führen die Lasttestaufgaben aus. Sie verwenden ein einzelnes Deployment, um mehrere Pods zu erstellen. Die Pods sind über den Kubernetes-Cluster verteilt. Jeder Pod verwendet Umgebungsvariablen, um Konfigurationsinformationen wie den Hostnamen des zu testenden Systems und den Hostnamen des Locust-Masters zu steuern.
Das folgende Diagramm zeigt die Beziehung zwischen dem Locust-Master und den Locust-Workern.
Gemeinsame Variablen initialisieren
Sie müssen mehrere Variablen definieren, die steuern, wo Elemente der Infrastruktur bereitgestellt werden.
Öffnen Sie Cloud Shell:
Alle Terminalbefehle in diesem Dokument werden über Cloud Shell ausgeführt.
Legen Sie die Umgebungsvariablen fest, die angepasst werden müssen:
export GKE_CLUSTER=GKE_CLUSTER export AR_REPO=AR_REPO export REGION=REGION export ZONE=ZONE export SAMPLE_APP_LOCATION=SAMPLE_APP_LOCATION
Ersetzen Sie Folgendes:
GKE_CLUSTER
: der Name Ihres GKE-Cluster.AR_REPO
: der Name Ihres Artifact Registry-RepositorysREGION
: die Region, in der Ihr GKE-Cluster und das Artifact Registry-Repository erstellt werden.ZONE
: die Zone in Ihrer Region, in der Ihre Compute Engine-Instanz erstellt wird.SAMPLE_APP_LOCATION
: der (regionale) Standort, an dem die App Engine-Beispielanwendung bereitgestellt wird
Die Befehle sollten wie im folgenden Beispiel aussehen:
export GKE_CLUSTER=gke-lt-cluster export AR_REPO=dist-lt-repo export REGION=us-central1 export ZONE=us-central1-b export SAMPLE_APP_LOCATION=us-central
Legen Sie die folgenden zusätzlichen Umgebungsvariablen fest:
export GKE_NODE_TYPE=e2-standard-4 export GKE_SCOPE="https://www.googleapis.com/auth/cloud-platform" export PROJECT=$(gcloud config get-value project) export SAMPLE_APP_TARGET=${PROJECT}.appspot.com
Legen Sie die Standardzone fest, damit Sie diese Werte nicht in nachfolgenden Befehlen angeben müssen:
gcloud config set compute/zone ${ZONE}
GKE-Cluster erstellen
Erstellen Sie ein Dienstkonto mit den für den Cluster erforderlichen Mindestberechtigungen:
gcloud iam service-accounts create dist-lt-svc-acc gcloud projects add-iam-policy-binding ${PROJECT} --member=serviceAccount:dist-lt-svc-acc@${PROJECT}.iam.gserviceaccount.com --role=roles/artifactregistry.reader gcloud projects add-iam-policy-binding ${PROJECT} --member=serviceAccount:dist-lt-svc-acc@${PROJECT}.iam.gserviceaccount.com --role=roles/container.nodeServiceAccount
Erstellen Sie den GKE-Cluster:
gcloud container clusters create ${GKE_CLUSTER} \ --service-account=dist-lt-svc-acc@${PROJECT}.iam.gserviceaccount.com \ --region ${REGION} \ --machine-type ${GKE_NODE_TYPE} \ --enable-autoscaling \ --num-nodes 3 \ --min-nodes 3 \ --max-nodes 10 \ --scopes "${GKE_SCOPE}"
Stellen Sie eine Verbindung zum GKE-Cluster her:
gcloud container clusters get-credentials ${GKE_CLUSTER} \ --region ${REGION} \ --project ${PROJECT}
Umgebung einrichten
Klonen Sie das Beispiel-Repository aus GitHub:
git clone https://github.com/GoogleCloudPlatform/distributed-load-testing-using-kubernetes
Ändern Sie das Arbeitsverzeichnis in das geklonte Repository:
cd distributed-load-testing-using-kubernetes
Container-Image erstellen
Erstellen Sie ein Artifact Registry-Repository:
gcloud artifacts repositories create ${AR_REPO} \ --repository-format=docker \ --location=${REGION} \ --description="Distributed load testing with GKE and Locust"
Erstellen Sie das Container-Image und speichern Sie es in Ihrem Artifact Registry-Repository:
export LOCUST_IMAGE_NAME=locust-tasks export LOCUST_IMAGE_TAG=latest gcloud builds submit \ --tag ${REGION}-docker.pkg.dev/${PROJECT}/${AR_REPO}/${LOCUST_IMAGE_NAME}:${LOCUST_IMAGE_TAG} \ docker-image
Das zugehörige Locust-Docker-Image bettet eine Testaufgabe ein, die die Endpunkte
/login
und/metrics
in der Beispielanwendung aufruft. In diesem Beispielsatz von Testaufgaben beträgt das jeweilige Verhältnis von Anfragen, die an diese beiden Endpunkte gesendet werden,1
zu999
.Prüfen Sie, ob sich das Docker-Image in Ihrem Artifact Registry-Repository befindet:
gcloud artifacts docker images list ${REGION}-docker.pkg.dev/${PROJECT}/${AR_REPO} | \ grep ${LOCUST_IMAGE_NAME}
Die entsprechende Ausgabe sieht etwa so aus:
Listing items under project
PROJECT
, locationREGION
, repositoryAR_REPO
REGION
-docker.pkg.dev/PROJECT
/AR_REPO
/locust-tasks sha256:796d4be067eae7c82d41824791289045789182958913e57c0ef40e8d5ddcf283 2022-04-13T01:55:02 2022-04-13T01:55:02
Beispielanwendung bereitstellen
Erstellen Sie die Beispiel-Webapp als App Engine und stellen Sie sie bereit:
gcloud app create --region=${SAMPLE_APP_LOCATION} gcloud app deploy sample-webapp/app.yaml \ --project=${PROJECT}
Geben Sie bei Aufforderung
y
ein, um mit der Bereitstellung fortzufahren.Die Ausgabe sieht in etwa so aus:
File upload done. Updating service [default]...done. Setting traffic split for service [default]...done. Deployed service [default] to [https://
PROJECT
.appspot.com]Die App Engine-Beispielanwendung implementiert die Endpunkte
/login
und/metrics
:
Stellen Sie den Locust-Master und Worker-Pods bereit:
Ersetzen Sie die Umgebungsvariablenwerte für die Zielhost-, Projekt- und Image-Parameter in den
locust-master-controller.yaml
- undlocust-worker-controller.yaml
-Dateien und erstellen Sie die Locust-Master- und -Worker-Deployments:envsubst < kubernetes-config/locust-master-controller.yaml.tpl | kubectl apply -f - envsubst < kubernetes-config/locust-worker-controller.yaml.tpl | kubectl apply -f - envsubst < kubernetes-config/locust-master-service.yaml.tpl | kubectl apply -f -
Überprüfen Sie die Locust-Deployments:
kubectl get pods -o wide
Die Ausgabe sollte in etwa so aussehen:
NAME READY STATUS RESTARTS AGE IP NODE locust-master-87f8ffd56-pxmsk 1/1 Running 0 1m 10.32.2.6 gke-gke-load-test-default-pool-96a3f394 locust-worker-58879b475c-279q9 1/1 Running 0 1m 10.32.1.5 gke-gke-load-test-default-pool-96a3f394 locust-worker-58879b475c-9frbw 1/1 Running 0 1m 10.32.2.8 gke-gke-load-test-default-pool-96a3f394 locust-worker-58879b475c-dppmz 1/1 Running 0 1m 10.32.2.7 gke-gke-load-test-default-pool-96a3f394 locust-worker-58879b475c-g8tzf 1/1 Running 0 1m 10.32.0.11 gke-gke-load-test-default-pool-96a3f394 locust-worker-58879b475c-qcscq 1/1 Running 0 1m 10.32.1.4 gke-gke-load-test-default-pool-96a3f394
Überprüfen Sie die Dienste:
kubectl get services
Die Ausgabe sollte in etwa so aussehen:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.87.240.1 <none> 443/TCP 12m locust-master ClusterIP 10.87.245.22 <none> 5557/TCP,5558/TCP 1m locust-master-web LoadBalancer 10.87.246.225 <pending> 8089:31454/TCP 1m
Führen Sie eine Überwachungsschleife aus, während die interne IP-Adresse des internen Passthrough-Network Load Balancers (externe GKE-IP-Adresse) für den Locust-Master-Webanwendungs-Service bereitgestellt wird:
kubectl get svc locust-master-web --watch
Drücken Sie
Ctrl+C
, um die Überwachungsschleife zu beenden, sobald eine EXTERNAL-IP-Adresse bereitgestellt wurde.
Verbindung zum Locust-Web-Frontend herstellen
Mithilfe der Weboberfläche des Locust-Masters führen Sie die Lasttestaufgaben mit dem zu testenden System aus.
Notieren Sie sich die interne Load-Balancer-IP-Adresse des Webhostdienstes:
export INTERNAL_LB_IP=$(kubectl get svc locust-master-web \ -o jsonpath="{.status.loadBalancer.ingress[0].ip}") && \ echo $INTERNAL_LB_IP
Abhängig von Ihrer Netzwerkkonfiguration gibt es zwei Möglichkeiten, über die bereitgestellte IP-Adresse eine Verbindung zur Locust-Webanwendung herzustellen:
Netzwerk-Routing: Wenn Ihr Netzwerk so konfiguriert ist, dass das Routing von Ihrer Workstation zu Ihrem VPC-Netzwerk möglich ist, können Sie direkt von Ihrer Workstation auf die IP-Adresse des internen Passthrough-Network Load Balancers zugreifen.
Proxy und SSH-Tunnel: Wenn keine Netzwerkroute zwischen Ihrer Workstation und Ihrem VPC-Netzwerk vorhanden ist, können Sie den Traffic an die IP-Adresse des internen Passthrough-Network Load Balancers weiterleiten. Dazu erstellen Sie eine Compute Engine-Instanz mit einem
nginx
-Proxy und einen SSH-Tunnel zwischen Ihrer Workstation und der Instanz.
Netzwerk-Routing
Wenn eine Route für Netzwerk-Traffic zwischen Ihrer Workstation und dem VPC-Netzwerk des Google Cloud-Projekts vorhanden ist, öffnen Sie Ihren Browser und anschließend die Weboberfläche des Locust-Masters. Rufen Sie die folgende URL auf, um die Locust-Benutzeroberfläche zu öffnen:
http://INTERNAL_LB_IP:8089
Ersetzen Sie INTERNAL_LB_IP durch die URL und IP-Adresse, die Sie im vorherigen Schritt notiert haben.
Proxy und SSH-Tunnel
Legen Sie eine Umgebungsvariable mit dem Namen der Instanz fest.
export PROXY_VM=locust-nginx-proxy
Starten Sie eine Instanz mit einem
ngnix
-Docker-Container, der dafür konfiguriert ist, beim internen Passthrough-Network Load Balancer für den Locust-Webanwendungsport8089
als Proxy zu dienen:gcloud compute instances create-with-container ${PROXY_VM} \ --zone ${ZONE} \ --container-image gcr.io/cloud-marketplace/google/nginx1:latest \ --container-mount-host-path=host-path=/tmp/server.conf,mount-path=/etc/nginx/conf.d/default.conf \ --metadata=startup-script="#! /bin/bash cat <<EOF > /tmp/server.conf server { listen 8089; location / { proxy_pass http://${INTERNAL_LB_IP}:8089; } } EOF"
Öffnen Sie einen SSH-Tunnel von Cloud Shell zur Proxy-Instanz:
gcloud compute ssh --zone ${ZONE} ${PROXY_VM} \ -- -N -L 8089:localhost:8089
Klicken Sie auf das Symbol Webvorschau () und wählen Sie aus den aufgeführten Optionen Port ändern aus.
Geben Sie auf dem Dialogfeld Vorschauport ändern 8.089 im Feld Portnummer ein und wählen Sie Ändern und Vorschau.
Nach kurzer Zeit wird mit der Locust-Weboberfläche ein Browsertab geöffnet.
Einfachen Lasttest für Ihre Beispielanwendung ausführen
Nachdem Sie das Locust-Frontend in Ihrem Browser geöffnet haben, wird ein Dialogfeld angezeigt, mit dem ein neuer Lasttest gestartet werden kann.
Geben Sie unter Gesamtanzahl der Nutzer (Spitzen Gleichzeitigkeit) die Option
10
und die Spawn-Rate (gestartete Nutzer/Sekunden) als5
-Nutzer pro Sekunde ein.Klicken Sie anschließend auf Start swarming (Swarming starten), um mit der Simulation zu beginnen.
Nachdem das Swarming von Anfragen begonnen hat, werden nach und nach Statistiken für Simulationsmesswerte zusammengefasst, z. B. die Summe der Anfragen und die Zahl der Anfragen pro Sekunde, wie in der folgenden Abbildung dargestellt:
Sehen Sie sich den bereitgestellten Dienst und andere Messwerte über die Google Cloud Console an.
Wenn Sie das Verhalten der zu testenden Anwendung beobachtet haben, klicken Sie auf Beenden, um den Test zu beenden.
Anzahl der Nutzer hochskalieren (optional)
Wenn Sie eine erhöhte Last auf der Anwendung testen möchten, können Sie simulierte Nutzer hinzufügen. Bevor Sie simulierte Nutzer hinzufügen können, müssen Sie dafür sorgen, dass genügend Ressourcen vorhanden sind, um den Anstieg der Last bewältigen zu können. Mit Google Cloud können Sie Locust-Worker-Pods dem Deployment hinzufügen, ohne die vorhandenen Pods noch einmal bereitstellen zu müssen, solange Sie die zugrunde liegenden VM-Ressourcen haben, um eine größere Anzahl von Pods zu unterstützen. Der anfängliche GKE-Cluster beginnt mit 3 Knoten und kann automatisch bis zu 10 Knoten skalieren.
Skalieren Sie den Pool von Locust-Worker-Pods auf 20.
kubectl scale deployment/locust-worker --replicas=20
Das Deployment und Starten der neuen Pods dauert einige Minuten.
Wenn der Fehler Pod Unschedulable angezeigt wird, müssen Sie dem Cluster weitere Knoten hinzufügen. Weitere Informationen finden Sie unter Größe von GKE-Clustern anpassen.
Kehren Sie nach dem Start der Pods zur Weboberfläche des Locust-Masters zurück und starten Sie den Lasttest noch einmal.
Muster erweitern
Sie können neue Locust-Aufgaben erstellen oder sogar zu einem anderen Lasttest-Framework wechseln, um dieses Muster zu erweitern.
Sie haben die Möglichkeit, die von Ihnen erfassten Messwerte anzupassen. So können Sie zum Beispiel die Anfragen pro Sekunde messen, die Antwortlatenz bei Erhöhung der Last beobachten oder die Ausfallraten und Fehlerarten bei Antworten prüfen.
Weitere Informationen finden Sie in der Dokumentation zu Cloud Monitoring.
Bereinigen
Damit Ihrem Google Cloud-Konto die in diesem Dokument verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder behalten Sie das Projekt und löschen Sie die einzelnen Ressourcen.
Projekt löschen
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
GKE-Cluster löschen
Wenn Sie nicht das gesamte Projekt löschen möchten, können Sie den folgenden Befehl ausführen, um nur den GKE-Cluster zu löschen:
gcloud container clusters delete ${GKE_CLUSTER} --region ${REGION}
Weitere Informationen
- Skalierbare und stabile Webanwendungen erstellen
- GKE-Dokumentation im Detail lesen
- Anleitungen zu GKE
- Weitere Referenzarchitekturen, Diagramme und Best Practices finden Sie im Cloud-Architekturcenter.