Wenn das horizontale Pod-Autoscaling in Google Kubernetes Engine (GKE) nicht wie erwartet funktioniert, werden Ihre Arbeitslasten möglicherweise nicht richtig skaliert. Dieses Problem kann dazu führen, dass Anwendungen die Last nicht verarbeiten können, was zu Leistungsproblemen oder Ausfällen führen kann. Möglicherweise stellen Sie fest, dass die Anzahl der Pods trotz hoher CPU-Auslastung nicht zunimmt, dass die Messwertwerte in Ihrem HorizontalPodAutoscaler-Status als <unknown> angezeigt werden oder dass Skalierungsvorgänge überhaupt nicht stattfinden.
In diesem Dokument erfahren Sie, wie Sie häufige Probleme mit dem horizontalen Pod-Autoscaling diagnostizieren und beheben können. Die Probleme reichen von anfänglichen Fehlkonfigurationen in Ihren HorizontalPodAutoscaler-Objekten bis hin zu komplexeren Fehlern in der Messwerte-Pipeline. Wenn Sie diese Schritte zur Fehlerbehebung ausführen, können Sie dafür sorgen, dass Ihre Anwendungen je nach Bedarf effizient und zuverlässig skaliert werden und die HorizontalPodAutoscaler-Ressource effektiv genutzt wird.
Diese Informationen sind wichtig für Anwendungsentwickler, die HorizontalPodAutoscaler-Objekte konfigurieren und dafür sorgen müssen, dass ihre Anwendungen richtig skaliert werden. Außerdem können Plattformadministratoren und ‑operatoren damit Probleme mit der Messwertpipeline oder der Clusterkonfiguration beheben, die sich auf alle automatisch skalierten Arbeitslasten auswirken. Weitere Informationen zu den gängigen Rollen und Beispielaufgaben, auf die wir in Google Cloud Inhalten verweisen, finden Sie unter Häufig verwendete GKE-Nutzerrollen und -Aufgaben.
Hinweis
- Verwenden Sie HorizontalPodAutoscaler-Objekte mit skalierbaren Arbeitslasten wie Deployments und StatefulSets. Sie können horizontales Pod-Autoscaling nicht für Arbeitslasten verwenden, die nicht skaliert werden können, z. B. DaemonSets.
-
Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zur Fehlerbehebung bei der horizontalen Pod-Autoskalierung in GKE benötigen, einschließlich der Prüfung von HorizontalPodAutoscaler-Objekten und der Anzeige von Clusterlogs:
-
GKE-Ressourcen prüfen:
GKE Viewer (
roles/container.viewer) -
Cluster-Logs ansehen:
Loganzeige (
roles/logging.viewer)
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.
Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.
-
GKE-Ressourcen prüfen:
GKE Viewer (
Konfigurieren Sie das
kubectl-Befehlszeilentool für die Kommunikation mit Ihrem GKE-Cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --location LOCATION \ --project PROJECT_IDErsetzen Sie Folgendes:
CLUSTER_NAME: Der Name Ihres Clusters.LOCATION: die Compute Engine-Region oder -Zone (z. B.us-central1oderus-central1-a) für den Cluster.PROJECT_ID: Projekt-ID in Google Cloud .
Probleme mit HorizontalPodAutoscaler diagnostizieren
Wenn Sie Probleme mit einem HorizontalPodAutoscaler diagnostizieren möchten, prüfen Sie den Status und die Konfiguration mit kubectl-Befehlen oder der Google Cloud Console.
HorizontalPodAutoscaler beschreiben
Verwenden Sie den Befehl kubectl describe hpa, um Echtzeitberechnungen und aktuelle Skalierungsentscheidungen aufzurufen:
kubectl describe hpa HPA_NAME -n NAMESPACE_NAME
Ersetzen Sie Folgendes:
HPA_NAME: Der Name Ihres HorizontalPodAutoscaler-Objekts.NAMESPACE_NAME: der Namespace Ihres HorizontalPodAutoscaler-Objekts.
Die Ausgabe sieht etwa so aus:
Name: php-apache-hpa
Namespace: default
Reference: Deployment/php-apache
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 1% (1m) / 50%
Min replicas: 1
Max replicas: 10
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HorizontalPodAutoscaler was able to successfully calculate a replica count
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 39m horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization...
Normal SuccessfulRescale 26m horizontal-pod-autoscaler New size: 1; reason: cpu resource utilization...
Die folgenden drei Abschnitte in der Ausgabe helfen Ihnen, das Problem zu diagnostizieren:
Metrics: Hier werden die aktuellen Messwerte im Vergleich zu den Zielvorhaben angezeigt. Ein<unknown>-Messwert gibt an, dass der HorizontalPodAutoscaler den Messwert nicht abgerufen hat oder dass die Messwertpipeline unterbrochen ist.Conditions: Gibt an, ob der HorizontalPodAutoscaler Messwerte abrufen (AbleToScale) und Skalierungsberechnungen durchführen (ScalingActive) kann. Der StatusFalsein einer dieser Bedingungen weist auf einen Fehler hin.Events: Protokolliert die letzten Skalierungsaktionen, Warnungen und Fehler des HorizontalPodAutoscaler-Controllers. Dort finden Sie oft als Erstes spezifische Fehlermeldungen oder Gründe, z. B.FailedGetScaleoderFailedGetResourceMetric.
HorizontalPodAutoscaler-Manifest prüfen
Im YAML-Manifest Ihres HorizontalPodAutoscaler-Objekts können Sie Informationen zur Konfiguration und zum aktuellen Status aufrufen.
Wählen Sie eine der folgenden Optionen aus, um das YAML-Manifest aufzurufen:
Console
Rufen Sie in der Google Cloud Console die Seite Objektbrowser auf.
Wählen Sie in der Liste Objektarten das Kästchen HorizontalPodAutoscaler aus und klicken Sie auf OK.
Rufen Sie die API-Gruppe autoscaling auf und klicken Sie dann auf den Erweiterungspfeil für HorizontalPodAutoscaler.
Klicken Sie auf den Namen des HorizontalPodAutoscaler-Objekts, das Sie untersuchen möchten.
Sehen Sie sich den Abschnitt YAML an, in dem die vollständige Konfiguration des HorizontalPodAutoscaler-Objekts angezeigt wird.
kubectl
Führen Sie dazu diesen Befehl aus:
kubectl get hpa HPA_NAME -n NAMESPACE_NAME -o yaml
Ersetzen Sie Folgendes:
HPA_NAME: Der Name Ihres HorizontalPodAutoscaler-Objekts.NAMESPACE_NAME: der Namespace Ihres HorizontalPodAutoscaler-Objekts.
Suchen Sie nach dem Abrufen des Manifests nach den folgenden wichtigen Abschnitten:
spec(Ihre Konfiguration):scaleTargetRef: die Arbeitslast (z. B. ein Deployment), die der HorizontalPodAutoscaler skalieren soll.minReplicasundmaxReplicas: die Einstellungen für die Mindest- und Höchstzahl von Replikaten.metrics: Die für die Skalierung konfigurierten Messwerte, z. B. CPU-Auslastung oder benutzerdefinierte Messwerte.
status(der Live-Status des HorizontalPodAutoscaler):currentMetrics: die letzten Messwerte, die der HorizontalPodAutoscaler beobachtet hat.currentReplicasunddesiredReplicas: die aktuelle Anzahl der Pods und die Anzahl, auf die der HorizontalPodAutoscaler skalieren möchte.conditions: Zeigt den Zustand des HorizontalPodAutoscaler an:AbleToScale: Gibt an, ob der HorizontalPodAutoscaler sein Ziel und seine Messwerte finden kann.ScalingActive: Gibt an, ob der HorizontalPodAutoscaler die Skalierung berechnen und ausführen darf.ScalingLimited: Gibt an, ob der HorizontalPodAutoscaler skaliert werden soll, aber durch Ihre Einstellungen fürminReplicasodermaxReplicasbegrenzt wird.
Ereignisprotokolle ansehen
Wenn Sie mehr über Ihr HorizontalPodAutoscaler-Objekt erfahren möchten, können Sie die folgenden Logtypen verwenden:
HorizontalPodAutoscaler-Ereignisse in Cloud Logging ansehen: Verwenden Sie einen Logfilter, um alle HorizontalPodAutoscaler-Ereignisse für einen bestimmten Cluster zu finden. Beispiel:
Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf.
Geben Sie im Bereich „Abfrage“ die folgende Abfrage ein:
resource.type="k8s_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.location="LOCATION" logName="projects/PROJECT_ID/logs/events" jsonPayload.involvedObject.kind="HorizontalPodAutoscaler"Ersetzen Sie Folgendes:
CLUSTER_NAME: der Name des Clusters, zu dem der HorizontalPodAutoscaler gehört.LOCATION: die Compute Engine-Region oder -Zone (z. B.us-central1oderus-central1-a) für den Cluster.PROJECT_ID: Ihre Projekt-ID.
Klicken Sie auf Abfrage ausführen und sehen Sie sich die Ausgabe an.
Ereignisse für horizontales Pod-Autoscaling ansehen: Diese Logs enthalten strukturierte, menschenlesbare Logs, in denen erläutert wird, wie der HorizontalPodAutoscaler eine Empfehlung berechnet. Sie bieten detaillierte Einblicke in den Entscheidungsprozess.
Fehlerbehebung bei Konfigurationsfehlern von HorizontalPodAutoscaler
In den folgenden Abschnitten werden Fehlkonfigurationen im HorizontalPodAutoscaler-Manifest behandelt, z. B. falsch geschriebene Felder, ungültige Messwertziele oder in Konflikt stehende Konfigurationen.
Zielarbeitslast nicht gefunden
Symptome
Der Abschnitt Events hat die Bedingung FailedGetScale mit einer Meldung wie der folgenden:
the HorizontalPodAutoscaler controller was unable to get the target's current scale: WORKLOAD_TYPE.apps "TARGET_WORKLOAD" not found
Diese Ausgabe enthält die folgenden Werte:
WORKLOAD_TYPE: der Typ der Arbeitslast, z. B.DeploymentoderStatefulSet.TARGET_WORKLOAD: Der Name der Arbeitslast.
Ursache
Der HorizontalPodAutoscaler-Controller kann die Arbeitslast (z. B. ein Deployment oder StatefulSet) nicht finden, für die er konfiguriert ist. Dieses Problem tritt aufgrund einer Fehlkonfiguration im Feld scaleTargetRef im Manifest des HorizontalPodAutoscaler auf. Die angegebene Ressource ist möglicherweise nicht vorhanden, wurde gelöscht oder enthält einen Rechtschreibfehler.
Lösung
Versuchen Sie Folgendes:
- Prüfen Sie das Feld
scaleTargetRefdes HorizontalPodAutoscaler-Manifests: Achten Sie darauf, dass die Werte vonname,kindundapiVersionim FeldscaleTargetRefgenau mit den entsprechenden Metadaten Ihrer Zielarbeitslast übereinstimmen. Wenn der Name der Arbeitslast falsch ist, aktualisieren Sie das FeldscaleTargetRefdes HorizontalPodAutoscalers, sodass es auf den richtigen Namen verweist. - Prüfen, ob die Arbeitslast vorhanden ist: Prüfen Sie, ob die Zielarbeitslast im selben Namespace wie der HorizontalPodAutoscaler vorhanden ist. Sie können dies mit einem Befehl wie
kubectl get deployment DEPLOYMENT_NAMEprüfen. Wenn Sie die Arbeitslast absichtlich gelöscht haben, löschen Sie das entsprechende HorizontalPodAutoscaler-Objekt, um den Cluster zu bereinigen. Wenn Sie die Arbeitslast neu erstellen müssen, findet der HorizontalPodAutoscaler sie automatisch, sobald sie verfügbar ist, und der Fehler wird behoben. - Prüfen Sie, ob sich der HorizontalPodAutoscaler und die Arbeitslast im selben Namespace befinden: Der HorizontalPodAutoscaler und die zugehörige Zielarbeitslast müssen sich im selben Namespace befinden. Wenn Sie beim Erstellen eines Objekts mit
kubectl-Befehlen keinen Namespace angeben, platziert Kubernetes das Objekt im Namespacedefault. Dieses Verhalten kann zu einer Diskrepanz führen, wenn sich Ihr HorizontalPodAutoscaler im Namespacedefaultund Ihre Arbeitslast in einem anderen Namespace befindet oder umgekehrt. Prüfen Sie den Namespace für beide Objekte und vergewissern Sie sich, dass sie übereinstimmen.
Nachdem der HorizontalPodAutoscaler sein Ziel erfolgreich gefunden hat, ändert sich die Bedingung AbleToScale in True und die Meldung ändert sich in:
the HorizontalPodAutoscaler controller was able to get the target's current scale.
Ungültige Messwerte
Symptome
Wenn der HorizontalPodAutoscaler die erforderlichen Replikate aufgrund eines Konfigurationsproblems nicht berechnen kann, wird im Abschnitt Events der Grund FailedComputeMetricsReplicas mit einer Meldung ähnlich der folgenden angezeigt:
invalid metrics (1 invalid out of 1)
Ursache
Dieser Fehler bedeutet in der Regel, dass der Messwert type und der target, den Sie in Ihrem HorizontalPodAutoscaler-Manifest definiert haben, nicht übereinstimmen. Beispiel: Sie haben für type den Wert Utilization angegeben, aber einen Zielwert von averageValue anstelle von averageUtilization.
Lösung
Korrigieren Sie das HorizontalPodAutoscaler-Manifest, sodass der Wert des Felds target mit dem Messwert type übereinstimmt:
- Wenn
typeden WertUtilizationhat, muss der Wert im FeldtargetaverageUtilizationsein. - Wenn
typeden WertAverageValuehat, muss der Wert im FeldtargetaverageValuesein.
Messwertlabel ist nicht zulässig
Symptome
Der folgende Fehler wird angezeigt:
unable to fetch metrics from external metrics API: googleapi: Error 400: Metric label: 'LABEL_NAME' is not allowed
In dieser Ausgabe ist LABEL_NAME der Name des falschen Labels.
Ursache
Im HorizontalPodAutoscaler-Manifest wird im Abschnitt metric.selector.matchLabels ein ungültiger Labelschlüssel angegeben. Cloud Monitoring erkennt oder erlaubt diesen Schlüssel für den Messwert nicht.
Lösung
So beheben Sie das Problem:
- Ermitteln Sie den unzulässigen Labelnamen anhand der Fehlermeldung.
- Entfernen oder korrigieren Sie diesen Label-Schlüssel im Abschnitt
metric.selector.matchLabelsIhres HorizontalPodAutoscaler-Manifests. - Einen gültigen, filterbaren Labelschlüssel finden Sie in der Cloud Monitoring-Dokumentation für diesen Messwert.
Mehrere HorizontalPodAutoscaler sind auf dieselbe Arbeitslast ausgerichtet
Symptome
Es gibt keinen spezifischen Condition oder Reason im Status eines HorizontalPodAutoscalers, der direkt auf diesen Konflikt hinweist. Stattdessen können folgende Symptome auftreten:
- Die Anzahl der Replikate der Arbeitslast kann unerwartet schwanken.
- Skalierungsentscheidungen entsprechen möglicherweise nicht den in einem einzelnen HorizontalPodAutoscaler definierten Messwerten.
- Wenn Sie sich Ereignisse ansehen, werden möglicherweise abwechselnde oder widersprüchliche
SuccessfulRescale-Ereignisse von verschiedenen HorizontalPodAutoscaler-Objekten angezeigt.
Ursache
Dieses Problem tritt auf, weil in mehr als einem HorizontalPodAutoscaler-Objekt im selben Namespace genau dieselbe Arbeitslast im Feld spec.scaleTargetRef angegeben ist. Jeder HorizontalPodAutoscaler berechnet unabhängig die Anzahl der Replikate und versucht, die Arbeitslast basierend auf seinen eigenen Messwerten und Zielen zu skalieren. Kubernetes blockiert diese Konfiguration nicht, sie führt aber zu unregelmäßigen Skalierungsanpassungen, da die HorizontalPodAutoscaler miteinander konkurrieren.
Lösung
Definieren Sie alle Skalierungsmesswerte in einem einzigen HorizontalPodAutoscaler-Objekt, um Konflikte zu vermeiden. Jedes HorizontalPodAutoscaler-Objekt berechnet die Skalierungsanforderungen aus seinem eigenen spec.metrics-Feld. Wenn Sie sie zusammenführen, kann das ausgewählte HorizontalPodAutoscaler-Objekt alle Faktoren wie CPU und Anfragen pro Sekunde berücksichtigen:
Rufen Sie das YAML-Manifest für jedes HorizontalPodAutoscaler-Objekt ab, um herauszufinden, welche HorizontalPodAutoscaler auf dieselbe Arbeitslast abzielen. Achten Sie genau auf das Feld
spec.scaleTargetRefin der Ausgabe.kubectl get hpa -n NAMESPACE_NAME -o yamlErsetzen Sie
NAMESPACE_NAMEdurch den Namespace Ihres HorizontalPodAutoscaler-Objekts.Suchen Sie nach Instanzen, bei denen verschiedene HorizontalPodAutoscaler-Ressourcen im Feld
scaleTargetRefdieselben Werte fürapiVersion,kindundnamehaben.Messwerte in einem einzelnen HorizontalPodAutoscaler-Objekt zusammenfassen:
- Wählen Sie ein HorizontalPodAutoscaler-Objekt aus, das Sie behalten möchten. Diesen HorizontalPodAutoscaler werden Sie ändern.
- Sehen Sie sich den Abschnitt
spec.metricsim Manifest der anderen HorizontalPodAutoscaler-Objekte an, die auf denselben Workload ausgerichtet sind. - Kopieren Sie die Messwertdefinitionen, die Sie behalten möchten, aus den
spec.metrics-Abschnitten der doppelten HorizontalPodAutoscaler-Objekte. - Fügen Sie diese kopierten Messwertdefinitionen in das
spec.metrics-Array des HorizontalPodAutoscaler ein, den Sie behalten möchten.
Wenden Sie Ihre Änderungen an:
kubectl apply -f MANIFEST_NAMEErsetzen Sie
MANIFEST_NAMEdurch den Namen des HorizontalPodAutoscaler-Manifests, das Sie beibehalten möchten.Löschen Sie die anderen HorizontalPodAutoscaler-Objekte, die auf dieselbe Arbeitslast ausgerichtet waren:
kubectl delete hpa DUPLICATE_MANIFEST_NAME -n NAMESPACE_NAMEErsetzen Sie
DUPLICATE_MANIFEST_NAMEdurch den Namen des redundanten HorizontalPodAutoscaler-Objekts, das Sie löschen möchten.
Arbeitslast- und Dienstfehler beheben
In den folgenden Abschnitten werden Fehler behandelt, die durch die Zielarbeitslast oder die zugehörigen Dienste und nicht durch das HorizontalPodAutoscaler-Objekt selbst verursacht werden.
Fehlende Ressourcenanfragen für die Skalierungsberechnung
Symptome
Die Bedingung ScalingActive ist False mit einem Reason von FailedGetResourceMetric. Normalerweise wird auch eine Meldung ähnlich der folgenden angezeigt:
the HorizontalPodAutoscaler was unable to compute the replica count
Ursache
Der HorizontalPodAutoscaler muss die Ressourcenauslastung als Prozentsatz berechnen, um die Arbeitslast zu skalieren. Diese Berechnung kann jedoch nicht durchgeführt werden, da in der Pod-Spezifikation für mindestens einen Container die resources.requests-Definition für die entsprechende Ressource (cpu oder memory) fehlt.
Lösung
Um dieses Problem zu beheben, aktualisieren Sie das Pod-Manifest in Ihrem Deployment, StatefulSet oder einem anderen Controller, sodass es ein Feld resources.requests für die Ressource (cpu oder memory) enthält, für die der HorizontalPodAutoscaler alle Container im Pod skaliert. Beispiel:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
# Multiple lines are omitted here
spec:
containers:
- name: example-container
resources:
requests:
cpu: "100m"
memory: "128Mi"
Pod-Messwerte können nicht abgerufen werden
Symptome
Es wird eine Meldung wie die folgende angezeigt:
unable to fetch pod metrics for pod
Es ist normal, dass diese Meldung beim Start des Messwertservers vorübergehend angezeigt wird.
Ursache
Wenn Sie die Skalierung auf der Grundlage des prozentualen Anteils der Ressourcenauslastung (z. B. cpu oder memory) durchführen möchten, muss für jeden Container in den Pods, auf die das HorizontalPodAutoscaler-Objekt ausgerichtet ist, das Feld resources.requests für die jeweilige Ressource definiert sein.
Andernfalls kann das horizontale Pod-Autoscaling die erforderlichen Berechnungen nicht ausführen und unternimmt keine Aktion in Bezug auf diesen Messwert.
Lösung
Wenn diese Fehlermeldungen weiterhin angezeigt werden und Sie feststellen, dass Pods nicht für Ihre Arbeitslast skaliert werden, müssen Sie für jeden Container in Ihrer Arbeitslast angegebene Ressourcenanforderungen angegeben haben.
Mehrere Dienste wählen dasselbe Ziel aus
Symptome
Der folgende Fehler wird angezeigt:
multiple services selecting the same target of HPA_NAME: SERVICE_NAME
Diese Ausgabe enthält die folgenden Werte:
HPA_NAME: Der Name des HorizontalPodAutoscaler.SERVICE_NAME: der Name eines Dienstes.
Ursache
Das traffic-basierte Autoscaling ist konfiguriert, aber mehr als ein Kubernetes-Service ist auf das Feld scaleTargetRef des HorizontalPodAutoscaler ausgerichtet. Das traffic-basierte Autoscaling unterstützt nur eine 1:1-Beziehung zwischen dem Dienst und der automatisch skalierten Arbeitslast.
Lösung
Um dieses Problem zu beheben, muss der Label-Selektor nur eines Dienstes mit den Pods Ihres Workloads übereinstimmen:
Suchen Sie die Pod-Labels Ihrer Arbeitslast:
kubectl get deployment HPA_TARGET_DEPLOYMENT \ -n NAMESPACE \ -o jsonpath='{.spec.template.metadata.labels}'Ersetzen Sie Folgendes:
HPA_TARGET_DEPLOYMENT: Der Name des Deployments, auf das der HorizontalPodAutoscaler ausgerichtet ist.NAMESPACE: der Namespace des Deployments.
Die Ausgabe sieht etwa so aus:
{"app":"my-app", "env":"prod"}Suchen Sie alle Dienste, die diesen Labels entsprechen, indem Sie das Feld
spec.selectorfür alle Dienste im Namespace prüfen.kubectl get services -n NAMESPACE -o yamlErmitteln Sie alle Dienste, deren Selektor mit den Labels aus dem vorherigen Schritt übereinstimmt. Beispielsweise entsprechen sowohl
{"app": "my-app"}als auch{"app": "my-app", "env": "prod"}den Beispiel-Pod-Labels.Beheben Sie den Konflikt, indem Sie eine der folgenden Optionen auswählen:
- Machen Sie den Selektor des gewünschten Dienstes eindeutig, indem Sie dem Feld
spec.template.metadata.labelsIhrer Bereitstellung ein neues, eindeutiges Label hinzufügen. Aktualisieren Sie dann das Feldspec.selectordes einen vorgesehenen Dienstes, um dieses neue Label einzuschließen. - Machen Sie andere Service-Selektoren restriktiver, indem Sie das Feld
spec.selectoraller anderen in Konflikt stehenden Services so ändern, dass sie restriktiver sind und nicht mehr mit den Pods Ihrer Arbeitslast übereinstimmen.
- Machen Sie den Selektor des gewünschten Dienstes eindeutig, indem Sie dem Feld
Wenden Sie Ihre Änderungen an:
kubectl apply -f MANIFEST_NAMEErsetzen Sie
MANIFEST_NAMEdurch den Namen der YAML-Datei, die das aktualisierte Dienst- oder Deployment-Manifest enthält.
Fehlerbehebung bei der Metrics API und der Datenverfügbarkeit
In den folgenden Abschnitten erfahren Sie, wie Sie Fehler beheben, die auftreten, wenn der HorizontalPodAutoscaler versucht, mit einer Messwert-API zu kommunizieren oder ein Messwert-Backend abzufragen.
Fehlerbehebung bei benutzerdefinierten und externen Messwerten
Wenn Ihr HorizontalPodAutoscaler auf Messwerten aus anderen Quellen als der Standard-CPU oder dem Standardspeicher basiert, können Probleme in der Pipeline für benutzerdefinierte oder externe Messwerte auftreten. Diese Pipeline besteht aus dem HorizontalPodAutoscaler-Controller, dem Kubernetes-Messwert-API-Server, dem Messwertadapter und der Messwertquelle (z. B. Cloud Monitoring oder Prometheus), wie im folgenden Diagramm dargestellt:
Symptome
Die häufigsten Symptome für ein Problem in der Messwerte-Pipeline sind:
- Der Messwert wird als
<unknown>angezeigt. - In HorizontalPodAutoscaler-Ereignissen werden Fehler wie
FailedGetExternalMetricoderFailedGetCustomMetricangezeigt.
Ursache
Es liegt ein Problem in der Pipeline für benutzerdefinierte oder externe Messwerte vor.
Lösung
Mit den folgenden Schritten können Sie Fehler in der Pipeline beheben:
Prüfen, ob der Messwerte-Adapter registriert und verfügbar ist: Der Messwerte-Adapter muss sich beim Haupt-Kubernetes API-Server registrieren, um Messwerte bereitzustellen. Diese Aktion ist die direkteste Möglichkeit, um zu prüfen, ob der Adapter ausgeführt wird und vom API-Server erreichbar ist:
kubectl get apiservice | grep -E 'NAME|metrics.k8s.io'In der Ausgabe sollten die Einträge
v1beta1.custom.metrics.k8s.iooderv1beta1.external.metrics.k8s.iound in der SpalteAvailableder WertTrueangezeigt werden. Beispiel:NAME SERVICE AVAILABLE AGE v1beta1.metrics.k8s.io kube-system/metrics-server True 18dWenn der Wert in der Spalte
AvailableFalseist oder fehlt, ist Ihr Adapter wahrscheinlich abgestürzt oder falsch konfiguriert. Prüfen Sie die Pod-Logs des Adapters im Namespacekube-systemodercustom-metricsauf Fehler im Zusammenhang mit Berechtigungen, Netzwerkverbindungen zur Messwertquelle oder Nachrichten, die darauf hinweisen, dass der Messwert nicht gefunden werden konnte.Wenn der Wert
Trueist, fahre mit dem nächsten Schritt fort.
Metrics API direkt abfragen: Wenn der Adapter verfügbar ist, umgehen Sie den HorizontalPodAutoscaler und fragen Sie die Kubernetes API direkt nach Ihrem Messwert ab. Mit diesem Befehl wird die gesamte Pipeline getestet, vom API-Server über den Messwertadapter bis zur Datenquelle.
Führen Sie den folgenden Befehl aus, um externe Messwerte abzufragen:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/NAMESPACE_NAME/METRIC_NAME" | jq .Führen Sie den folgenden Befehl aus, um benutzerdefinierte Pod-Messwerte abzufragen:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/NAMESPACE_NAME/pods/*/METRIC_NAME" | jq .Ersetzen Sie Folgendes:
NAMESPACE_NAME: der Namespace, in dem Ihre Pods ausgeführt werden.METRIC_NAME: Der Name des benutzerdefinierten oder externen Messwerts, den Sie abfragen möchten. Beispiel:requests_per_secondoderqueue_depth.
Befehlsausgabe analysieren: Das Ergebnis der vorherigen Befehle zeigt Ihnen, wo das Problem liegt. Wählen Sie das Szenario aus, das Ihrer Ausgabe entspricht:
- Erfolgreiche JSON-Antwort mit einem Wert: Die Pipeline für Messwerte funktioniert korrekt. Das Problem ist wahrscheinlich ein Konfigurationsproblem in Ihrem HorizontalPodAutoscaler-Manifest. Prüfen Sie, ob der Messwertname Rechtschreibfehler enthält oder ob der
matchLabelsfalsch ist. Error: Error from server (Service Unavailable): Dieser Fehler weist in der Regel auf ein Problem mit der Netzwerkverbindung hin, das häufig ein Firewallproblem in Clustern ist, die Netzwerkisolation verwenden.Ermitteln Sie den Metrics-Adapter-Dienst. Sie befindet sich in der Regel im Namespace
custom-metricsoderkube-system:kubectl get service -n custom-metrics,kube-system | grep -E 'adapter|metrics'Ermitteln Sie den Port, an dem der Adapter empfangsbereit ist:
kubectl get service ADAPTER_SERVICE -n ADAPTER_NAMESPACE -o yamlErsetzen Sie Folgendes:
ADAPTER_SERVICE: der Name des Kubernetes-Dienstes, der dem von Ihnen bereitgestellten Messwertadapter zugeordnet ist. Dieser Dienst ist der Dienst, den Sie im vorherigen Schritt gefunden haben. Dieser Dienst macht die Funktionalität des Adapters für andere Teile des Clusters verfügbar, einschließlich des Kubernetes API-Servers.ADAPTER_NAMESPACE: der Namespace, in dem sich der Adapterservice befindet (z. B.custom-metricsoderkube-system).
Suchen Sie die Firewallregeln für eingehenden Traffic für die Steuerungsebene Ihres Clusters:
gcloud compute firewall-rules list \ --filter="name~gke-CLUSTER_NAME-[0-9a-z]*-master"Ersetzen Sie
CLUSTER_NAMEdurch den Namen Ihres Clusters.Fügen Sie der Regel die
einbeziehen.targetPortdes Adapters hinzu:Beschreiben Sie die aktuelle Regel, um die vorhandenen zulässigen Ports zu sehen:
gcloud compute firewall-rules describe FIREWALL_RULE_NAMEErsetzen Sie
FIREWALL_RULE_NAMEdurch den Namen der Firewallregel, die den Netzwerkverkehr zur Steuerungsebene Ihres Kubernetes-Clusters regelt.Aktualisieren Sie die Regel, um den Adapterport der Liste hinzuzufügen:
gcloud compute firewall-rules update FIREWALL_RULE_NAME \ --allow tcp:443,tcp:10250,tcp:ADAPTER_PORTErsetzen Sie
ADAPTER_PORTdurch den Netzwerkport, an dem der Messwerte-Adapter empfangsbereit ist.
Achten Sie darauf, dass Kubernetes-Netzwerkrichtlinien den Traffic zu den Pods des Messwerteadapters nicht blockieren:
kubectl get networkpolicy -n custom-metrics,kube-systemPrüfen Sie alle Richtlinien, um sicherzustellen, dass eingehender Traffic von der Steuerungsebene oder dem API-Server zum
ADAPTER_SERVICEauf demADAPTER_PORTzulässig ist.
Eine leere Liste
[]: Diese Ausgabe bedeutet, dass der Adapter ausgeführt wird, aber die spezifische Messwertquelle nicht abrufen kann. Das deutet auf ein Problem mit der Konfiguration des Adapters oder der Messwertquelle selbst hin.Probleme mit dem Adapter-Pod: Prüfen Sie die Logs des Metrics Adapter-Pods oder der Pods auf Fehler im Zusammenhang mit API-Aufrufen, Authentifizierung oder dem Abrufen von Messwerten. So prüfen Sie die Logs:
Suchen Sie den Namen des Adapter-Pods:
kubectl get pods -n ADAPTER_NAMESPACESo rufen Sie die Logs auf:
kubectl logs ADAPTER_POD_NAME \ -n ADAPTER_NAMESPACEErsetzen Sie Folgendes:
ADAPTER_POD_NAME: Der Name des Adapter-Pods, den Sie im vorherigen Schritt identifiziert haben.ADAPTER_NAMESPACE: Der Namespace, in dem sich der Adapter-Pod befindet (z. B.custom-metricsoderkube-system).
Keine Daten in der Quelle: Der Messwert ist im Quellsystem möglicherweise nicht vorhanden. Verwenden Sie ein Monitoring-Tool wie den Metrics Explorer, um zu prüfen, ob der Messwert vorhanden ist und den richtigen Namen und die richtigen Labels hat.
- Erfolgreiche JSON-Antwort mit einem Wert: Die Pipeline für Messwerte funktioniert korrekt. Das Problem ist wahrscheinlich ein Konfigurationsproblem in Ihrem HorizontalPodAutoscaler-Manifest. Prüfen Sie, ob der Messwertname Rechtschreibfehler enthält oder ob der
Messwertversionen nicht gefunden oder Adapter nicht verfügbar
Symptome
Der folgende Fehler wird angezeigt:
unable to fetch metrics from custom metrics API: no known available metric versions found
Ursache
Dieser Fehler weist auf einen Kommunikationsfehler innerhalb des Clusters hin, nicht auf ein Problem mit der Messwertquelle (z. B. Cloud Monitoring). Häufige Ursachen:
- Der Kubernetes API-Server ist vorübergehend nicht verfügbar (z. B. während eines Clusterupgrades oder einer Reparatur der Steuerungsebene).
- Die Messwerte-Adapter-Pods (z. B.
custom-metrics-stackdriver-adapter) sind fehlerhaft, werden nicht ausgeführt oder sind nicht korrekt beim API-Server registriert.
Lösung
Dieses Problem ist oft nur vorübergehend. Wenn das Problem weiterhin besteht, versuche Folgendes:
Systemdiagnose der Kubernetes-Steuerungsebene prüfen:
In der Google Cloud -Console können Sie den Zustand und Status Ihres Clusters aufrufen.
Rufen Sie die Seite Kubernetes-Cluster auf.
Sehen Sie sich die Spalten Status und Benachrichtigungen für Ihren Cluster an.
Klicken Sie auf Benachrichtigungen, um nach laufenden Vorgängen wie Upgrades oder Reparaturen zu suchen. Der API-Server ist in diesen Zeiträumen möglicherweise kurzzeitig nicht verfügbar.
Prüfen Sie die Cloud-Audit-Logs auf Fehler im Zusammenhang mit Steuerungsebenenkomponenten. Informationen zum Aufrufen dieser Logs finden Sie unter Informationen zum Audit-Logging in GKE.
Prüfen Sie den Status und die Logs der Pods des Messwertadapters: Achten Sie darauf, dass die Pods des Messwertadapters den Status
Runninghaben und in letzter Zeit nicht neu gestartet wurden:kubectl get pods -n custom-metrics,kube-system -o wideWenn der Status eines Pods nicht
Runningist oder er eine hohe Anzahl von Neustarts hat, untersuchen Sie den Pod, um die Ursache zu finden. Tipps zur Fehlerbehebung finden Sie in der Kubernetes-Dokumentation unter Pods debuggen.Prüfen Sie, ob die Messwert-APIs registriert und verfügbar sind:
kubectl get apiservice | grep metrics.k8s.ioWenn die Metrics-APIs fehlerfrei sind, sieht die Ausgabe in etwa so aus:
NAME SERVICE AVAILABLE AGE v1beta1.custom.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 18d v1beta1.external.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 18d v1beta1.metrics.k8s.io kube-system/metrics-server True 18dWenn die Spalte
AVAILABLEden WertFalsehat, enthält die SpalteMessageim vollständigen APIService-Manifest möglicherweise weitere Details.Mit dem folgenden Befehl können Sie das vollständige Manifest aufrufen:
kubectl get apiservice API_SERVICE_NAME -o yamlErsetzen Sie
API_SERVICE_NAMEdurch den Namen des APIService-Objekts, z. B.v1beta1.custom.metrics.k8s.io.
Bei der Messwertabfrage werden keine Zeitreihen zurückgegeben
Symptome
Der folgende Fehler wird angezeigt:
unable to fetch metrics from custom or external metrics API: googleapi: Error
400: The supplied filter [...] query will not return any time series
Ursache
Die an Cloud Monitoring gesendete Abfrage war gültig, hat aber keine Daten zurückgegeben. Das bedeutet, dass keine Datenpunkte vorhanden sind, die Ihrem Filter entsprechen. Dies ist nicht dasselbe wie das Finden eines Messwerts mit dem Wert 0. Der wahrscheinlichste Grund für dieses Problem ist, dass die Anwendung oder Arbeitslast, die für die Generierung des benutzerdefinierten Messwerts verantwortlich ist, während des Zeitraums, in dem die Fehler gemeldet wurden, keine Daten in Cloud Monitoring geschrieben hat.
Lösung
Versuchen Sie Folgendes:
- Konfiguration prüfen: Achten Sie darauf, dass die Messwertnamen und Labels in Ihrem HorizontalPodAutoscaler-Objekt genau mit denen übereinstimmen, die von der Anwendung ausgegeben werden.
- Berechtigungen prüfen: Prüfen Sie, ob die Anwendung mit den erforderlichen Berechtigungen und API-Endpunkten konfiguriert ist, um Messwerte in Cloud Monitoring zu veröffentlichen.
- Anwendungsaktivität bestätigen: Prüfen Sie, ob die für den Messwert verantwortliche Anwendung betriebsbereit war und versucht hat, Daten an Cloud Monitoring zu senden, während des Zeitraums, in dem die HorizontalPodAutoscaler-Warnungen aufgetreten sind.
- Fehler untersuchen: Prüfen Sie die Anwendungslogs aus demselben Zeitraum auf explizite Fehler im Zusammenhang mit der Messwertübermittlung, z. B. Verbindungsfehler, ungültige Anmeldedaten oder Formatierungsprobleme.
Fehlerbehebung bei erwarteter, aber unerwarteter Skalierung
In den folgenden Abschnitten werden Szenarien behandelt, in denen die HorizontalPodAutoscaler-Konfiguration gültig ist und Messwerte verfügbar sind, aber Skalierungsaktionen nicht wie erwartet erfolgen.
HorizontalPodAutoscaler ist fehlerfrei, wird aber nicht skaliert
Symptome
Der HorizontalPodAutoscaler ist fehlerfrei, seine Bedingungen melden True und es werden keine Fehler in seinen Ereignissen angezeigt. Es werden jedoch weiterhin keine Skalierungsmaßnahmen ergriffen.
Ursache
Dafür kann es mehrere Gründe geben:
- Replikatlimits: Die aktuelle Anzahl der Replikate liegt bereits am Grenzwert, der durch das Feld
minReplicasodermaxReplicasin der HorizontalPodAutoscaler-Konfiguration festgelegt ist. - Toleranzfenster: Kubernetes verwendet ein Standardtoleranzfenster von 10 %, um eine Skalierung bei geringfügigen Messwertschwankungen zu verhindern. Die Skalierung erfolgt nur, wenn das Verhältnis des aktuellen Messwerts zum Zielmesswert außerhalb des Bereichs von 0,9 bis 1,1 liegt. Wenn das Ziel beispielsweise 85% CPU-Auslastung und die aktuelle Nutzung 93 % beträgt, liegt das Verhältnis bei etwa 1,094 (93/85 ≈ 1,094). Da dieser Wert kleiner als 1,1 ist, wird der HorizontalPodAutoscaler nicht hochskaliert.
- Nicht bereite Pods: Der HorizontalPodAutoscaler berücksichtigt bei seinen Skalierungsberechnungen nur Pods mit dem Status
Ready. Pods, die im StatusPendinghängen bleiben oder nichtReadywerden (aufgrund von fehlgeschlagenen Systemdiagnosen oder Ressourcenproblemen), werden ignoriert und können die Skalierung verhindern. - Verzögerung des Synchronisierungszeitraums: Der HorizontalPodAutoscaler-Controller prüft Messwerte regelmäßig. Eine Verzögerung von 15 bis 30 Sekunden zwischen dem Überschreiten des Grenzwerts für eine Messwert und dem Beginn einer Skalierungsmaßnahme ist normal.
- Latenz bei neuen Messwerten: Wenn ein HorizontalPodAutoscaler zum ersten Mal einen neuen benutzerdefinierten Messwert verwendet, kann es zu einer einmaligen Latenz von mehreren Minuten kommen. Diese Verzögerung tritt auf, weil das Monitoringsystem (z. B. Cloud Monitoring) die neue Zeitreihe erstellen muss, wenn der erste Datenpunkt geschrieben wird.
- Berechnung mit mehreren Messwerten: Wenn Sie mehrere Messwerte konfigurieren, berechnet der HorizontalPodAutoscaler die erforderliche Replikatanzahl für jeden Messwert unabhängig und wählt dann den höchsten berechneten Wert als endgültige Anzahl von Replikaten aus. Aufgrund dieses Verhaltens wird Ihre Arbeitslast so skaliert, dass sie den Anforderungen des Messwerts mit den höchsten Anforderungen entspricht. Wenn beispielsweise CPU-Messwerte einen Bedarf von 9 Replikaten berechnen, ein Messwert für Anfragen pro Sekunde jedoch einen Bedarf von 15 Replikaten, skaliert der HorizontalPodAutoscaler das Deployment auf 15 Replikate.
Lösung
Versuchen Sie Folgendes:
- Replikatlimits: Prüfen Sie die Werte
minReplicasundmaxReplicasin Ihrem HorizontalPodAutoscaler-Manifest oder in der Ausgabe des Befehlskubectl describe. Passen Sie diese Limits an, wenn sie eine notwendige Skalierung verhindern. - Toleranzbereich: Wenn eine Skalierung innerhalb der Standardtoleranz erforderlich ist, konfigurieren Sie einen anderen Toleranzwert. Warten Sie andernfalls, bis der Messwert außerhalb des Bereichs von 0,9 bis 1,1 liegt.
- Nicht bereite Pods: Untersuchen Sie, warum Pods
Pendingoder nichtReadysind, und beheben Sie die zugrunde liegenden Probleme (z. B. Ressourcenbeschränkungen, fehlgeschlagene Bereitschaftstests). Tipps zur Fehlerbehebung finden Sie in der Kubernetes-Dokumentation unter Pods debuggen. - Verzögerung des Synchronisierungszeitraums und Latenz neuer Messwerte: Diese Latenzen sind normal. Warten Sie, bis der Synchronisierungszeitraum abgeschlossen ist oder die neue Zeitreihe für benutzerdefinierte Messwerte erstellt wurde.
- Berechnung mehrerer Messwerte: Das ist das vorgesehene Verhalten. Wenn das Hochskalieren auf der Grundlage eines Messwerts (z. B. Anfragen pro Sekunde) erfolgt, wird die niedrigere Berechnung eines anderen Messwerts (z. B. CPU) korrekt überschrieben.
HorizontalPodAutoscaler kann nicht herunterskaliert werden
Symptome
Der HorizontalPodAutoscaler skaliert die Arbeitslast erfolgreich hoch, aber nicht wieder herunter, auch wenn Messwerte wie die CPU-Auslastung niedrig sind.
Ursache
Dieses Verhalten soll verhindern, dass schnell hoch- und herunterskaliert wird oder dass auf Grundlage unvollständiger Informationen herunterskaliert wird. Die Hauptgründe sind:
- Mehrere Messwerte verwenden: Das horizontale Pod-Autoscaling wird basierend auf dem Messwert skaliert, für den die meisten Replikate erforderlich sind. Wenn Sie mehrere Messwerte haben, wird die Arbeitslast nur dann herunterskaliert, wenn alle Messwerte darauf hinweisen, dass weniger Replikate erforderlich sind. Wenn für einen Messwert eine hohe Replikatanzahl erforderlich ist, wird eine Verkleinerung verhindert, auch wenn die anderen niedrig sind.
- Nicht verfügbare Messwerte: Wenn ein Messwert nicht mehr verfügbar ist (oft als
<unknown>angezeigt), weigert sich der HorizontalPodAutoscaler, die Arbeitslast herunterzuskalieren. Es kann nicht festgestellt werden, ob der Messwert fehlt, weil die Nutzung tatsächlich null ist oder weil die Messwertpipeline fehlerhaft ist. Dieses Problem tritt häufig bei ratenbasierten benutzerdefinierten Messwerten auf (z. B.messages_per_second). Bei Inaktivität werden dann keine Daten mehr gemeldet. Der HorizontalPodAutoscaler betrachtet den Messwert als nicht verfügbar und stoppt die Herunterskalierungsvorgänge. - Verzögerung beim Herunterskalieren aus der Skalierungsrichtlinie: Mit dem Feld
behaviordes HorizontalPodAutoscalers können Sie Skalierungsrichtlinien konfigurieren. Die Standardrichtlinie für das Herunterskalieren enthält ein Stabilisierungsfenster von 300 Sekunden (5 Minuten). In diesem Zeitraum wird die Anzahl der Replikate durch den HorizontalPodAutoscaler nicht reduziert, auch wenn die Messwerte unter den Zielgrenzwert gefallen sind. Dieses Zeitfenster verhindert schnelle Schwankungen, kann aber dazu führen, dass das Herunterskalieren langsamer als erwartet erfolgt.
Lösung
Versuchen Sie Folgendes:
Wenn Sie mehrere Messwerte haben oder Messwerte nicht verfügbar sind, müssen Sie den Messwert diagnostizieren, der Probleme verursacht:
kubectl describe hpa HPA_NAME -n NAMESPACE_NAMESuchen Sie in der Ausgabe im Abschnitt
Metricsnach Messwerten mit dem Status<unknown>und im AbschnittEventsnach Warnungen wieFailedGetCustomMetricoderFailedGetExternalMetric. Eine detaillierte Anleitung zum Debuggen von Pipelines finden Sie im Abschnitt Fehlerbehebung bei benutzerdefinierten und externen Messwerten.Wenn ein Messwert während eines Zeitraums mit wenig Traffic nicht verfügbar ist (was bei ratenbasierten Messwerten häufig vorkommt), versuchen Sie eine der folgenden Lösungen:
- Verwenden Sie nach Möglichkeit messgerätebasierte Messwerte anstelle von ratenbasierten. Ein Messwert vom Typ „Gauge“, z. B. die Gesamtzahl der Nachrichten in einer Warteschlange (z. B.
subscriptionodernum_undelivered_messages), meldet konsistent einen Wert, auch wenn dieser Wert0ist. So kann der HorizontalPodAutoscaler zuverlässige Skalierungsentscheidungen treffen. - Achten Sie darauf, dass Ihre Messwertquelle Nullwerte meldet. Wenn Sie den benutzerdefinierten Messwert steuern, konfigurieren Sie ihn so, dass er in inaktiven Zeiträumen
0veröffentlicht, anstatt überhaupt keine Daten zu senden.
- Verwenden Sie nach Möglichkeit messgerätebasierte Messwerte anstelle von ratenbasierten. Ein Messwert vom Typ „Gauge“, z. B. die Gesamtzahl der Nachrichten in einer Warteschlange (z. B.
Wenn das standardmäßige fünfminütige Stabilisierungsfenster für Herunterskalierungen zu lang ist, können Sie es anpassen. Sehen Sie sich den Bereich
spec.behavior.scaleDownIhres HorizontalPodAutoscaler-Manifests an. Sie können denstabilizationWindowSecondssenken, damit die Autoscaling-Funktion nach dem Sinken der Messwerte schneller skaliert. Weitere Informationen zum Konfigurieren dieser Richtlinien finden Sie in der Kubernetes-Dokumentation unter Skalierungsrichtlinien.
Fehlerbehebung bei der Skalierung von GKE-Arbeitslasten auf und von null mit HPA
In diesem Abschnitt finden Sie Informationen zur Diagnose von Problemen bei der Konfiguration von Arbeitslasten, die mit HPA auf null skaliert werden (minReplicas: 0) und von null skaliert werden können, in GKE 1.37 oder höher.
Arbeitslast wird nicht auf null skaliert
Wenn Ihre Arbeitslast bei einem oder mehreren Replikaten bleibt, obwohl die Nachfrage auf null sinkt, prüfen Sie Folgendes:
minReplicasprüfen: Achten Sie darauf, dass das Feld-Wert-PaarminReplicas: 0in Ihrem HorizontalPodAutoscaler-Manifest festgelegt ist.- Messwerttypen prüfen: Der HPA kann nicht auf null skaliert werden, wenn er nur CPU- oder Arbeitsspeicher-Messwerte (
Resource) verwendet. Sie müssen mindestens einenExternal- oderObject-Messwert konfigurieren. - Mehrere Messwerte prüfen: Das HPA wird auf Grundlage des Messwerts skaliert, für den die höchste Replikatanzahl erforderlich ist. Wenn Sie mehrere Messwerte konfigurieren, wird die Arbeitslast nur dann auf null skaliert, wenn jeder überwachte Messwert null ergibt.
- Auf das Stabilisierungsfenster für das Herunterskalieren warten: Standardmäßig wartet die GKE fünf Minuten (
scaleDown.stabilizationWindowSeconds: 300) lang, bis die Nachfrage kontinuierlich null ist, bevor sie von einem auf null Replikate herunterskaliert. - Nicht verfügbare Messwerte prüfen: Wenn der Wert eines Messwerts als
<unknown>angezeigt wird, pausiert der HPA die Herunterskalierungsvorgänge, um eine vorzeitige Herunterskalierung zu verhindern. Weitere Informationen finden Sie unter Fehlerbehebung beim Herunterskalieren des horizontalen Pod-Autoscalers.
Arbeitslast wird nicht ab null skaliert
Wenn Ihre Arbeitslast bei steigendem Bedarf bei null Replikaten bleibt, prüfen Sie Folgendes:
HorizontalPodAutoscaler prüfen: Führen Sie den Befehl
kubectl describe hpa HPA_NAMEaus und prüfen Sie die folgenden Abschnitte in der Ausgabe:- Bereich „Messwerte“: Prüfen Sie, ob der Messwert größer als null ist und nicht als
<unknown>angezeigt wird. Wenn der Messwert fehlt oder nicht aktualisiert wird, prüfen Sie, ob die externe Quelle (z. B. Pub/Sub) Ereignisse veröffentlicht und Cloud Monitoring sie empfängt. - Abschnitt „Bedingungen“:
- Fehlerfreier Zustand mit null Replikaten: Prüfen Sie, ob für die Bedingungen
AbleToScale: True,ScalingActive: TrueundScaledToZero: Trueangezeigt wird (mit dem GrundScaledToZero). In diesem Zustand skaliert GKE die Arbeitslast automatisch hoch, wenn die Nachfrage steigt. - Externer Override erkannt: Prüfen Sie, ob der Wert der Bedingung
ScalingActiveentwederFalsemit dem GrundScalingDisabledExternalScaleToZerooderScalingDisabledReplicaCountZeroist. Das weist darauf hin, dass die Arbeitslast manuell auf null skaliert wurde. Die Arbeitslast wurde beispielsweise manuell mit dem Befehlkubectl scaleskaliert. Dadurch wird das Autoscaling pausiert, um Änderungskonflikte zu verhindern.
- Fehlerfreier Zustand mit null Replikaten: Prüfen Sie, ob für die Bedingungen
Lösung: Wenn Sie die automatische Skalierung fortsetzen möchten, skalieren Sie die Bereitstellung manuell auf ein oder mehrere Replikate zurück:
kubectl scale deployment DEPLOYMENT_NAME --replicas=1
- Bereich „Messwerte“: Prüfen Sie, ob der Messwert größer als null ist und nicht als
Auf Kaltstartlatenz prüfen: Wenn die Arbeitslast langsam startet, kann die Knotenbereitstellung zu Verzögerungen führen. Damit die Standby-Rechenkapazität beim Skalieren von null bereit ist, sollten Sie Kapazitätsreserven verwenden.
Nächste Schritte
Wenn Sie in der Dokumentation keine Lösung für Ihr Problem finden, können Sie Support anfordern. Dort erhalten Sie unter anderem Hilfe zu den folgenden Themen:
- Sie können eine Supportanfrage stellen, indem Sie sich an Cloud Customer Care wenden.
- Support von der Community erhalten, indem Sie Fragen auf Stack Overflow stellen und mit dem Tag
google-kubernetes-enginenach ähnlichen Problemen suchen. Sie können auch dem#kubernetes-engine-Slack-Kanal beitreten, um weiteren Community-Support zu erhalten. - Probleme oder Feature Requests über den öffentlichen Issue Tracker melden.