In dieser Anleitung können Sie das Autoscaling basierend auf einem der folgenden Messwerte einrichten:
CPU
CPU-Auslastung
Sie skalieren basierend auf der prozentualen Auslastung von CPUs über Knoten hinweg. Dies kann kostengünstig sein, wodurch Sie die CPU-Ressourcennutzung maximieren können. Da die CPU-Auslastung ein nachhängender Messwert ist, kann bei Ihren Nutzern jedoch Latenz auftreten, während ein Hochskalieren erfolgt.
Pub/Sub
Pub/Sub-Rückstand
Sie können basierend auf einem externen Messwert skalieren, der die Anzahl nicht bestätigter Nachrichten angibt, die noch in einemPub/Sub-Abo enthalten sind. Dadurch kann die Latenz wirksam reduziert werden, bevor sie zu einem Problem wird. Es kann aber auch den Ressourcenverbrauch gegenüber dem Autoscaling basierend auf der CPU-Auslastung erhöhen.
Benutzerdefinierter Messwert
Benutzerdefinierter Prometheus-Messwert
Sie können basierend auf einem benutzerdefinierten Messwert skalieren, über Google Managed Prometheus im Prometheus-Format exportiert wird. Der Prometheus-Messwert muss vom Typ Gauge sein.
Beim Autoscaling geht es im Wesentlichen darum, ein akzeptables Verhältnis zwischen Kosten und Latenz zu finden. Sie können eine Kombination dieser Messwerte und anderer Messwerte ausprobieren, um eine für Sie geeignete Richtlinie zu finden.
Lernziele
In dieser Anleitung werden die folgenden Aufgaben behandelt:- Adapter für benutzerdefinierte Messwerte bereitstellen
- Messwerte aus dem Anwendungscode exportieren
- Messwerte in der Cloud Monitoring-Oberfläche ansehen
- HPA-Ressource (HorizontalPodAutoscaler) bereitstellen, um Ihre Anwendung basierend auf Cloud Monitoring-Messwerten zu skalieren
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.
Hinweis
Führen Sie folgende Schritte aus, um die Kubernetes Engine API zu aktivieren:- Rufen Sie in der Google Cloud Console die Seite Kubernetes Engine auf.
- Erstellen Sie ein Projekt oder wählen Sie eines aus.
- Warten Sie, bis die API und die zugehörigen Dienste aktiviert worden sind. Dieser Vorgang kann einige Minuten dauern.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
Sie können diese Anleitung mit Cloud Shell ausführen, das mit den in dieser Anleitung verwendeten Befehlszeilentools gcloud
und kubectl
vorinstalliert wird. Wenn Sie Cloud Shell verwenden, müssen Sie diese Befehlszeilentools nicht auf Ihrer Workstation installieren.
So verwenden Sie Cloud Shell:
- Rufen Sie die Google Cloud Console auf.
Klicken Sie im oberen Bereich des Google Cloud Console-Fensters auf Cloud Shell aktivieren .
Im unteren Bereich der Google Cloud Console wird ein neuer Frame mit einer Cloud Shell-Sitzung und einer Befehlszeilen-Eingabeaufforderung geöffnet.
Umgebung einrichten
Legen Sie die Standardzone für die Google Cloud CLI fest:
gcloud config set compute/zone zone
Dabei gilt:
zone
: Wählen Sie eine Zone aus, die geografisch in Ihrer Nähe liegt. Weitere Informationen finden Sie unter Regionen und Zonen.
Legen Sie die Umgebungsvariablen
PROJECT_ID
undPROJECT_NUMBER
auf Ihre Google Cloud-Projekt-ID und ‑Projektnummer fest:export PROJECT_ID=project-id export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format 'get(projectNumber)')
Legen Sie die Standardzone für die Google Cloud CLI fest:
gcloud config set project $PROJECT_ID
Erstellen Sie einen GKE-Cluster.
Für eine erhöhte Sicherheit beim Zugriff auf Google Cloud-Dienste empfehlen wir, in Ihrem Cluster die Identitätsföderation von Arbeitslasten für GKE zu aktivieren. Sie finden auf dieser Seite zwar Beispiele für die alte Methode (bei der die Identitätsföderation von Arbeitslasten für GKE deaktiviert ist), durch die Aktivierung wird aber der Schutz verbessert.
Workload Identity
Führen Sie den folgenden Befehl aus, um einen Cluster mit aktivierter Identitätsföderation von Arbeitslasten für GKE zu erstellen:
gcloud container clusters create metrics-autoscaling --workload-pool=$PROJECT_ID.svc.id.goog
Alte Authentifizierungsmethode
Um einen Cluster mit deaktivierter Identitätsföderation von Arbeitslasten für GKE zu erstellen, führen Sie den folgenden Befehl aus:
gcloud container clusters create metrics-autoscaling
Adapter für benutzerdefinierte Messwerte bereitstellen
Der Adapter für benutzerdefinierte Messwerte ermöglicht Ihrem Cluster, Messwerte mit Cloud Monitoring zu senden und zu empfangen.
CPU
Nicht zutreffend: Horizontale Pod-Autoscaler können nativ basierend auf der CPU-Auslastung skaliert werden. Deshalb wird der Adapter für benutzerdefinierte Messwerte nicht benötigt.
Pub/Sub
Die Vorgehensweise bei der Installation des Adapters für benutzerdefinierte Messwerte unterscheidet sich für Cluster mit und ohne Aktivierung der Identitätsföderation von Arbeitslasten für GKE. Wählen Sie jene Option aus, die der Konfiguration entspricht, die Sie beim Erstellen des Clusters ausgewählt haben.
Workload Identity
Ermöglichen Sie dem Nutzer, die erforderlichen Autorisierungsrollen zu erstellen:
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole cluster-admin --user "$(gcloud config get-value account)"
Stellen Sie den Adapter für benutzerdefinierte Messwerte in Ihrem Cluster bereit:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
Der Adapter verwendet das Kubernetes-Dienstkonto custom-metrics-stackdriver-adapter
im Namespace custom-metrics
. Erlauben Sie diesem Dienstkonto, Cloud Monitoring-Messwerte zu lesen, indem Sie die Rolle Monitoring Viewer zuweisen:
gcloud projects add-iam-policy-binding projects/$PROJECT_ID \
--role roles/monitoring.viewer \
--member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/custom-metrics/sa/custom-metrics-stackdriver-adapter
Alte Authentifizierungsmethode
Ermöglichen Sie dem Nutzer, die erforderlichen Autorisierungsrollen zu erstellen:
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole cluster-admin --user "$(gcloud config get-value account)"
Stellen Sie den Adapter für benutzerdefinierte Messwerte in Ihrem Cluster bereit:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
Benutzerdefinierter Messwert
Die Vorgehensweise bei der Installation des Adapters für benutzerdefinierte Messwerte unterscheidet sich für Cluster mit und ohne Aktivierung der Identitätsföderation von Arbeitslasten für GKE. Wählen Sie jene Option aus, die der Konfiguration entspricht, die Sie beim Erstellen des Clusters ausgewählt haben.
Workload Identity
Ermöglichen Sie dem Nutzer, die erforderlichen Autorisierungsrollen zu erstellen:
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole cluster-admin --user "$(gcloud config get-value account)"
Stellen Sie den Adapter für benutzerdefinierte Messwerte in Ihrem Cluster bereit:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
Der Adapter verwendet das Kubernetes-Dienstkonto custom-metrics-stackdriver-adapter
im Namespace custom-metrics
. Erlauben Sie diesem Dienstkonto, Cloud Monitoring-Messwerte zu lesen, indem Sie die Rolle Monitoring Viewer zuweisen:
gcloud projects add-iam-policy-binding projects/$PROJECT_ID \
--role roles/monitoring.viewer \
--member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/custom-metrics/sa/custom-metrics-stackdriver-adapter
Alte Authentifizierungsmethode
Ermöglichen Sie dem Nutzer, die erforderlichen Autorisierungsrollen zu erstellen:
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole cluster-admin --user "$(gcloud config get-value account)"
Stellen Sie den Adapter für benutzerdefinierte Messwerte in Ihrem Cluster bereit:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
Anwendung mit Messwerten bereitstellen
Laden Sie das Repository mit dem Anwendungscode für diese Anleitung herunter:
CPU
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/quickstarts/hello-app
Pub/Sub
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/databases/cloud-pubsub
Benutzerdefinierter Messwert
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/observability/custom-metrics-autoscaling/google-managed-prometheus
Das Repository enthält Code, der Messwerte in Cloud Monitoring exportiert:
CPU
Diese Anwendung antwortet auf alle Webanfragen an Port 8080
mit „Hello, world!“. Compute Engine-CPU-Messwerte werden von Cloud Monitoring automatisch erfasst.
Pub/Sub
Diese Anwendung fragt ein Pub/Sub-Abo nach neuen Nachrichten ab und bestätigt sie beim Eingang. Pub/Sub-Abomesswerte werden von Cloud Monitoring automatisch erfasst.
Benutzerdefinierter Messwert
Diese Anwendung antwortet auf jede Webanfrage an den Pfad /metrics
mit einem
konstanten Messwert im Prometheus-Format.
Das Repository enthält außerdem ein Kubernetes-Manifest, um die Anwendung in Ihrem Cluster bereitzustellen:
CPU
Pub/Sub
Das Manifest unterscheidet sich für Cluster mit oder ohne Aktivierung der Identitätsföderation von Arbeitslasten für GKE. Wählen Sie jene Option aus, die der Konfiguration entspricht, die Sie beim Erstellen des Clusters ausgewählt haben.
Workload Identity
Alte Authentifizierungsmethode
Benutzerdefinierter Messwert
Mit der PodMonitoring-Ressource exportiert der Google Cloud Managed Service for Prometheus die Prometheus-Messwerte in Cloud Monitoring:
Stellen Sie die Anwendung in Ihrem Cluster bereit:
CPU
kubectl apply -f manifests/helloweb-deployment.yaml
Pub/Sub
Die Vorgehensweise bei der Bereitstellung Ihrer Anwendung unterscheidet sich für Cluster mit oder ohne Aktivierung der Identitätsföderation von Arbeitslasten für GKE. Wählen Sie jene Option aus, die der Konfiguration entspricht, die Sie beim Erstellen des Clusters ausgewählt haben.
Workload Identity
Aktivieren Sie die Pub/Sub API für Ihr Projekt:
gcloud services enable cloudresourcemanager.googleapis.com pubsub.googleapis.com
Erstellen Sie ein Pub/Sub-Thema und ‑Abo:
gcloud pubsub topics create echo gcloud pubsub subscriptions create echo-read --topic=echo
Stellen Sie die Anwendung in Ihrem Cluster bereit:
kubectl apply -f deployment/pubsub-with-workload-identity.yaml
Diese Anwendung definiert ein Kubernetes-Dienstkonto des Typs
pubsub-sa
. Weisen Sie ihm die Rolle Pub/Sub-Subscriber zu, damit die Anwendung Nachrichten im Pub/Sub-Thema veröffentlichen kann.gcloud projects add-iam-policy-binding projects/jmfran-gke-dev \ --role=roles/pubsub.subscriber \ --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/default/sa/pubsub-sa
Alte Authentifizierungsmethode
Aktivieren Sie die Pub/Sub API für Ihr Projekt:
gcloud services enable cloudresourcemanager.googleapis.com pubsub.googleapis.com
Erstellen Sie ein Pub/Sub-Thema und ‑Abo:
gcloud pubsub topics create echo gcloud pubsub subscriptions create echo-read --topic=echo
Erstellen Sie ein Dienstkonto mit Zugriff auf Pub/Sub:
gcloud iam service-accounts create autoscaling-pubsub-sa gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:autoscaling-pubsub-sa@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/pubsub.subscriber"
Laden Sie die Dienstkontoschlüsseldatei herunter:
gcloud iam service-accounts keys create key.json \ --iam-account autoscaling-pubsub-sa@$PROJECT_ID.iam.gserviceaccount.com
Importieren Sie den Dienstkontoschlüssel als Secret in Ihren Cluster:
kubectl create secret generic pubsub-key --from-file=key.json=./key.json
Stellen Sie die Anwendung in Ihrem Cluster bereit:
kubectl apply -f deployment/pubsub-with-secret.yaml
Benutzerdefinierter Messwert
kubectl apply -f custom-metrics-gmp.yaml
Nachdem Sie einen Moment auf die Bereitstellung der Anwendung gewartet haben, erreichen alle Pods den Status Ready
:
CPU
kubectl get pods
Ausgabe:
NAME READY STATUS RESTARTS AGE
helloweb-7f7f7474fc-hzcdq 1/1 Running 0 10s
Pub/Sub
kubectl get pods
Ausgabe:
NAME READY STATUS RESTARTS AGE
pubsub-8cd995d7c-bdhqz 1/1 Running 0 58s
Benutzerdefinierter Messwert
kubectl get pods
Ausgabe:
NAME READY STATUS RESTARTS AGE
custom-metrics-gmp-865dffdff9-x2cg9 1/1 Running 0 49s
Messwerte in Cloud Monitoring ansehen
Bei der Ausführung der Anwendung werden die Messwerte in Cloud Monitoring geschrieben.
So rufen Sie mit dem Metrics Explorer die Messwerte für eine überwachte Ressource auf:
-
Rufen Sie in der Google Cloud Console die Seite leaderboard Metrics Explorer auf.
Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Monitoring ist.
- Erweitern Sie im Element Messwert das Menü Messwert auswählen und wählen Sie dann einen Ressourcentyp und einen Messwerttyp aus. So erstellen Sie beispielsweise ein Diagramm der CPU-Auslastung einer virtuellen Maschine:
- (Optional) Um die Optionen des Menüs zu reduzieren, geben Sie einen Teil des Messwertnamens in die Filterleiste ein. Geben Sie für dieses Beispiel
utilization
ein. - Wählen Sie im Menü Aktive Ressourcen die Option VM-Instanz aus.
- Wählen Sie im Menü Aktive Messwertkategorien die Option Instanz aus.
- Wählen Sie im Menü Aktive Messwerte die Option CPU-Auslastung aus und klicken Sie dann auf Anwenden.
- (Optional) Um die Optionen des Menüs zu reduzieren, geben Sie einen Teil des Messwertnamens in die Filterleiste ein. Geben Sie für dieses Beispiel
Verwenden Sie das Element Filter, um zu filtern, welche Zeitreihen angezeigt werden.
Verwenden Sie zum Kombinieren von Zeitreihen die Menüs für das Element Aggregation. Wenn Sie beispielsweise die CPU-Auslastung für Ihre VMs basierend auf ihrer Zone anzeigen lassen möchten, legen Sie das erste Menü auf Durchschnitt und das zweite Menü auf Zone fest.
Alle Zeitreihen werden angezeigt, wenn das erste Menü des Elements Aggregation auf Nicht aggregiert gesetzt ist. Die Standardeinstellungen für das Element Aggregation werden durch den ausgewählten Messwerttyp bestimmt.
Ressourcentyp und die Messwerte sind folgende:
CPU
Ressourcentyp: gce_instance
Messwert: compute.googleapis.com/instance/cpu/utilization
Pub/Sub
Ressourcentyp: pubsub_subscription
Messwert: pubsub.googleapis.com/subscription/num_undelivered_messages
Benutzerdefinierter Messwert
Ressourcentyp: prometheus_target
Messwert: prometheus.googleapis.com/custom_prometheus/gauge
HorizontalPodAutoscaler-Objekt erstellen
Wenn Sie den Messwert in Cloud Monitoring sehen, können Sie einen HorizontalPodAutoscaler
bereitstellen, um die Größe des Deployments basierend auf dem Messwert anzupassen.
CPU
Pub/Sub
Benutzerdefinierter Messwert
Stellen Sie den HorizontalPodAutoscaler
in Ihrem Cluster bereit:
CPU
kubectl apply -f manifests/helloweb-hpa.yaml
Pub/Sub
kubectl apply -f deployment/pubsub-hpa.yaml
Benutzerdefinierter Messwert
kubectl apply -f custom-metrics-gmp-hpa.yaml
Last generieren
Bei einigen Messwerten müssen Sie möglicherweise eine Last generieren, um das Autoscaling zu sehen:
CPU
Simulieren Sie 10.000 Anfragen an den helloweb
-Server:
kubectl exec -it deployments/helloweb -- /bin/sh -c \
"for i in $(seq -s' ' 1 10000); do wget -q -O- localhost:8080; done"
Pub/Sub
Veröffentlichen Sie 200 Nachrichten an das Pub/Sub-Thema:
for i in {1..200}; do gcloud pubsub topics publish echo --message="Autoscaling #${i}"; done
Benutzerdefinierter Messwert
Nicht zutreffend: Der in diesem Beispiel verwendete Code exportiert für den benutzerdefinierten Messwert den konstanten Wert 40
. Für den HorizontalPodAutoscaler ist der Zielwert 20
festgelegt, sodass er versucht, das Deployment automatisch hochzuskalieren.
Hochskalieren von HorizontalPodAutoscaler beobachten
Mit folgendem Befehl können Sie die aktuelle Anzahl von Replikaten des Deployments prüfen:
kubectl get deployments
Nachdem der Messwert einige Zeit für die Übertragung hatte, erstellt das Deployment fünf Pods zur Verarbeitung des Rückstands.
Sie können auch den Status und die letzte Aktivität des HorizontalPodAutoscalers prüfen, indem Sie folgenden Befehl ausführen:
kubectl describe hpa
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt löschen, das die Ressourcen enthält, oder das Projekt beibehalten und die einzelnen Ressourcen löschen.
CPU
So löschen Sie den GKE-Cluster:
gcloud container clusters delete metrics-autoscaling
Pub/Sub
Bereinigen Sie das Pub/Sub-Abo und -Thema:
gcloud pubsub subscriptions delete echo-read gcloud pubsub topics delete echo
So löschen Sie den GKE-Cluster:
gcloud container clusters delete metrics-autoscaling
Benutzerdefinierter Messwert
So löschen Sie den GKE-Cluster:
gcloud container clusters delete metrics-autoscaling