Wenn Ihre Google Kubernetes Engine-Knoten (GKE-Knoten) 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 Cluster Autoscaler verhindern. Wenn Sie diese Probleme beheben, können Sie dafür sorgen, dass Ihr Cluster kostengünstig funktioniert und sich an Änderungen der Arbeitslast anpasst.
Diese Informationen sind wichtig für Plattformadministratoren und ‑operatoren, die für Clustereffizienz, Kostenoptimierung und Ressourcenverwaltung verantwortlich sind.
Anwendungsentwickler benötigen diese Informationen möglicherweise auch, wenn ihre Workload-Konfigurationen (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.
Herunterskalierung von Knoten durch Cluster Autoscaler
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 wurde, weil dies nicht erforderlich war.
Der 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, liegt der Grenzwert für den Auslastungsfaktor bei 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 Cluster Autoscaler den Knoten als nicht ausgelastet.
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 ihn 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 vCPUs 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 Arbeitsspeicherauslastungsfaktor (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 länger als 10 Minuten beobachten und er nicht skaliert wird, prüfen Sie, ob Ihr Problem durch eine der Einschränkungen für das Cluster-Autoscaling verursacht wird.
Fehler ansehen
Wenn Ihr Problem nicht durch eine Einschränkung verursacht wurde, können Sie die Ursache oft anhand von Fehlermeldungen diagnostizieren:
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, verwenden Sie eine der folgenden Optionen:
- Probleme, die weniger als 72 Stunden alt sind: Fehlerbenachrichtigungen in der Google Cloud Console ansehen.
- 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 Console an. Diese Benachrichtigungen bieten wertvolle Informationen dazu, warum Cluster Autoscaler nicht herunterskaliert hat, und enthalten Hinweise, wie Sie den Fehler beheben und relevante Logs für weitere Untersuchungen aufrufen 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 nodesScale down blocked by pod
Klicken Sie auf die entsprechende Benachrichtigung, um einen Bereich mit Details zur Ursache des Problems und empfohlenen Maßnahmen zur Behebung aufzurufen.
Optional: Klicken Sie auf Logs, um die Protokolle für dieses Ereignis aufzurufen. Dadurch gelangen Sie zum Log-Explorer mit einer vorab ausgefüllten Abfrage, 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, finden Sie weitere Informationen in den Tabellen mit Fehlermeldungen.
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 häufig 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 prüfen 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 den Button mit dem Pfeil rechts auf der Seite, um die Logs im Log-Explorer aufzurufen.
Weitere Informationen zur Funktionsweise von Herunterskalierungsereignissen finden Sie unter Cluster-Autoscaling-Ereignisse ansehen. Ein Beispiel für die Verwendung von Cloud Logging finden Sie im folgenden Beispiel zur Fehlerbehebung.
Beispiel: Ein Problem beheben, das vor mehr als 72 Stunden aufgetreten ist
Im folgenden Beispiel wird gezeigt, wie Sie ein Problem mit einem Cluster untersuchen und beheben können, der nicht herunterskaliert wird.
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 enthalten, den Sie im FeldnodesToBeRemoveduntersuchen. 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örigeeventIdenthält. Sie können dann im FelderrorMsgnach einem Fehler suchen. Sie beschließen, Ihre Untersuchung fortzusetzen, indem Sie nach
noScaleDown-Ereignissen 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 Nachrichten-ID ist"no.scale.down.node.pod.not.backed.by.controller"und es gibt einen einzelnen Parameter:"test-single-pod".
Lösung:
Sie sehen sich die Tabelle mit Fehlermeldungen an 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 sich das Problem durch Hinzufügen der Annotation "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" zum Pod lösen lässt. 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 beim Herunterskalieren beheben
Nachdem Sie den Fehler identifiziert haben, können Sie anhand der folgenden Tabellen nachvollziehen, was den Fehler verursacht hat und wie Sie ihn beheben können.
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 wird beschrieben, wie Sie den Log-Explorer und gcpdiag verwenden können, um weitere Informationen zu Ihren Fehlern zu erhalten.
Fehler im Log-Explorer untersuchen
Wenn Sie die Fehlermeldung genauer untersuchen möchten, können Sie die entsprechenden Protokolle 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_MESSAGEdurch die Nachricht, die Sie untersuchen möchten. Beispiel:scale.down.error.failed.to.delete.node.min.size.reachedKlicken Sie auf Abfrage ausführen.
Einige Fehler mit gcpdiag beheben
gcpdiag ist ein Open-Source-Tool, das mit Unterstützung von Google Cloud-Technikern entwickelt wurde. Es ist kein offiziell unterstütztes Google Cloud -Produkt.
Wenn eine der folgenden Fehlermeldungen angezeigt wird, können Sie das Problem mithilfe von gcpdiag beheben:
scale.down.error.failed.to.evict.podsno.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
In den folgenden Abschnitten finden Sie Informationen 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 von Cluster Autoscaler erreicht wurden.
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, wird diese Nachricht erwartet 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: WennmaxPodConstraintauf eine andere Zahl als die Standardzahl 110 konfiguriert ist, prüfen Sie, ob dies eine beabsichtigte Änderung war. Wenn Sie diesen Wert senken, steigt die Wahrscheinlichkeit von Problemen. Cluster Autoscaler kann Pods nicht auf andere Knoten verschieben, wenn alle anderen Knoten im Cluster bereits den inmaxPodConstraintdefinierten Wert erreicht haben und kein Platz mehr für die Planung neuer Pods vorhanden ist. Wenn Sie den Wert vonmaxPodConstrainterhöhen, können mehr Pods auf Knoten geplant werden und der Cluster Autoscaler hat Platz, um Pods neu zu planen und nicht ausgelastete Knoten herunterzuskalieren. Berücksichtigen Sie beim Definieren vonmaxPodConstraint, dass auf jedem Knoten etwa 10 System-Pods vorhanden sind.hostPort: Wenn Sie einehostPortfü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 reduzieren, 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 verfügbarem sitzungsspezifischem Speicher geplant werden, selbst wenn diese über ausreichende CPU- und Arbeitsspeicherressourcen verfügen. Um Einschränkungen des flüchtigen Speichers zu umgehen, erhöhen Sie die bereitgestellte Kapazität des flüchtigen Speichers für Ihre Knoten. So ist für Pod-Verschiebungen und Skalierungsvorgänge ausreichend Kapazität 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 Lösungen, um diesen Fehler zu beheben:
Fügen Sie
PodDisruptionBudgetfür diekube-system-Pods hinzu. Weitere Informationen zum manuellen Hinzufügen einesPodDisruptionBudgetfür diekube-system-Pods finden Sie in den FAQs zum Kubernetes-Cluster-Autoscaling.Das Erstellen eines
PodDisruptionBudgetkann sich auf die Verfügbarkeit von Systemarbeitslasten auswirken und zu Ausfallzeiten im Cluster führen. Cluster Autoscaler plant diese Systemarbeitslasten während des Herunterskalierens auf anderen Worker-Knoten neu.Verwenden Sie Knotenpoolmarkierungen und -toleranzen (z. B.
workload=stateful:NoSchedule), umkube-system-Pods von Ihren Anwendungs-Pods zu trennen. Wir empfehlen diesen Ansatz für Batch- oder zustandsorientierte Arbeitslasten, um das Problem der kaskadierenden Verzögerung zu vermeiden, indemkube-system-Pods von diesen Knoten ferngehalten werden. Mit diesem Ansatz können die Knoten herunterskaliert werden, ohne blockiert zu werden. Weitere Informationen finden Sie unter Automatische Knotenbereitstellung in GKE.
Prüfen, ob Knoten kube-system-Pods haben
Wenn Sie sich 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_LOCATIONist die Region, in der sich der Cluster befindet.CLUSTER_NAMEist der Name Ihres Clusters.PROJECT_ID: die ID des Projekts, zu dem Ihr Cluster gehört.NODE_POOL_NAMEist 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 Budget für Pod-Störungen hat, um die Entfernung des Pods zuzulassen.
Ereignis
NoScaleDownNodePodNotEnoughPdb: "no.scale.down.node.pod.not.enough.pdb"
So prüfen Sie, ob eine PodDisruptionBudget zu restriktiv ist:
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 two_pdb-Labelauswahl ü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 verhindert disruptionsAllowed: 0 jegliche Unterbrechungen dieser Pods. Folglich können Knoten, auf denen diese Pods ausgeführt werden, nicht herunterskaliert werden, da dies zu einer Unterbrechung führen und gegen das PodDisruptionBudget verstoßen würde.
Wenn Ihr 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 den Wert in 1 ändern, damit Cluster Autoscaler herunterskalieren kann.
Problem: Knoten bleibt im Status „Cordoned“ und wird nicht entfernt
Fehler wie die folgenden treten auf, wenn Cluster Autoscaler die Größe des Knotenpools nicht reduzieren kann, weil das Google-Dienstkonto nicht die Rolle „Editor“ hat:
Required 'compute.instanceGroups.update' permission for 'INSTANCE_GROUP_NAME'.
Ein häufiges Symptom dieses Problems ist, wenn der 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 FAQ 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, finden Sie unter Support erhalten weitere Hilfe, einschließlich Ratschlägen 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. - Sie können Probleme oder Feature Requests über die öffentliche Problemverfolgung melden.