In dieser Anleitung erfahren Sie, wie Sie eine Webanwendung ausführen, die von einer hochverfügbaren relationalen Datenbank in großem Maßstab in Google Kubernetes Engine (GKE) unterstützt wird.
Die in dieser Anleitung verwendete Beispielanwendung ist Bank of Anthos, eine HTTP-basierte Webanwendung, die das Zahlungsabwicklungsnetzwerk einer Bank simuliert. Bank of Anthos verwendet mehrere Dienste. In dieser Anleitung geht es um das Frontend der Website und die relationalen PostgreSQL-Datenbanken, die die Bank of Anthos-Dienste unterstützen. Weitere Informationen zu Bank of Anthos, einschließlich seiner Architektur und der bereitgestellten Dienste, finden Sie unter Bank of Anthos auf GitHub.
Lernziele
- GKE-Cluster erstellen und konfigurieren
- Beispielwebanwendung und eine hochverfügbare PostgreSQL-Datenbank bereitstellen
- Autoscaling der Webanwendung und der Datenbank konfigurieren
- Traffic-Spitzen mit einem Lastgenerator simulieren
- Beobachten, wie die Dienste vertikal und horizontal skaliert werden
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
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.
Hinweise
- 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
- Installieren Sie die Helm-Befehlszeile.
Umgebung vorbereiten
Klonen Sie das in dieser Anleitung verwendete Beispiel-Repository:
git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git cd bank-of-anthos/
Legen Sie Umgebungsvariablen fest:
PROJECT_ID=PROJECT_ID GSA_NAME=bank-of-anthos GSA_EMAIL=bank-of-anthos@${PROJECT_ID}.iam.gserviceaccount.com KSA_NAME=default
Ersetzen Sie
PROJECT_ID
durch Ihre Google Cloud-Projekt-ID.
Cluster und Dienstkonten einrichten
Erstellen Sie einen Cluster.
gcloud container clusters create-auto bank-of-anthos --region=us-central1
Es kann bis zu fünf Minuten dauern, bis der Cluster startet.
Erstellen Sie ein IAM-Dienstkonto:
gcloud iam service-accounts create bank-of-anthos
Gewähren Sie Zugriff auf das IAM-Dienstkonto:
gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/cloudtrace.agent \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/monitoring.metricWriter \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" gcloud iam service-accounts add-iam-policy-binding "bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[default/default]"
Mit diesem Schritt wird der folgende Zugriff gewährt:
roles/cloudtrace.agent
: Trace-Daten wie Latenzinformationen in Trace schreiben.roles/monitoring.metricWriter
: Messwerte in Cloud Monitoring schreiben.roles/iam.workloadIdentityUser
: Einem Kubernetes-Dienstkonto erlauben, die Workload Identity-Föderation für GKE zu verwenden, um als IAM-Dienstkonto zu fungieren.
Konfigurieren Sie das Kubernetes-Dienstkonto
default
im Namespacedefault
so, dass es als von Ihnen erstelltes IAM-Dienstkonto fungiert:kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com
Dadurch können Pods, die das Kubernetes-Dienstkonto
default
im Namespacedefault
verwenden, auf dieselben Google Cloud-Ressourcen wie das IAM-Dienstkonto zugreifen.
Bank of Anthos und PostgreSQL bereitstellen
In diesem Abschnitt installieren Sie Bank of Anthos und eine PostgreSQL-Datenbank im hochverfügbaren Modus (HA), sodass Sie Replikate des Datenbankservers automatisch skalieren können. Wenn Sie sich die in diesem Abschnitt verwendeten Skripts, Helm-Diagramme und Kubernetes-Manifeste ansehen möchten, rufen Sie das Bank of Anthos-Repository auf GitHub auf.
Stellen Sie das Datenbankschema und ein DDL-Script (Data Definition Language, Datendefinitionssprache) bereit:
kubectl create configmap initdb \ --from-file=src/accounts/accounts-db/initdb/0-accounts-schema.sql \ --from-file=src/accounts/accounts-db/initdb/1-load-testdata.sql \ --from-file=src/ledger/ledger-db/initdb/0_init_tables.sql \ --from-file=src/ledger/ledger-db/initdb/1_create_transactions.sh
Verwenden Sie das Beispiel-Helm-Diagramm, um PostgreSQL zu installieren:
helm repo add bitnami https://charts.bitnami.com/bitnami helm install accounts-db bitnami/postgresql-ha \ --version 10.0.1 \ --values extras/postgres-hpa/helm-postgres-ha/values.yaml \ --set="postgresql.initdbScriptsCM=initdb" \ --set="postgresql.replicaCount=1" \ --wait
Mit diesem Befehl wird ein PostgreSQL-Cluster mit einer anfänglichen Replikatanzahl von 1 erstellt. Später in dieser Anleitung skalieren Sie den Cluster basierend auf eingehenden Verbindungen. Dieser Vorgang kann zehn Minuten oder länger dauern.
Stellen Sie Bank of Anthos bereit:
kubectl apply -f extras/jwt/jwt-secret.yaml kubectl apply -f extras/postgres-hpa/kubernetes-manifests
Dieser Vorgang kann einige Minuten dauern.
Prüfpunkt: Einrichtung validieren
Prüfen Sie, ob alle Bank of Anthos-Pods ausgeführt werden:
kubectl get pods
Die Ausgabe sieht in etwa so aus:
NAME READY STATUS accounts-db-pgpool-57ffc9d685-c7xs8 3/3 Running accounts-db-postgresql-0 1/1 Running balancereader-57b59769f8-xvp5k 1/1 Running contacts-54f59bb669-mgsqc 1/1 Running frontend-6f7fdc5b65-h48rs 1/1 Running ledgerwriter-cd74db4cd-jdqql 1/1 Running pgpool-operator-5f678457cd-cwbhs 1/1 Running transactionhistory-5b9b56b5c6-sz9qz 1/1 Running userservice-f45b46b49-fj7vm 1/1 Running
Prüfen Sie, ob Sie auf das Website-Frontend zugreifen können:
Rufen Sie die externe IP-Adresse des
frontend
-Dienstes ab:kubectl get ingress frontend
Die Ausgabe sieht in etwa so aus:
NAME CLASS HOSTS ADDRESS PORTS AGE frontend <none> * 203.0.113.9 80 12m
Rufen Sie in einem Browser die externe IP-Adresse auf. Die Anmeldeseite von Bank of Anthos wird angezeigt. Wenn Sie neugierig sind, sehen Sie sich die Anwendung an.
Wenn Sie einen 404-Fehler erhalten, warten Sie einige Minuten, bis die Mikrodienste bereitgestellt wurden, und versuchen Sie es noch einmal.
Webanwendung und PostgreSQL-Datenbank automatisch skalieren
GKE Autopilot skaliert die Cluster-Computing-Ressourcen anhand der Anzahl der Arbeitslasten im Cluster. Wenn Sie die Anzahl der Pods im Cluster anhand von Ressourcenmesswerten automatisch skalieren möchten, müssen Sie das horizontale Pod-Autoscaling von Kubernetes implementieren. Sie können die integrierten Kubernetes-CPU- und -Arbeitsspeichermesswerte oder benutzerdefinierte Messwerte wie die HTTP-Anfragen pro Sekunde oder die Anzahl der SELECT-Anweisungen aus Cloud Monitoring verwenden.
In diesem Abschnitt tun Sie Folgendes:
- Konfigurieren Sie das horizontale Pod-Autoscaling für die Bank of Anthos-Mikrodienste mit integrierten und benutzerdefinierten Messwerten.
- Simulieren Sie die Last der Bank of Anthos-Anwendung, um Autoscaling-Ereignisse auszulösen.
- Beobachten Sie, wie die Anzahl der Pods und Knoten in Ihrem Cluster automatisch entsprechend Ihrer Last skaliert wird.
Erfassung benutzerdefinierter Messwerte einrichten
Wenn Sie benutzerdefinierte Messwerte aus Monitoring lesen möchten, müssen Sie in Ihrem Cluster den Adapter Benutzerdefinierte Messwerte – Stackdriver-Adapter bereitstellen.
Stellen Sie den Adapter bereit:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
Konfigurieren Sie den Adapter für die Verwendung der Workload Identity-Föderation für GKE, um Messwerte abzurufen:
Konfigurieren Sie das IAM-Dienstkonto:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
Annotieren Sie dann das vom Adapter verwendete Kubernetes-Dienstkonto:
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace=custom-metrics \ iam.gke.io/gcp-service-account=bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com
Starten Sie das Adapter-Deployment neu, um die Änderungen zu übernehmen:
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
Autoscaling für die Datenbank konfigurieren
Wenn Sie in dieser Anleitung Bank of Anthos und PostgreSQL bereitgestellt haben, haben Sie die Datenbank als StatefulSet mit einem primären Lese-/Schreibreplikat für die Verarbeitung aller eingehenden SQL-Anweisungen bereitgestellt. In diesem Abschnitt konfigurieren Sie das horizontale Pod-Autoscaling, um neue schreibgeschützte Standby-Replikate für den Standby-Cluster zum Verarbeiten eingehender SELECT-Anweisungen hinzuzufügen. Eine gute Möglichkeit, die Last auf jedem Replikat zu reduzieren, besteht darin, SELECT-Anweisungen zu verteilen, bei denen es sich um Lesevorgänge handelt. Die PostgreSQL-Bereitstellung enthält ein Tool namens Pgpool-II
, das dieses Load-Balancing erreicht und den Durchsatz des Systems verbessert.
PostgreSQL exportiert den SELECT-Anweisungsmesswert als Prometheus-Messwert.
Sie verwenden einen einfachen Messwert-Exporter mit dem Namen prometheus-to-sd
, um diese Messwerte in einem unterstützten Format an Cloud Monitoring zu senden.
Überprüfen Sie das Objekt
HorizontalPodAutoscaler
:Das Manifest tut Folgendes:
- Legt die maximale Anzahl von Replikaten beim Hochskalieren auf
5
fest. - Legt die Mindestanzahl von Replikaten beim Herunterskalieren auf
1
fest. - Verwendet einen externen Messwert, um Skalierungsentscheidungen zu treffen. In diesem Beispiel ist der Messwert die Anzahl der SELECT-Anweisungen. Ein Hochskalierungsereignis tritt auf, wenn die Anzahl eingehender SELECT-Anweisungen mehr als 15 beträgt.
- Legt die maximale Anzahl von Replikaten beim Hochskalieren auf
Wenden Sie das Manifest auf den Cluster an:
kubectl apply -f extras/postgres-hpa/hpa/postgresql-hpa.yaml
Autoscaling für die Weboberfläche konfigurieren
Unter Bank of Anthos und PostgreSQL bereitstellen haben Sie die Bank of Anthos-Weboberfläche bereitgestellt. Wenn die Anzahl der Nutzer zunimmt, verbraucht der userservice
-Service mehr CPU-Ressourcen. In diesem Abschnitt konfigurieren Sie das horizontale Pod-Autoscaling für das userservice
-Deployment, wenn die vorhandenen Pods mehr als 60 % der angeforderten CPU verwenden, und das frontend
-Deployment, wenn die Anzahl der eingehenden HTTP-Anfragen an den Load-Balancer bei mehr als 5 Anfragen pro Sekunde liegt.
Autoscaling für das userservice-Deployment konfigurieren
Überprüfen Sie das
HorizontalPodAutoscaler
-Manifest für dasuserservice
-Deployment:Das Manifest tut Folgendes:
- Legt die maximale Anzahl von Replikaten beim Hochskalieren auf
50
fest. - Legt die Mindestanzahl von Replikaten beim Herunterskalieren auf
5
fest. - Verwendet einen integrierten Kubernetes-Messwert, um Skalierungsentscheidungen zu treffen. In diesem Beispiel ist der Messwert die CPU-Auslastung und die Zielauslastung beträgt 60 %. Damit werden eine Über- und eine Unterauslastung vermieden.
- Legt die maximale Anzahl von Replikaten beim Hochskalieren auf
Wenden Sie das Manifest auf den Cluster an:
kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
Autoscaling für die Frontend-Bereitstellung konfigurieren
Überprüfen Sie das
HorizontalPodAutoscaler
-Manifest für dasuserservice
-Deployment:Dieses Manifest verwendet die folgenden Felder:
spec.scaleTargetRef
: Die Kubernetes-Ressource, die skaliert werden soll.spec.minReplicas
: Die Mindestanzahl von Replikaten, also5
in diesem Beispiel.spec.maxReplicas
: Die maximale Anzahl von Replikaten, also25
in diesem Beispiel.spec.metrics.*
: Der zu verwendende Messwert. In diesem Beispiel ist dies die Anzahl der HTTP-Anfragen pro Sekunde, ein benutzerdefinierter Messwert von Cloud Monitoring, der von dem von Ihnen bereitgestellten Adapter zur Verfügung gestellt wird.spec.metrics.external.metric.selector.matchLabels
: Das spezifische Ressourcenlabel, nach dem beim Autoscaling gefiltert werden soll.
Suchen Sie den Namen der Weiterleitungsregel vom Load-Balancer zum
frontend
-Deployment:export FW_RULE=$(kubectl get ingress frontend -o=jsonpath='{.metadata.annotations.ingress\.kubernetes\.io/forwarding-rule}') echo $FW_RULE
Die Ausgabe sieht in etwa so aus:
k8s2-fr-j76hrtv4-default-frontend-wvvf7381
Fügen Sie dem Manifest Ihre Weiterleitungsregel hinzu:
sed -i "s/FORWARDING_RULE_NAME/$FW_RULE/g" "extras/postgres-hpa/hpa/frontend.yaml"
Mit diesem Befehl wird
FORWARDING_RULE_NAME
durch Ihre gespeicherte Weiterleitungsregel ersetzt.Wenden Sie das Manifest auf den Cluster an:
kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
Prüfpunkt: Autoscaling-Einrichtung validieren
Rufen Sie den Zustand Ihrer HorizontalPodAutoscaler
-Ressourcen ab:
kubectl get hpa
Die Ausgabe sieht in etwa so aus:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
accounts-db-postgresql StatefulSet/accounts-db-postgresql 10905m/15 (avg) 1 5 2 5m2s
contacts Deployment/contacts 1%/70% 1 5 1 11m
frontend Deployment/frontend <unknown>/5 (avg) 5 25 1 34s
userservice Deployment/userservice 0%/60% 5 50 5 4m56s
An diesem Punkt haben Sie Ihre Anwendung eingerichtet und das Autoscaling konfiguriert. Ihr Frontend und Ihre Datenbank können jetzt anhand der von Ihnen bereitgestellten Messwerte skaliert werden.
Last simulieren und GKE-Skalierung beobachten
Bank of Anthos enthält einen loadgenerator
-Service, mit dem Sie den Traffic simulieren können, um die Skalierung Ihrer Anwendung unter Last zu testen. In diesem Abschnitt stellen Sie den loadgenerator
-Service bereit, generieren eine Last und beobachten die resultierende Skalierung.
Lasttestgenerator bereitstellen
Erstellen Sie eine Umgebungsvariable mit der IP-Adresse des Bank of Anthos-Load-Balancers:
export LB_IP=$(kubectl get ingress frontend -o=jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $LB_IP
Die Ausgabe sieht in etwa so aus:
203.0.113.9
Fügen Sie dem Manifest die IP-Adresse des Load-Balancers hinzu:
sed -i "s/FRONTEND_IP_ADDRESS/$LB_IP/g" "extras/postgres-hpa/loadgenerator.yaml"
Wenden Sie das Manifest auf den Cluster an:
kubectl apply -f extras/postgres-hpa/loadgenerator.yaml
Der Lastgenerator beginnt mit dem Hinzufügen eines Nutzers pro Sekunde bis hin zu 250 Nutzern.
Last simulieren
In diesem Abschnitt verwenden Sie einen Lastgenerator, um Traffic-Spitzen zu simulieren und zu beobachten, wie die Anzahl der Replikate und die Knotenanzahl vertikal skaliert werden, um die erhöhte Last im Laufe der Zeit zu bewältigen. Anschließend beenden Sie den Test und beobachten, wie die Replikat- und die Knotenanzahl als Reaktion herunterskaliert werden.
Machen Sie die Weboberfläche des Lastgenerators lokal verfügbar:
kubectl port-forward svc/loadgenerator 8080
Wenn eine Fehlermeldung angezeigt wird, versuchen Sie es noch einmal, wenn der Pod ausgeführt wird.
Öffnen Sie in einem Browser die Weboberfläche des Lastgenerators.
- Wenn Sie eine lokale Shell verwenden, öffnen Sie einen Browser und rufen Sie http://127.0.0.1:8080 auf.
- Wenn Sie Cloud Shell verwenden, klicken Sie auf Webvorschau und dann auf Vorschau auf Port 8080.
Klicken Sie auf den Tab Diagramme, um die Leistung im Zeitverlauf zu beobachten.
Öffnen Sie ein neues Terminalfenster und beobachten Sie die Anzahl der Replikate Ihrer horizontalen Pod-Autoscalings:
kubectl get hpa -w
Die Anzahl der Replikate erhöht sich, wenn die Last zunimmt. Das Hochskalieren kann etwa zehn Minuten dauern.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS accounts-db-postgresql StatefulSet/accounts-db-postgresql 8326m/15 (avg) 1 5 5 contacts Deployment/contacts 51%/70% 1 5 2 frontend Deployment/frontend 5200m/5 (avg) 5 25 13 userservice Deployment/userservice 71%/60% 5 50 17
Öffnen Sie ein anderes Terminalfenster und prüfen Sie die Anzahl der Knoten im Cluster:
gcloud container clusters list \ --filter='name=bank-of-anthos' \ --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \ --region="us-central1"
Die Anzahl der Knoten wurde von der Startmenge von drei Knoten aus erhöht, um die neuen Replikate unterzubringen.
Öffnen Sie die Benutzeroberfläche des Lastgenerators und klicken Sie auf Beenden, um den Test zu beenden.
Prüfen Sie die Replikatanzahl und die Knotenanzahl noch einmal und beobachten Sie, wie sich die Zahlen mit der geringeren Last verringern. Das Herunterskalieren kann einige Zeit dauern, da das standardmäßige Stabilisierungsfenster für Replikate in der Kubernetes-
HorizontalPodAutoscaler
-Ressource fünf Minuten beträgt. Weitere Informationen finden Sie unter Stabilisierungsfenster.
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
Einzelne Ressourcen löschen
Google Cloud erstellt Ressourcen wie Load-Balancer basierend auf den von Ihnen erstellten Kubernetes-Objekten. So löschen Sie alle Ressourcen in dieser Anleitung:
Löschen Sie die Kubernetes-Beispielressourcen:
kubectl delete \ -f extras/postgres-hpa/loadgenerator.yaml \ -f extras/postgres-hpa/hpa \ -f extras/postgres-hpa/kubernetes-manifests \ -f extras/jwt/jwt-secret.yaml \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
Löschen Sie die PostgreSQL-Datenbank:
helm uninstall accounts-db kubectl delete pvc -l "app.kubernetes.io/instance=accounts-db" kubectl delete configmaps initdb
Löschen Sie den GKE-Cluster und das IAM-Dienstkonto:
gcloud iam service-accounts delete "bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" --quiet gcloud container clusters delete "bank-of-anthos" --region="us-central1" --quiet
Projekt löschen
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Nächste Schritte
- Erfahren Sie mehr über vertikales Pod-Autoscaling, mit dem Sie Ressourcenanforderungen für lang andauernde Arbeitslasten automatisch mit Empfehlungen anpassen können, die auf der bisherigen Nutzung basieren.
- Weitere Informationen zum horizontalen Pod-Autoscaling