Wenn Ihre Google Kubernetes Engine-Knoten (GKE) nicht wie erwartet skaliert werden, liegt das häufig daran, dass der Cluster-Autoscaler sie nicht entfernen kann. Dies führt zu unnötigen Kosten und einer ineffizienten Ressourcennutzung.
Auf dieser Seite erfahren Sie, wie Sie häufige Probleme diagnostizieren und beheben, die das Herunterskalieren von Clustern durch den Autoscaler verhindern. Wenn Sie diese Probleme beheben, können Sie sicherstellen, dass Ihr Cluster kostengünstig arbeitet und sich an Änderungen der Arbeitslast anpasst.
Diese Informationen sind wichtig für Plattformadministratoren und ‑operatoren, die für die Clustereffizienz, Kostenoptimierung und Ressourcenverwaltung verantwortlich sind.
Anwendungsentwickler benötigen diese Informationen möglicherweise auch, wenn ihre Arbeitslastkonfigurationen (z. B. PodDisruptionBudgets
oder Knotenselektoren) unbeabsichtigt verhindern, dass Knoten entfernt werden. 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.
Informationen dazu, wann der Cluster-Autoscaler Ihre Knoten herunterskaliert
Bevor Sie mit der Fehlerbehebung fortfahren, kann es hilfreich sein, zu verstehen, wann Cluster Autoscaler versucht, Ihre Knoten herunterzuskalieren. Es kann sein, dass Cluster Autoscaler nicht herunterskaliert hat, weil dies nicht erforderlich war.
Cluster Autoscaler ermittelt, ob ein Knoten unterlastet ist und für das Herunterskalieren infrage kommt, indem er einen Auslastungsfaktor berechnet. Der Auslastungsfaktor wird berechnet, indem die von den Pods auf dem Knoten angeforderten vCPU und der Arbeitsspeicher durch die zuweisbaren vCPU und den Arbeitsspeicher auf dem Knoten dividiert werden.
Cluster Autoscaler prüft alle 10 Sekunden den Auslastungsfaktor Ihrer Knoten, um festzustellen, ob er unter dem erforderlichen Schwellenwert liegt. Wenn Sie ein balanced
-Autoscaling-Profil verwenden, beträgt der Grenzwert für den Auslastungsfaktor 0,5. Wenn Sie das Profil optimize-utilization
verwenden, variiert der Auslastungsfaktor. Wenn der Auslastungsfaktor sowohl für vCPU als auch für Arbeitsspeicher unter dem erforderlichen Schwellenwert liegt, betrachtet der Cluster Autoscaler den Knoten als unterlastet.
Wenn ein Knoten unterlastet ist, markiert Cluster Autoscaler den Knoten zum Entfernen und überwacht ihn in den nächsten 10 Minuten, um sicherzustellen, dass der Auslastungsfaktor unter dem erforderlichen Schwellenwert bleibt. Wenn der Knoten nach 10 Minuten immer noch nicht ausgelastet ist, sollte Cluster Autoscaler den Knoten entfernen.
Beispiel: Berechnung des Auslastungsfaktors
Sie haben einen Cluster mit aktiviertem Cluster Autoscaler und verwenden das Autoscaling-Profil balanced
. Ein Knoten in diesem Cluster wird mit dem Maschinentyp e2-standard-4
bereitgestellt, der 4 vCPUs und 16 GB Arbeitsspeicher bietet. Ein Pod auf diesem Knoten fordert 0, 5 vCPU und 10 GB Arbeitsspeicher an.Cluster Autoscaler berechnet daher die folgenden Auslastungsfaktoren:
- vCPU-Auslastungsfaktor: 0,5 vCPU ÷ 4 vCPUs = 0,125
- Faktor für die Arbeitsspeicherauslastung: 10 GB ÷ 16 GB = 0,625
In diesem Szenario würde Cluster Autoscaler diesen Knoten nicht als unterlastet betrachten, da der Speicherauslastungsfaktor (0,625) den Grenzwert von 0,5 überschreitet. Obwohl die vCPU-Auslastung niedrig ist, wird durch die höhere Speichernutzung ein Herunterskalieren verhindert, damit genügend Ressourcen für die Arbeitslast des Pods verfügbar bleiben.
Prüfen, ob das Problem durch eine Einschränkung verursacht wird
Wenn Sie einen Cluster mit geringer Auslastung über einen Zeitraum von mehr als 10 Minuten beobachten und er nicht skaliert wird, prüfen Sie, ob das Problem durch eine der Einschränkungen für das Cluster-Autoscaling verursacht wird.
Fehler ansehen
Wenn das Problem nicht durch eine Einschränkung verursacht wurde, können Sie die Ursache oft anhand von Fehlermeldungen ermitteln:
Wenn Sie bereits eine Fehlermeldung erhalten haben, finden Sie in der Tabelle mit Fehlermeldungen Tipps zum Beheben des Fehlers.
Wenn Sie noch keine Nachricht erhalten haben, haben Sie folgende Möglichkeiten:
- Probleme, die weniger als 72 Stunden alt sind: Fehlermeldungen in der Console ansehen Google Cloud .
- Probleme, die älter als 72 Stunden sind: Fehler in Ereignissen in Cloud Logging ansehen
Fehler in Benachrichtigungen ansehen
Wenn das Problem, das Sie beobachtet haben, vor weniger als 72 Stunden aufgetreten ist, sehen Sie sich die Benachrichtigungen zu Fehlern in der Google Cloud -Konsole an. Diese Benachrichtigungen liefern wertvolle Informationen dazu, warum Cluster Autoscaler nicht herunterskaliert wurde, und bieten Ratschläge, wie Sie den Fehler beheben und relevante Logs für weitere Untersuchungen ansehen können.
So rufen Sie die Benachrichtigungen in der Google Cloud -Console auf:
Rufen Sie in der Google Cloud Console die Seite Kubernetes-Cluster auf.
Sehen Sie sich die Spalte Benachrichtigungen an. Die folgenden Benachrichtigungen sind mit Problemen beim Herunterskalieren verknüpft:
Can't scale down nodes
Scale down blocked by pod
Klicken Sie auf die entsprechende Benachrichtigung, um einen Bereich mit Details zur Ursache des Problems und Empfehlungen zur Behebung aufzurufen.
Optional: Klicken Sie auf Logs, um die Protokolle für dieses Ereignis aufzurufen. Sie werden zum Log-Explorer weitergeleitet, wo eine Abfrage vorab ausgefüllt ist, mit der Sie das Skalierungsereignis weiter untersuchen können. Weitere Informationen zur Funktionsweise von Herunterskalierungsereignissen finden Sie unter Cluster-Autoscaling-Ereignisse ansehen.
Wenn nach dem Lesen der Hinweise in der Benachrichtigung weiterhin Probleme auftreten, sehen Sie in den Tabellen mit Fehlermeldungen nach.
Fehler in Ereignissen ansehen
Wenn das Problem, das Sie beobachtet haben, vor mehr als 72 Stunden aufgetreten ist, sehen Sie sich die Ereignisse in Cloud Logging an. Wenn ein Fehler aufgetreten ist, wird er oft in einem Ereignis aufgezeichnet.
So rufen Sie Cluster-Autoscaling-Logs in der Google Cloud -Console auf:
Rufen Sie in der Google Cloud Console die Seite Kubernetes-Cluster auf.
Wählen Sie den Namen des Clusters aus, den Sie untersuchen möchten, um die Seite Clusterdetails aufzurufen.
Klicken Sie auf der Seite Clusterdetails auf den Tab Logs.
Klicken Sie auf dem Tab Logs auf den Tab Autoscaling-Logs, um die Logs aufzurufen.
Optional: Wenn Sie erweiterte Filter anwenden möchten, um die Ergebnisse einzugrenzen, klicken Sie auf die Schaltfläche mit dem Pfeil rechts auf der Seite, um die Logs im Log-Explorer aufzurufen.
Weitere Informationen zu Herunterskalierungsereignissen finden Sie unter Cluster-Autoscaling-Ereignisse ansehen. Ein Beispiel für die Verwendung von Cloud Logging finden Sie im folgenden Beispiel für die Fehlerbehebung.
Beispiel: Ein Problem beheben, das älter als 72 Stunden ist
Das folgende Beispiel zeigt, wie Sie ein Problem mit einem Cluster, der nicht skaliert wird, untersuchen und beheben können.
Szenario:
Vor einer Woche haben Sie sich das GKE-Dashboard angesehen und festgestellt, dass Ihr Cluster nur 10% seiner CPU und seines Arbeitsspeichers genutzt hat. Trotz der geringen Auslastung hat Cluster Autoscaler den Knoten nicht wie erwartet gelöscht. Wenn Sie sich das Dashboard jetzt ansehen, scheint das Problem behoben zu sein. Sie möchten aber herausfinden, was passiert ist, damit es nicht noch einmal auftritt.
Prüfung
- Da das Problem vor mehr als 72 Stunden aufgetreten ist, untersuchen Sie es mit Cloud Logging anstatt sich die Benachrichtigungen anzusehen.
- In Cloud Logging finden Sie die Logging-Details für Cluster Autoscaler-Ereignisse, wie unter Fehler in Ereignissen ansehen beschrieben.
- Suchen Sie nach
scaleDown
-Ereignissen, die die Knoten des Clusters, den Sie untersuchen, im FeldnodesToBeRemoved
enthalten. Sie können die Logeinträge filtern, auch nach einem bestimmten JSON-Feldwert. Weitere Informationen finden Sie unter Erweiterte Logabfragen. - Sie finden keine
scaleDown
-Ereignisse. Wenn Sie jedoch einscaleDown
-Ereignis gefunden haben, können Sie nach einemeventResult
-Ereignis suchen, das die zugehörigeeventId
enthält. Sie können dann im FelderrorMsg
nach einem Fehler suchen. Sie beschließen, Ihre Untersuchung fortzusetzen und nach
noScaleDown
-Ereignissen zu suchen, die den Knoten, den Sie untersuchen, im Feld „nodes“ enthalten.Sie finden ein
noScaleDown
-Ereignis, das einen Grund dafür enthält, warum Ihr Knoten nicht herunterskaliert wird. Die Meldungs-ID lautet"no.scale.down.node.pod.not.backed.by.controller"
und enthält einen einzigen Parameter:"test-single-pod"
.
Lösung:
Sie sehen in der Tabelle mit Fehlermeldungen nach und stellen fest, dass diese Meldung bedeutet, dass der Pod das Herunterskalieren blockiert, weil er nicht von einem Controller gestützt wird. Sie finden heraus, dass eine Lösung darin besteht, dem Pod die Anmerkung "cluster-autoscaler.kubernetes.io/safe-to-evict": "true"
hinzuzufügen. Sie untersuchen test-single-pod
und stellen fest, dass ein Kollege die Anmerkung hinzugefügt hat. Nachdem die Anmerkung angewendet wurde, hat Cluster Autoscaler den Cluster korrekt herunterskaliert. Sie beschließen, die Annotation allen anderen Pods hinzuzufügen, bei denen dies sicher ist, um das Problem in Zukunft zu vermeiden.
Fehler bei der Herunterskalierung beheben
Nachdem Sie den Fehler identifiziert haben, können Sie anhand der folgenden Tabellen die Ursache des Fehlers und die Vorgehensweise zur Behebung ermitteln.
ScaleDown-Fehler
Fehlerereignismeldungen für scaleDown
-Ereignisse finden Sie im entsprechenden eventResult
-Ereignis im Feld resultInfo.results[].errorMsg
.
Ereignisnachricht | Details | Parameter | Risikominderung |
---|---|---|---|
"scale.down.error.failed.to.mark.to.be.deleted" |
Ein Knoten konnte nicht zum Löschen markiert werden. | Name des fehlgeschlagenen Knotens. | Diese Meldung sollte nur temporär sein. Wenn sie weiterhin angezeigt wird, wenden Sie sich an Cloud Customer Care, um weitere Unterstützung zu erhalten. |
"scale.down.error.failed.to.evict.pods" |
Cluster Autoscaler kann nicht herunterskalieren, da einige Pods nicht aus einem Knoten entfernt werden konnten. | Name des fehlgeschlagenen Knotens. | Überprüfen Sie das PodDisruptionBudget für den Pod und achten Sie darauf, dass die Regeln das Entfernen von Anwendungsreplikaten nach Möglichkeit zulassen. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter Unterbrechungsbudget für Ihre Anwendung festlegen. |
"scale.down.error.failed.to.delete.node.min.size.reached" |
Cluster Autoscaler kann nicht herunterskalieren, da ein Knoten aufgrund der bereits erreichten Mindestgröße des Clusters nicht gelöscht werden konnte. | Name des fehlgeschlagenen Knotens. | Prüfen Sie den für Autoscaling von Knotenpools festgelegten Mindestwert und passen Sie die Einstellungen nach Bedarf an. Weitere Informationen finden Sie unter Fehler: Knoten im Cluster haben die Mindestgröße erreicht. |
Gründe für ein noScaleDown-Ereignis
Ein noScaleDown
-Ereignis wird regelmäßig ausgegeben, wenn Knoten blockiert sind und daher nicht von Cluster Autoscaler gelöscht werden können. noScaleDown
-Ereignisse sind Best-Effort-Ereignisse und decken nicht alle potenziellen Fälle ab.
Gründe auf oberster Ebene für "NoScaleDown"
Meldungen mit Gründen auf oberster Ebene für noScaleDown
-Ereignisse werden im Feld noDecisionStatus.noScaleDown.reason
angezeigt. Die Meldung enthält einen Grund auf oberster Ebene, warum Cluster Autoscaler den Cluster nicht herunterskalieren kann.
Ereignisnachricht | Details | Risikominderung |
---|---|---|
"no.scale.down.in.backoff" |
Cluster Autoscaler kann nicht herunterskalieren, da dieser Vorgang in einen Backoff-Zeitraum fällt (vorübergehend blockiert ist). | Diese Meldung sollte nur vorübergehend sein und kann auftreten, wenn in letzter Zeit hochskaliert wurde. Wenn die Meldung weiterhin angezeigt wird, wenden Sie sich an Cloud Customer Care, um das Problem untersuchen zu lassen. |
"no.scale.down.in.progress" |
Cluster Autoscaler kann nicht herunterskalieren, da noch eine vorherige Herunterskalierung ausgeführt wurde. |
Diese Meldung sollte nur temporär sein, da der Pod letztendlich entfernt wird. Wenn diese Meldung häufig angezeigt wird, prüfen Sie den Kulanzzeitraum für die Beendigung der Pods, die das Herunterskalieren verhindern. Wenn das Problem schneller behoben werden soll, können Sie den Pod auch löschen, wenn er nicht mehr benötigt wird. |
Gründe auf Knotenebene für "noScaleDown"
Meldungen mit Gründen auf Knotenebene für noScaleDown
-Ereignisse werden im noDecisionStatus.noScaleDown.nodes[].reason field
angezeigt. Die Meldung enthält einen Grund, warum Cluster Autoscaler einen bestimmten Knoten nicht entfernen kann.
Ereignisnachricht | Details | Parameter | Risikominderung |
---|---|---|---|
"no.scale.down.node.scale.down.disabled.annotation" |
Cluster Autoscaler kann einen Knoten nicht aus dem Knotenpool entfernen, da der Knoten mit cluster-autoscaler.kubernetes.io/scale-down-disabled: true gekennzeichnet ist.
|
– | Cluster Autoscaler überspringt Knoten mit dieser Annotation, ohne ihre Auslastung zu berücksichtigen. Diese Meldung wird unabhängig vom Auslastungsfaktor des Knotens protokolliert. Wenn Cluster Autoscaler diese Knoten herunterskalieren soll, entfernen Sie die Annotation. |
"no.scale.down.node.node.group.min.size.reached" |
Cluster Autoscaler kann nicht herunterskalieren, wenn die Größe der Knotengruppe das Mindestgrößenlimit überschritten hat. Das liegt daran, dass das Entfernen von Knoten gegen die clusterweiten Mindestressourcenlimits verstoßen würde, die in den Einstellungen für die automatische Knotenbereitstellung festgelegt sind. |
– | Prüfen Sie den für das Autoscaling von Knotenpools festgelegten Mindestwert. Wenn Sie möchten, dass Cluster Autoscaler diesen Knoten herunterskaliert, passen Sie den Mindestwert an. |
"no.scale.down.node.minimal.resource.limits.exceeded" |
Cluster Autoscaler kann Knoten nicht herunterskalieren, da dies gegen clusterweite Mindestressourcenlimits verstoßen würde. Dies sind die Ressourcenlimits, die für die automatische Knotenbereitstellung festgelegt sind. |
– | Prüfen Sie die Limits für Arbeitsspeicher und vCPU. Wenn Cluster Autoscaler diesen Knoten herunterskalieren soll, verringern Sie die Limits. |
"no.scale.down.node.no.place.to.move.pods" |
Cluster Autoscaler kann nicht herunterskalieren, da es keinen Ort gibt, an den Pods verschoben werden können. | – | Wenn Sie davon ausgehen, dass der Pod neu geplant werden sollte, prüfen Sie die Planungsanforderungen der Pods auf dem nicht ausgelasteten Knoten. So können Sie feststellen, ob sie zu einem anderen Knoten im Cluster verschoben werden können. Weitere Informationen finden Sie unter Fehler: Kein Ort zum Verschieben von Pods. |
"no.scale.down.node.pod.not.backed.by.controller" |
Der Pod blockiert das Herunterskalieren, da er nicht von einem Controller gestützt wird. Cluster Autoscaler kann einen nicht ausgelasteten Knoten vor allem nicht herunterskalieren, da ein Pod keinen erkannten Controller hat. Zu den zulässigen Controllern gehören ReplicationController, DaemonSet, Job, StatefulSet oder ReplicaSet. |
Name des blockierenden Pods. | Legen Sie die Annotation "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" für den Pod fest oder definieren Sie einen zulässigen Controller. |
"no.scale.down.node.pod.not.safe.to.evict.annotation" |
Ein Pod auf dem Knoten hat die Annotation safe-to-evict=false . |
Name des blockierenden Pods. | Wenn der Pod sicher entfernt werden kann, bearbeiten Sie das Manifest des Pods und aktualisieren Sie die Annotation auf "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" . |
"no.scale.down.node.pod.kube.system.unmovable" |
Der Pod blockiert das Herunterskalieren, da er ein Nicht-DaemonSet und nicht gespiegelter Pod ohne PodDisruptionBudget im kube-system -Namespace ist. |
Name des blockierenden Pods. | In GKE-Versionen vor 1.32.4-gke.1236000 entfernt Cluster Autoscaler keine Pods im Namespace Um dieses Problem zu beheben, fügen Sie entweder ein PodDisruptionBudget für die |
"no.scale.down.node.pod.not.enough.pdb" |
Der Pod blockiert das Herunterskalieren, da nicht genügend PodDisruptionBudget vorhanden ist. | Name des blockierenden Pods. | Sehen Sie sich das PodDisruptionBudget für den Pod an und stellen Sie es gegebenenfalls weniger restriktiv ein. Weitere Informationen finden Sie unter Fehler: Nicht genügend PodDisruptionBudget. |
"no.scale.down.node.pod.controller.not.found" |
Der Pod blockiert das Herunterskalieren, da der Controller (z. B. Deployment oder ReplicaSet) nicht gefunden werden kann. | – | Prüfen Sie die Logs, um festzustellen, welche Maßnahmen ergriffen wurden, durch die ein Pod weiterhin ausgeführt wurde, nachdem der Controller entfernt wurde. Löschen Sie den Pod manuell, um das Problem zu beheben. |
"no.scale.down.node.pod.unexpected.error" |
Der Pod blockiert das Herunterskalieren aufgrund eines unerwarteten Fehlers. | – | Die Ursache dieses Fehlers ist unbekannt. Wenden Sie sich an das Cloud Customer Care-Team, um das Problem genauer untersuchen zu lassen. |
Weitere Untersuchungen durchführen
In den folgenden Abschnitten finden Sie Informationen dazu, wie Sie den Log-Explorer und gcpdiag
verwenden können, um zusätzliche Informationen zu Ihren Fehlern zu erhalten.
Fehler im Log-Explorer untersuchen
Wenn Sie die Fehlermeldung genauer untersuchen möchten, können Sie die entsprechenden Logs aufrufen:
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" log_id("container.googleapis.com/cluster-autoscaler-visibility") jsonPayload.resultInfo.results.errorMsg.messageId="ERROR_MESSAGE"
Ersetzen Sie
ERROR_MESSAGE
durch die Nachricht, die Sie untersuchen möchten. Beispiel:scale.down.error.failed.to.delete.node.min.size.reached
Klicken Sie auf Abfrage ausführen.
Einige Fehler mit gcpdiag beheben
gcpdiag
ist ein Open-Source-Tool, das mit Unterstützung von technischen Experten von Google Cloudentwickelt wurde. Es ist kein offiziell unterstütztes Google Cloud -Produkt.
Wenn eine der folgenden Fehlermeldungen angezeigt wird, können Sie gcpdiag
verwenden, um das Problem zu beheben:
scale.down.error.failed.to.evict.pods
no.scale.down.node.node.group.min.size.reached
Eine Liste und Beschreibung aller gcpdiag
-Tool-Flags finden Sie in der gcpdiag
-Nutzungsanleitung.
Komplexe Fehler beim Herunterskalieren beheben
Die folgenden Abschnitte enthalten Anleitungen zum Beheben von Fehlern, bei denen die Maßnahmen mehrere Schritte umfassen, und von Fehlern, denen keine Cluster-Autoscaler-Ereignismeldung zugeordnet ist.
Fehler: Knoten im Cluster haben die Mindestgröße erreicht
Wenn Sie die folgenden Fehler sehen, konnte Cluster Autoscaler einen Knoten nicht löschen, da die Anzahl der Knoten im Cluster bereits die Mindestgröße erreicht hatte:
Benachrichtigung
Das Herunterskalieren eines nicht ausgelasteten Knotens wird blockiert, da die Mindestressourcenlimits für Cluster Autoscaler erreicht sind.
Ereignis
"scale.down.error.failed.to.delete.node.min.size.reached"
So beheben Sie das Problem:
Rufen Sie in der Google Cloud Console die Seite Kubernetes-Cluster auf:
Klicken Sie auf den Namen des Clusters, der in der Benachrichtigung oder in Cloud Logging angegeben ist.
Rufen Sie auf der Seite Clusterdetails den Tab Knoten auf.
Prüfen Sie den Wert in der Spalte Anzahl der Knoten und vergleichen Sie ihn mit der Mindestanzahl der Knoten, die in der Spalte Autoscaling aufgeführt ist. Wenn beispielsweise in der Spalte Autoscaling 4 bis 6 Knoten aufgeführt sind und die Anzahl der Knoten im Knotenpool 4 beträgt, entspricht die Anzahl der Knotenpools bereits der Mindestgröße. Cluster Autoscaler kann die Knoten also nicht weiter herunterskalieren.
Wenn die Konfiguration korrekt ist und der Wert für die Anzahl der Knoten dem für Autoscaling definierten Mindestwert entspricht, funktioniert Cluster Autoscaler wie vorgesehen. Wenn die Mindestanzahl von Knoten für Ihre Anforderungen zu hoch ist, reduzieren Sie die Mindestgröße, damit die Knoten herunterskaliert werden können.
Fehler: Kein Ort zum Verschieben von Pods
Die folgenden Fehler treten auf, wenn Cluster Autoscaler versucht, einen Knoten herunterzuskalieren, dies aber nicht möglich ist, weil ein Pod auf diesem Knoten nicht auf einen anderen Knoten verschoben werden kann:
Benachrichtigung
Das Herunterskalieren eines nicht ausgelasteten Knotens wird blockiert, da er einen Pod enthält, der nicht auf einen anderen Knoten im Cluster verschoben werden kann.
Ereignis
"no.scale.down.node.no.place.to.move.pods"
Wenn Sie nicht möchten, dass dieser Pod neu geplant wird, ist diese Nachricht zu erwarten und es sind keine Änderungen erforderlich. Wenn Sie möchten, dass der Pod neu geplant wird, untersuchen Sie die folgenden Definitionen in pod.spec block
im Manifest des Pods:
- NodeAffinity: Prüfen Sie die Planungsanforderungen der Pods auf dem nicht ausgelasteten Knoten. Sie können diese Anforderungen prüfen, indem Sie das Pod-Manifest untersuchen und nach NodeAffinity- oder NodeSelector-Regeln suchen. Wenn für den Pod ein „nodeSelector“ definiert ist und es keine anderen Knoten (aus anderen Knotenpools) im Cluster gibt, die diesem Selektor entsprechen, kann Cluster Autoscaler den Pod nicht auf einen anderen Knoten verschieben. Dadurch wird verhindert, dass nicht ausgelastete Knoten entfernt werden.
maxPodConstraint
: WennmaxPodConstraint
auf eine andere Zahl als die Standardzahl 110 konfiguriert ist, prüfen Sie, ob dies eine beabsichtigte Änderung war. Wenn Sie diesen Wert verringern, steigt die Wahrscheinlichkeit von Problemen. Cluster Autoscaler kann Pods nicht auf anderen Knoten neu planen, wenn alle anderen Knoten im Cluster bereits den inmaxPodConstraint
definierten Wert erreicht haben und somit kein Platz für die Planung neuer Pods vorhanden ist. Wenn Sie den Wert vonmaxPodConstraint
erhöhen, können mehr Pods auf Knoten geplant werden. Der Cluster Autoscaler hat dann mehr Spielraum, um Pods neu zu planen und unterlastete Knoten herunterzuskalieren. Berücksichtigen Sie beim Definieren vonmaxPodConstraint
, dass auf jedem Knoten etwa 10 System-Pods vorhanden sind.hostPort
: Wenn Sie einehostPort
für den Pod angeben, kann nur ein Pod auf diesem Knoten ausgeführt werden. Dies kann es Cluster Autoscaler erschweren, die Anzahl der Knoten zu verringern, da der Pod möglicherweise nicht auf einen anderen Knoten verschoben werden kann, wenn der Port dieses Knotens bereits verwendet wird. Das ist ganz normal.- Sitzungsspezifischer Speicher: Pods verwenden sitzungsspezifischen Speicher für temporäre Daten. Unzureichender flüchtiger Speicher auf Knoten kann die Pod-Planung behindern und das Herunterskalieren nicht ausgelasteter Knoten verhindern. Beispiel: Ein Pod, der 6 GB sitzungsspezifischen Speicher benötigt, kann nicht auf Knoten mit weniger als 6 GB freiem sitzungsspezifischen Speicher geplant werden, auch wenn sie über genügend CPU- und Arbeitsspeicherressourcen verfügen. Um die Einschränkungen des sitzungsspezifischen Speichers zu umgehen, erhöhen Sie die bereitgestellte Kapazität des sitzungsspezifischen Speichers für Ihre Knoten. So ist ausreichend Kapazität für die Verlagerung und Skalierung von Pods vorhanden.
Fehler: kube-system-Pod kann nicht verschoben werden
Die folgenden Fehler treten auf, wenn ein System-Pod das Herunterskalieren verhindert:
Benachrichtigung
Der Pod blockiert das Herunterskalieren, da er ein Nicht-DaemonSet und nicht gespiegelter Pod ohne eine PodDisruptionBudget im
kube-system
-Namespace ist.
Ereignis
"no.scale.down.node.pod.kube.system.unmovable"
Pods im Namespace kube-system
gelten als System-Pods. In GKE-Version 1.32.4-gke.1236000 und höher kann der Cluster Autoscaler Knoten herunterskalieren, indem er System-Pods entfernt, die seit mindestens einer Stunde ausgeführt werden. In früheren GKE-Versionen entfernt Cluster Autoscaler keine Pods im Namespace kube-system
, was das Herunterskalieren auf unbestimmte Zeit verhindern kann.
Wählen Sie eine der folgenden Optionen, um diesen Fehler zu beheben:
Fügen Sie
PodDisruptionBudget
für diekube-system
-Pods hinzu. Weitere Informationen zum manuellen Hinzufügen einesPodDisruptionBudget
für diekube-system
-Pods finden Sie in den FAQs zum Kubernetes-Cluster-Autoscaling.Das Erstellen eines
PodDisruptionBudget
kann sich auf die Verfügbarkeit von Systemarbeitslasten auswirken und zu Ausfallzeiten im Cluster führen. Cluster Autoscaler plant diese Systemarbeitslasten während des Herunterskalierungsprozesses auf anderen Worker-Knoten neu.Verwenden Sie eine Kombination aus Knotenpoolmarkierungen und -toleranzen, um
kube-system
-Pods von Ihren Anwendungs-Pods zu trennen. Weitere Informationen finden Sie unter Automatische Knotenbereitstellung in GKE.
Prüfen, ob Knoten kube-system
-Pods haben
Wenn Sie nicht sicher sind, ob auf Ihren Knoten kube-system
-Pods ausgeführt werden, und dies überprüfen möchten, führen Sie die folgenden Schritte aus:
Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf.
Klicken Sie auf Query Builder.
Verwenden Sie die folgende Abfrage, um alle Logs der Netzwerkrichtlinien zu finden:
- resource.labels.location="CLUSTER_LOCATION" resource.labels.cluster_name="CLUSTER_NAME" logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fcluster-autoscaler-visibility" jsonPayload.noDecisionStatus.noScaleDown.nodes.node.mig.nodepool="NODE_POOL_NAME"
Dabei gilt:
CLUSTER_LOCATION
ist die Region, in der sich der Cluster befindet.CLUSTER_NAME
ist der Name Ihres Clusters.PROJECT_ID
: die ID des Projekts, zu dem Ihr Cluster gehört.NODE_POOL_NAME
ist der Name des Knotenpools.
Wenn in Ihrem Knotenpool
kube-system
-Pods ausgeführt werden, enthält die Ausgabe Folgendes:"no.scale.down.node.pod.kube.system.unmovable"
Fehler: Nicht genügend PodDisruptionBudget
Die folgenden Fehler treten auf, wenn PodDisruptionBudget
das Herunterskalieren verhindert:
Benachrichtigung
Das Herunterskalieren eines nicht ausgelasteten Knotens wird blockiert, da ein Pod darauf ausgeführt wird, der nicht genügend PodDisruptionBudget hat, um die Entfernung des Pods zuzulassen.
Ereignis
NoScaleDownNodePodNotEnoughPdb: "no.scale.down.node.pod.not.enough.pdb"
So prüfen Sie, ob die Einstellungen eines PodDisruptionBudget
zu restriktiv sind:
kubectl get pdb --all-namespaces
Die Ausgabe sieht etwa so aus:
NAMESPACE NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
example-app-one one_pdb N/A 1 1 12d
example-app-two two_pdb N/A 0 0 12d
In diesem Beispiel werden alle Pods, die mit der Labelauswahl two_pdb
übereinstimmen, nicht von Cluster Autoscaler entfernt. Die Einstellung maxUnavailable: 0
in diesem PodDisruptionBudget
gibt vor, dass alle Replikate jederzeit verfügbar sein müssen. Außerdem sind gemäß disruptionsAllowed: 0
Unterbrechungen dieser Pods verboten. Folglich können Knoten, auf denen diese Pods ausgeführt werden, nicht herunterskaliert werden, da dies zu einer Unterbrechung führen und gegen die PodDisruptionBudget
verstoßen würde.
Wenn Ihre PodDisruptionBudget
wie gewünscht funktioniert, müssen Sie nichts weiter tun. Wenn Sie Ihre PodDisruptionBudget
so anpassen möchten, dass Pods auf einem nicht optimal genutzten Knoten verschoben werden können, bearbeiten Sie das Manifest der PodDisruptionBudget
.
Wenn Sie beispielsweise maxUnavailable
auf 0
festgelegt haben, können Sie es in 1
ändern, damit Cluster Autoscaler herunterskalieren kann.
Problem: Knoten bleibt im Status „Cordoned“ und wird nicht entfernt
Fehler wie der folgende treten auf, wenn Cluster Autoscaler die Größe des Knotenpools nicht reduzieren kann, weil das Google-Dienstkonto nicht die Rolle „Bearbeiter“ hat:
Required 'compute.instanceGroups.update' permission for 'INSTANCE_GROUP_NAME'.
Ein häufiges Symptom dieses Problems ist, wenn Cluster Autoscaler versucht, die Knotenpoolgröße zu verringern, der Status des Knotens sich jedoch nicht ändert.
Prüfen Sie, ob dem Standarddienstkonto (PROJECT_NUMBER@cloudservices.gserviceaccount.com
) die Rolle „Bearbeiter“ (roles/editor
) für das Projekt zugewiesen ist. Wenn das Dienstkonto diese Rolle nicht hat, fügen Sie sie hinzu. GKE verwendet dieses Dienstkonto, um die Ressourcen Ihres Projekts zu verwalten. Eine Anleitung dazu finden Sie in der IAM-Dokumentation unter Einzelne Rolle zuweisen oder widerrufen.
Nächste Schritte
Sehen Sie sich die folgenden Fragen in den FAQs zum Kubernetes Cluster Autoscaler an:
In diesem YouTube-Video erfahren Sie, wie Sie Fehler und Skalierungsprobleme beheben.
Wenn Sie in der Dokumentation keine Lösung für Ihr Problem finden, lesen Sie den Abschnitt Support erhalten. Dort finden Sie weitere Hilfe, z. B. zu den folgenden Themen:
- Sie können eine Supportanfrage erstellen, indem Sie sich an den Cloud Customer Care wenden.
- Support von der Community erhalten, indem Sie Fragen auf Stack Overflow stellen und mit dem Tag
google-kubernetes-engine
nach ähnlichen Problemen suchen. Sie können auch dem#kubernetes-engine
-Slack-Kanal beitreten, um weiteren Community-Support zu erhalten. - Sie können Fehler melden oder Funktionsanfragen stellen, indem Sie die öffentliche Problemverfolgung verwenden.