Während des Lebenszyklus eines lang laufenden GKE-Cluster kommt es aufgrund von Infrastrukturunterbrechungen, die vonGoogle Cloud ausgegeben werden, zu regelmäßigen Störungen bei Arbeitslasten. Diese automatischen Ereignisse können als Reaktion auf Planungsentscheidungen (Unterbrechungsereignisse), Updates der Steuerungsebene oder von Knoten, einschließlich automatischer GKE-Knotenupgrades (Wartungsereignisse), oder zur Behebung erkannter Probleme (Beendigungsereignisse) auftreten.
Auf dieser Seite erfahren Sie, was Knotenunterbrechungen in GKE bedeuten, wie Sie Wartungsbenachrichtigungen überwachen und wie Sie die Auswirkungen von Unterbrechungen auf Ihre GKE-Knoten mit angehängten GPUs und TPUs minimieren können.
Dieses Dokument richtet sich an Plattformadministratoren und ‑betreiber, die den Lebenszyklus der zugrunde liegenden technischen Infrastruktur verwalten. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die wir in Google Cloud -Inhalten verweisen, finden Sie unter Häufig verwendete GKE-Nutzerrollen und -Aufgaben.
Was bedeutet eine Unterbrechung der Infrastruktur in GKE?
Ihre GKE-Cluster verwalten den Lebenszyklus der GKE-Knoten. Diese Knoten werden auf Compute Engine-VMs bereitgestellt, die regelmäßig die folgenden Unterbrechungen aufweisen:
Behebung erkannter Probleme (
TerminationEvent
): Diese Ereignisse treten auf, weil Google Cloud ein Problem erkennt und Ihre Clusterinfrastruktur unterbricht.TerminationEvent
-Ereignisse unterstützen kein ordnungsgemäßes Herunterfahren.TerminationEvent
-Ereignisse werden durch die folgenden Probleme ausgelöst:- Die automatische Reparatur erfolgt, wenn GKE einen Knoten nach wiederholten fehlgeschlagenen Systemdiagnosen repariert.
- HostError tritt auf, wenn ein Hardware- oder Softwarefehler auf der physischen Maschine dazu führt, dass die VM beendet wird.
Wartungs- oder Upgradeereignisse (
MaintenanceEvent
): Diese Ereignisse treten auf, wenn Google Cloud eine VM unterbrechen muss, um Wartungsarbeiten durchzuführen.MaintenanceEvent
-Ereignisse werden durch die folgenden Wartungsaufgaben ausgelöst:- Wartungsereignisse treten auf, wenn Google Cloud den zugrunde liegenden Host aktualisiert.
- Knotenupdates, einschließlich automatischer Knotenupgrades, erfolgen, wenn GKE die Version von Kubernetes aktualisiert, die auf dem Knoten ausgeführt wird.
Weitere Informationen dazu, wie Sie und GKE Änderungen während des Lebenszyklus eines Clusters verwalten, finden Sie unter Arten von Änderungen.
Reaktion auf Planungsentscheidungen (
PreemptionEvent
): Treten auf, wennGoogle Cloud VMs unterbrechen muss, um Kapazität für Ressourcen mit höherer Priorität bereitzustellen.PreemptionEvent
-Ereignisse können Folgendes sein:- Bereinigung:Tritt auf, wenn präemptive oder Spot-Infrastruktur vorzeitig beendet wird, um eine VM mit höherer Priorität zu ermöglichen.
- Defragmentierung:Dies tritt auf, wenn GKE einen kleineren TPU-Slice vorzeitig beendet, um Platz für einen größeren TPU-Slice zu schaffen. Die Defragmentierung erfolgt nur auf TPU-Slices.
Während des Lebenszyklus eines lang laufenden GKE-Cluster kann es bei den Knoten zu regelmäßigen Störungen bei Trainings- oder Serving-Arbeitslasten kommen. Wenn diese Störungen Ihre GKE-Knoten betreffen, auf denen KI/ML-Arbeitslasten ausgeführt werden, muss GKE sowohl die laufenden Arbeitslasten als auch den zugrunde liegenden Knoten neu starten.
Warum GPUs und TPUs eine Unterbrechungsverwaltung erfordern
Bei den meisten Compute Engine-VMs ist die Hostwartungsrichtlinie auf Live-Migration festgelegt. Das bedeutet, dass laufende Arbeitslasten in der Regel nur selten oder gar nicht unterbrochen werden. Bestimmte VM-Klassen unterstützen jedoch keine Live-Migration, einschließlich VMs mit angehängten GPUs und TPUs. Wenn ein Hostereignis für die VM in einem TPU-Slice auftritt, wird der gesamte Slice unterbrochen und dann neu geplant, da alle Wartungsereignisse auf Slice-Ebene koordiniert werden. Wenn Sie also einen TPU-Slice mit Hunderten von VMs erstellen, erhalten alle diese VMs denselben Wartungsereignisplan.
Wenn ein Hostereignis eintritt, beendet GKE den Knoten und seine Pods. Wenn die Pods als Teil einer größeren Arbeitslast wie eines Jobs oder Deployments bereitgestellt werden, startet GKE die Pods auf dem betroffenen Knoten neu.
Es liegt an Ihnen oder den Frameworks, die Sie verwenden, die Arbeitslastkonfiguration so zu verwalten, dass angemessen auf Wartungsereignisse reagiert wird. So können Sie beispielsweise den Status Ihres KI-Trainingsjobs speichern, um Datenverluste zu reduzieren.
So können Sie Unterbrechungen bei KI/ML-Arbeitslasten verwalten:
- Knoten- und Knotenpoolunterbrechungen überwachen
- Wartungsbenachrichtigungen beobachten
- Auswirkungen von Unterbrechungen minimieren
Knotenunterbrechungen überwachen
Der folgende GKE-Systemmesswert gibt die Anzahl der Unterbrechungen für einen GKE-Knoten seit der letzten Stichprobe an (der Messwert wird alle 60 Sekunden abgerufen):
kubernetes.io/node/interruption_count
Die Felder interruption_type
(z. B. TerminationEvent
, MaintenanceEvent
oder PreemptionEvent
) und interruption_reason
(z. B. HostError
, Eviction
oder AutoRepair
) können Aufschluss darüber geben, warum ein Knoten unterbrochen wurde.
Wenn Sie eine Aufschlüsselung der Unterbrechungen und ihrer Ursachen in TPU-Knoten in den Clustern in Ihrem Projekt erhalten möchten, verwenden Sie die folgende PromQL-Abfrage:
sum by (interruption_type,interruption_reason)(
sum_over_time(
kubernetes_io:node_interruption_count{monitored_resource="k8s_node"}[${__interval}]))
Wenn Sie nur die Hostwartungsereignisse sehen möchten, aktualisieren Sie die Abfrage, um den HW/SW Maintenance
-Wert für interruption_reason
zu filtern. Verwenden Sie die folgende PromQL-Abfrage:
sum by (interruption_type,interruption_reason)(
sum_over_time(
kubernetes_io:node_interruption_count{monitored_resource="k8s_node", interruption_reason="HW/SW Maintenance"}[${__interval}]))
Verwenden Sie die folgende PromQL-Abfrage, um die Anzahl der Unterbrechungen nach Knotenpool zusammenzufassen:
sum by (node_pool_name,interruption_type,interruption_reason)(
sum_over_time(
kubernetes_io:node_pool_interruption_count{monitored_resource="k8s_node_pool", interruption_reason="HW/SW Maintenance", node_pool_name=NODE_POOL_NAME }[${__interval}]))
Wartungsbenachrichtigungen beobachten
Compute Engine gibt Benachrichtigungen aus, wenn Knoten und die zugrunde liegenden VMs für störende Hostereignisse geplant sind und wenn diese Ereignisse aktiv werden. Die Benachrichtigungen enthalten Informationen zur geplanten Startzeit, zum Ereignistyp und zu anderen Details.
In GKE-Version 1.31.1-gke.2008000 und höher können Sie anstehende Wartungsereignisse überwachen, einschließlich der in diesem Abschnitt beschriebenen Ereignisse.
Anstehende Wartung ist geplant, aber nicht aktiv
Vor einem geplanten Wartungsereignis für eine VM mit angehängten GPUs oder TPUs sendet Compute Engine Benachrichtigungen an alle VMs. Diese Benachrichtigungen informieren Sie über den Beginn des Wartungsfensters. Wenn eine bevorstehende Wartung von der VM geplant, aber nicht aktiv ist, fügt GKE dem Knotenlabel scheduled-maintenance-time
hinzu.
Führen Sie den folgenden Befehl aus, um diese Benachrichtigungen auf Knotenebene abzufragen:
kubectl get nodes -l cloud.google.com/scheduled-maintenance-time \
-L cloud.google.com/scheduled-maintenance-time
Die Ausgabe sieht etwa so aus:
NAME STATUS SCHEDULED-MAINTENANCE-TIME
<gke-accelerator-node-name> Ready 1733083200
<gke-accelerator-node-name> Ready 1733083200
[...]
Die Spalte SCHEDULED-MAINTENANCE-TIME
steht für Sekunden, die im Unix-Epochenzeitformat angezeigt werden.
Wenn Sie diese Benachrichtigungen auf der Ebene der Knotenmetadaten abfragen möchten, prüfen Sie Instanzen auf Benachrichtigungen zu Wartungsereignissen.
Bei beschleunigungsoptimierten Maschinenfamilien, die erweiterte Wartung unterstützen, können Sie auf den upcoming-maintenance
-Endpunkt zugreifen, der Informationen zu geplanten und gestarteten Wartungsereignissen enthält.
Auswirkungen von Unterbrechungen minimieren
Compute Engine benachrichtigt Sie über bevorstehende Wartungsereignisse und plant ein Wartungsfenster. Zwischen dem Zeitpunkt der Benachrichtigung und dem Beginn des Wartungsfensters haben Sie folgende Möglichkeiten:
- Host-Wartungsereignis manuell starten
- Lassen Sie Compute Engine das Wartungsereignis planmäßig starten.
Host-Wartungsereignis manuell starten
Wenn Compute Engine eine Benachrichtigung über ein geplantes Wartungsereignis ausgibt, können Sie die Wartung manuell zu einem Zeitpunkt starten, der mit Ihrem Betriebsplan übereinstimmt, z. B. in Zeiten geringerer Aktivität.
Legen Sie auf einem Knoten im Knotenpool das Knotenlabel cloud.google.com/perform-maintenance
auf true
fest. Beispiel:
kubectl label nodes <node-name> cloud.google.com/perform-maintenance=true
Wenn Sie ein Wartungsereignis starten, führt GKE die folgenden Vorgänge aus:
- Markiert den Knoten.
- Entfernt Pods ordnungsgemäß.
- Fordert Compute Engine auf, das Wartungsereignis sofort zu starten, anstatt auf die geplante Zeit zu warten.
Compute Engine startet das Wartungsereignis planmäßig.
Wenn Sie kein Host-Wartungsereignis starten, beginnt das geplante Wartungsereignis automatisch. Ab GKE-Version 1.33 wird der Knoten nicht mit einem Taint versehen und Pods werden nicht entfernt, wenn das Wartungsfenster beginnt.
Wenn das Wartungsereignis beginnt, kann es sein, dass ein Knoten ein- oder mehrmals heruntergefahren wird. Die Benachrichtigungszeit vor dem bevorstehenden Herunterfahren ist kurz. In diesen Fällen unternimmt GKE alles, um Arbeitslasten zu beenden und Pods ordnungsgemäß zu entfernen.
Beginn der geplanten Wartung
Wenn die geplante Wartung beginnt, aktualisiert Compute Engine die Metadaten im Verzeichnis http://metadata.google.internal/computeMetadata/v1/instance/attributes/
. Compute Engine aktualisiert die Metadatenlabels so:
- Legt
maintenance-event
aufTERMINATE_ON_HOST_MAINTENANCE
fest. - Legt in
upcoming-maintenance
maintenance_status
aufONGOING
fest.
GKE verarbeitet ein geplantes Hostwartungsereignis, je nachdem, ob Sie es manuell auslösen oder GKE automatisch vorgehen lassen.
GKE so konfigurieren, dass Arbeitslasten ordnungsgemäß beendet werden
In diesem Abschnitt konfigurieren Sie GKE, um den Anwendungslebenszyklus zu verwalten und Störungen Ihrer Arbeitslast zu minimieren. Wenn Sie keinen Kulanzzeitraum konfigurieren, wird standardmäßig ein Kulanzzeitraum von 30 Sekunden verwendet.
GKE unternimmt alles, um diese Pods ordnungsgemäß zu beenden und die von Ihnen definierte Beendigungsaktion auszuführen, z. B. das Speichern eines Trainingsstatus. GKE sendet zu Beginn des Kulanzzeitraums ein SIGTERM
-Signal an Pods. Wenn Pods nicht bis zum Ende des Kulanzzeitraums beendet werden, sendet GKE ein weiteres SIGKILL
-Signal an alle Prozesse, die noch in einem Container im Pod ausgeführt werden.
Um den Zeitraum für das ordnungsgemäße Beenden zu konfigurieren, legen Sie den Kulanzzeitraum für die Beendigung (in Sekunden) im Feld spec.terminationGracePeriodSeconds
Ihres Pod-Manifests fest. Wenn Sie beispielsweise eine Benachrichtigungszeit von 10 Minuten erhalten möchten, legen Sie in Ihrem Pod-Manifest das Feld spec.terminationGracePeriodSeconds
auf 600 Sekunden fest:
spec:
terminationGracePeriodSeconds: 600
Wir empfehlen, einen Kulanzzeitraum für die Kündigung festzulegen, der lang genug ist, damit alle laufenden Aufgaben innerhalb des Benachrichtigungszeitraums abgeschlossen werden können.
Wenn Ihre Arbeitslast ein ML-Framework wie MaxText, Pax oder JAX mit Orbax verwendet, können die Arbeitslasten das SIGTERM
-Signal erfassen und einen Prüfpunktprozess initiieren.
Weitere Informationen finden Sie unter TPU Autocheckpoint.
Prozess der ordnungsgemäßen Beendigung
Wenn ein manuell gestartetes Wartungsereignis beginnt, signalisiert Compute Engine das bevorstehende Herunterfahren der Maschine durch Aktualisieren des Metadatenschlüssels maintenance-event
.
GKE startet die ordnungsgemäße Beendigung.
Der folgende Workflow zeigt, wie GKE die ordnungsgemäße Knotenbeendigung ausführt, wenn ein bevorstehender Knoten-Shutdown ansteht:
- Innerhalb von 60 Sekunden geschieht Folgendes:
- Die Systemkomponenten wenden das Knotenlabel
cloud.google.com/active-node-maintenance
aufONGOING
an, um anzuzeigen, dass Arbeitslasten beendet werden. - GKE wendet die Knotenmarkierung an, um zu verhindern, dass neue Pods auf dem Knoten geplant werden. Die Markierung hat den Schlüssel
cloud.google.com/impending-node-termination:NoSchedule
. Wir empfehlen, Ihre Arbeitslasten nicht so zu ändern, dass sie diese Markierung aufgrund der bekannten Beendigung tolerieren.
- Die Systemkomponenten wenden das Knotenlabel
- Die Komponente „maintenance-handler“ beginnt mit dem Entfernen von Pods, indem zuerst Arbeitslast-Pods und dann System-Pods (z. B. kube-system) entfernt werden.
- GKE sendet ein
SIGTERM
-Shutdown-Signal an Arbeitslast-Pods, die auf dem Knoten ausgeführt werden, um sie über ein bevorstehendes Herunterfahren zu informieren. Pods können mit dieser Benachrichtigung alle laufenden Aufgaben durchführen. GKE unternimmt alles, um diese Pods ordnungsgemäß zu beenden. - Nachdem der Ausschluss abgeschlossen ist, aktualisiert GKE den Wert des Labels
cloud.google.com/active-node-maintenance
aufterminating
, um anzugeben, dass der Knoten bereit für die Beendigung ist.
Anschließend wird der Knoten beendet und ein Ersatzknoten zugewiesen. GKE löscht die Labels und Markierungen, wenn der Vorgang abgeschlossen ist. Führen Sie die Schritte im Abschnitt Host-Wartungsereignis manuell starten aus, um das Beendigungsfenster für Ihre Arbeitslasten mit GPUs oder TPUs zu verlängern.
Fortschritt einer aktiven ordnungsgemäßen Beendigung beobachten
Sie können die GKE-Logs nach den folgenden Ereignissen für die ordnungsgemäße Beendigung filtern:
- Wenn die VM eine Störung aufgrund einer bevorstehenden Knotenbeendigung erkennt, z. B. ein Compute Engine-Hostwartungsereignis, setzt GKE
cloud.google.com/active-node-maintenance
aufONGOING
, wenn Arbeitslasten beendet werden, und aufterminating
, wenn die Arbeitslasten abgeschlossen sind und der Knoten beendet werden kann. - Wenn die Planung neuer Arbeitslasten eingeschränkt wird, wendet GKE die Markierung
cloud.google.com/impending-node-termination:NoSchedule
an.
Unterbrechungen laufender Arbeitslasten mit opportunistischer Wartung minimieren
Sie können Unterbrechungen laufender Arbeitslasten minimieren, indem Sie die Wartung automatisch auslösen, wenn GKE erkennt, dass Knoten mit GPUs oder TPUs im Leerlauf sind. Erstellen Sie einen neuen Knotenpool, um diese Funktion zu aktivieren. Sie können die opportunistische Wartung nicht für einen vorhandenen Knotenpool aktivieren.
Neuen Knotenpool mit opportunistischer Wartung erstellen
Der folgende Befehl zeigt, wie Sie einen Knotenpool mit aktivierter opportunistischer Wartung erstellen:
gcloud beta container node-pools create NODE_POOL_NAME \
--cluster CLUSTER_NAME \
--accelerator ACCELERATOR_ARG \
--machine-type MACHINE_TYPE \
--num-nodes NODE_COUNT \
--zone ZONE \
--project=PROJECT_ID \
--opportunistic-maintenance=node-idle-time=NODE_IDLE_TIME,min-nodes=MIN_NODES,window=WINDOW
Ersetzen Sie die folgenden Werte:
NODE_POOL_NAME
: der Name Ihres GKE-Knotenpools.CLUSTER_NAME
: der Name Ihres GKE-Cluster.NODE_IDLE_TIME
: Die Zeitspanne, in der ein Knoten im Leerlauf bleiben kann (d. h. es werden keine Arbeitslasten ausgeführt, die Beschleuniger verwenden), bevor die Wartung ausgelöst wird. Der Wert stellt die Dauer in Sekunden mit bis zu neun Nachkommastellen dar und endet mit dem Zeichens
, z. B.80000s
.MIN_NODES
: die Mindestanzahl von Knoten, die in einem Knotenpool verfügbar sein müssen. Mit dieser Option wird die Wartung blockiert, wenn dadurch die Anzahl der ausgeführten Knoten unter diesen Wert fällt, z. B.10
.WINDOW
: Das Zeitfenster in Sekunden, in dem die opportunistische Wartung ausgeführt werden kann. Der Wert endet mit dem Zeichens
. Ein Wert von 14 Tagen oder1209600s
bedeutet beispielsweise, dass die opportunistische Wartung nur in den zwei Wochen vor dem geplanten Wartungsdatum ausgeführt werden kann. Mit einem Wert von 28 Tagen oder2419200s
kann die opportunistische Wartung jederzeit während des geplanten Wartungsfensters ausgeführt werden. Dieses Fenster für die Compute Engine-Hostwartung unterscheidet sich von GKE-Wartungsfenstern, die festlegen, wann GKE-Clusterwartungen stattfinden können, und separat konfiguriert werden.
Beispielkonfiguration für die opportunistische Wartung
Dazu ein Beispiel: Sie haben einen Knotenpool mit vier Knoten und die Konfiguration für die opportunistische Wartung ist auf --opportunistic-maintenance=node-idle-time=600s,window=2419200s,min-nodes=3
festgelegt. In diesem Szenario passiert Folgendes:
- Auf
node1
wird eine GPU-Arbeitslast ausgeführt. Dieser Knoten ist nicht im Leerlauf und wird daher übersprungen. node2
ist seit 60 Sekunden inaktiv. Dieser Knoten war nicht lange genug im Leerlauf und wird daher übersprungen.node3
ist seit 600 Sekunden inaktiv. Dieser Knoten erfüllt die Leerlaufanforderung.node4
ist seit 600 Sekunden inaktiv. Dieser Knoten erfüllt die Leerlaufanforderung.
Sowohl node3
als auch node4
erfüllen die Anforderung für den Leerlauf. Allerdings wird nur bei einem dieser Knoten eine opportunistische Wartung ausgelöst, da der Wert der Option min-nodes
auf 3
festgelegt ist.
Konfiguration und Status von Knoten mit opportunistischer Wartung prüfen
Prüfen Sie mit dem folgenden Befehl, ob die opportunistische Wartung für einen Knoten konfiguriert ist:
kubectl describe node NODE_NAME | grep node.gke.io/opportunistic-config
Ersetzen Sie NODE_NAME
durch den Namen des Knotens, den Sie prüfen möchten.
Prüfen Sie, ob ein Knoten, der für die opportunistische Wartung konfiguriert ist, derzeit gewartet wird:
kubectl describe node NODE_NAME | grep node.gke.io/maintenance-state
Wenn der Knoten durch eine opportunistische Wartung ausgelöst wird, wird die Anmerkung maintenance-state
als true
angezeigt.opportunistic-triggered
Beschränkungen
Beachten Sie die folgenden Einschränkungen der opportunistischen Wartung:
- Diese Funktion kann nur mit GPU- und TPU-Knotenpools verwendet werden.
- Die opportunistische Wartung ist nicht mit Cluster Autoscaler kompatibel, da Cluster Autoscaler bereits inaktive Knoten herunterskaliert.
- Für TPU-Knotenpools mit mehreren Hosts sollte der Wert der Einstellung
min-nodes-per-pool
0
sein, da diese Knotenpools atomar sind. - Die unterstützte Mindestversion von GKE ist 1.33.3-gke.1118000.
- Es wird nur geplante Wartung unterstützt, die die
can_reschedule=TRUE
Benachrichtigung enthält. - Wenn Sie diese Funktion deaktivieren möchten, müssen Sie den Knotenpool ohne die entsprechenden Flags neu erstellen. Alternativ können Sie die Funktion mit
cloud.google.com/opportunistic-disable=true
manuell auf bestimmten Knoten deaktivieren. - In seltenen Fällen kann es länger dauern, bis die Wartung auf einem Knoten abgeschlossen ist. Kunden, die diese Funktion verwenden, haben möglicherweise für einen bestimmten Zeitraum weniger verfügbare Knoten, bis hin zum Wert der Einstellung
min-nodes-per-pool
.
Nächste Schritte
- GPUs in Autopilot-Pods auswählen
- Weitere Informationen zum Bereitstellen von TPU-Arbeitslasten in GKE Autopilot