Durante il ciclo di vita di un cluster GKE a lunga esecuzione, si verificano interruzioni periodiche dei carichi di lavoro a causa di interruzioni dell'infrastruttura che Google Cloud problemi. Questi eventi automatici possono verificarsi in risposta a decisioni di pianificazione (eventi di prerilascio) o aggiornamenti dei nodi, che includono upgrade automatici dei nodi GKE (eventi di manutenzione) o correzione di problemi rilevati (eventi di terminazione).
Questo documento ti aiuta a capire cosa significa interruzione dei nodi in GKE, a monitorare le notifiche di manutenzione di Compute Engine e a ridurre al minimo l'impatto delle interruzioni sui nodi GKE.
Questo documento si applica ai seguenti tipi di macchine:
- Tipi di macchine con GPU o TPU collegate
- Tipi di macchine Z3 con più di 18 TiB di SSD Titanium collegati
- Tipi di macchine H4D
c4a-highmem-96-metal(anteprima) della serie di macchine C4A. Per ulteriori informazioni, consulta la sezione Requisiti e limitazioni nel documento "Carichi di lavoro Arm su GKE".
Questo documento è rivolto agli amministratori e agli operatori della piattaforma che gestiscono il ciclo di vita dell'infrastruttura tecnologica sottostante. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Google Cloud contenuti, consulta Ruoli e attività utente GKE comuni.
Che cosa si intende per interruzione dell'infrastruttura in GKE?
I cluster GKE gestiscono il ciclo di vita dei nodi GKE. Il provisioning di questi nodi viene eseguito su VM Compute Engine, che periodicamente subiscono le seguenti interruzioni:
Correzione dei problemi rilevati (
TerminationEvent): questi eventi si verificano perché Google Cloud rileva un problema e interrompe l'infrastruttura del cluster. Gli eventiTerminationEventnon supportano l'arresto normale. Gli eventiTerminationEventvengono attivati dai seguenti problemi:- La riparazione automatica si verifica quando GKE ripara un nodo dopo ripetuti controlli di integrità non riusciti.
- HostError si verifica quando un errore hardware o software sulla macchina fisica causa l' arresto della VM.
Eventi di manutenzione o upgrade (
MaintenanceEvent): questi eventi si verificano quando Google Cloud deve interrompere una VM per eseguire la manutenzione. Gli eventiMaintenanceEventvengono attivati dalle seguenti attività di manutenzione:- Gli eventi di manutenzione si verificano quando Google Cloud esegue l'upgrade dell'host sottostante.
- Gli aggiornamenti dei nodi, che includono node auto-upgrades, si verificano quando GKE aggiorna la configurazione del nodo, ad esempio la versione di GKE.
Per ulteriori informazioni su come tu e GKE gestite le modifiche durante il ciclo di vita di un cluster, consulta Tipi di modifiche.
Risposta alle decisioni di pianificazione (
PreemptionEvent): si verificano quando Google Cloud deve prerilasciare le VM per rendere disponibile la capacità per le risorse con priorità più alta. Gli eventiPreemptionEventpossono essere uno dei seguenti:- Eliminazione: si verifica quando preemptible o spot l'infrastruttura viene prerilasciata per ospitare una VM con priorità più alta.
- Defragmentazione: si verifica quando GKE prerilascia una slice TPU più piccola per ospitare una slice TPU più grande. La deframmentazione si verifica solo sulle slice TPU.
Durante il ciclo di vita di un cluster GKE a lunga esecuzione, i nodi potrebbero subire interruzioni periodiche dei carichi di lavoro. Quando queste interruzioni interessano i nodi GKE che eseguono i carichi di lavoro, GKE deve riavviare sia i carichi di lavoro in esecuzione sia il nodo sottostante.
Perché i nodi senza migrazione live richiedono la gestione delle interruzioni
La maggior parte delle VM Compute Engine, con alcune eccezioni, ha la policy
di
manutenzione
dell'host impostata
su migrazione
live, il
che
significa che i carichi di lavoro in esecuzione in genere subiscono interruzioni minime o nulle.
Tuttavia, alcune classi di
VM non supportano la
migrazione live, tra cui le VM con
GPU e
TPU collegate, i tipi di macchine Z3 con più
di 18 TiB di SSD, i tipi di macchine H4D e il c4a-highmem-96-metal
(anteprima) tipo di macchina. Ad esempio, quando si verifica un evento host nella VM all'interno di una slice TPU, l'intera slice viene interrotta e poi ripianificata perché tutti gli eventi di manutenzione vengono coordinati a livello di slice. Pertanto, se crei una slice TPU con centinaia di VM, tutte queste VM riceveranno la stessa pianificazione degli eventi di manutenzione.
Quando si verifica un evento host, GKE termina il nodo e i relativi pod. Se i pod vengono sottoposti a deployment come parte di un carico di lavoro più grande, ad esempio un job o deployment, GKE riavvia i pod sul nodo interessato.
Spetta a te o ai framework che utilizzi gestire la configurazione del carico di lavoro per reagire in modo appropriato agli eventi di manutenzione. Ad esempio, puoi salvare lo stato del job di addestramento AI per ridurre la perdita di dati.
Per gestire le interruzioni dei carichi di lavoro, puoi:
- Monitorare le interruzioni dei nodi e dei node pool
- Monitorare le notifiche di manutenzione
- Ridurre al minimo l'impatto delle interruzioni
Monitorare le interruzioni dei nodi
La seguente metrica di sistema GKE segnala il conteggio delle interruzioni per un nodo GKE dall' ultimo campione (la metrica viene campionata ogni 60 secondi):
kubernetes.io/node/interruption_count
I campi interruption_type (ad esempio TerminationEvent, MaintenanceEvent o PreemptionEvent) e interruption_reason (ad esempio HostError, Eviction o AutoRepair) possono aiutarti a capire il motivo per cui un nodo è stato interrotto.
Per ottenere una suddivisione delle interruzioni e delle relative cause nei nodi TPU dei cluster del tuo progetto, utilizza la seguente query PromQL:
sum by (interruption_type,interruption_reason)(
sum_over_time(
kubernetes_io:node_interruption_count{monitored_resource="k8s_node"}[${__interval}]))
Per visualizzare solo gli
eventi di manutenzione dell'host,
aggiorna la query per filtrare il HW/SW Maintenance valore per il interruption_reason. Utilizza la seguente query PromQL:
sum by (interruption_type,interruption_reason)(
sum_over_time(
kubernetes_io:node_interruption_count{monitored_resource="k8s_node", interruption_reason="HW/SW Maintenance"}[${__interval}]))
Per visualizzare il conteggio delle interruzioni aggregato per pool di nodi, utilizza la seguente query PromQL:
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}]))
Monitorare le notifiche di manutenzione
Compute Engine issues notifiche quando i nodi e le relative VM sottostanti sono pianificati per eventi host che causano interruzioni , e quando questi eventi diventano attivi. Le notifiche includono informazioni sull'ora di inizio pianificata, sul tipo di evento e altri dettagli.
In GKE versione 1.31.1-gke.2008000 e successive, puoi monitorare gli eventi di manutenzione imminenti, inclusi quelli descritti in questa sezione.
Puoi monitorare gli eventi imminenti con i seguenti tipi di macchine e versioni di GKE:
- Per i tipi di macchine con GPU o TPU collegate, 1.31.1-gke.2008000 o versioni successive
- Per i tipi di macchine Z3 con più di 18 TiB di SSD, 1.32.4-gke.1376000 o versioni successive
- Per i tipi di macchine H4D, 1.32.6-gke.1060000 o versioni successive
- Per
c4a-highmem-96-metal(anteprima), 1.35.0-gke.2232000 o versioni successive
La manutenzione imminente è pianificata, ma non è attiva
Prima che una VM abbia un evento di manutenzione pianificato, Compute Engine invia notifiche a tutte le VM. Queste notifiche segnalano l'inizio del periodo di manutenzione di Compute Engine. Quando una manutenzione imminente viene pianificata dalla VM, ma non è attiva, GKE aggiunge scheduled-maintenance-time all'etichetta del nodo.
Per eseguire una query su queste notifiche a livello di nodo, esegui il seguente comando:
kubectl get nodes -l cloud.google.com/scheduled-maintenance-time \
-L cloud.google.com/scheduled-maintenance-time
L'output è simile al seguente:
NAME STATUS SCHEDULED-MAINTENANCE-TIME
<gke-accelerator-node-name> Ready 1733083200
<gke-accelerator-node-name> Ready 1733083200
[...]
La colonna SCHEDULED-MAINTENANCE-TIME rappresenta i secondi, visualizzati nel formato ora epoca di Unix.
Per eseguire una query su queste notifiche a livello di metadati del nodo, verifica la presenza di una notifica di evento di manutenzione nelle istanze.
Per le famiglie di macchine ottimizzate per l'acceleratore che supportano
la manutenzione
avanzata, puoi
accedere all'endpoint upcoming-maintenance che fornisce informazioni sugli eventi di manutenzione
pianificati e avviati.
Ridurre al minimo l'impatto delle interruzioni
Compute Engine invia notifiche relative agli eventi di manutenzione imminenti e pianifica un periodo di manutenzione. Tra l'ora della notifica e l'ora di inizio del periodo di manutenzione, puoi decidere di:
- Avviare manualmente un evento di manutenzione dell'host.
- Consentire a Compute Engine di avviare l'evento di manutenzione in base alla pianificazione.
GKE supporta la terminazione controllata dei pod durante gli eventi di manutenzione dell'host. Nelle versioni recenti di GKE, questa funzionalità è disattivata per impostazione predefinita. Per utilizzare questa funzionalità, devi abilitare manualmente la gestione delle interruzioni. Per ulteriori informazioni, consulta Abilitare la gestione delle interruzioni.
Avviare manualmente un evento di manutenzione dell'host
Puoi avviare manualmente la manutenzione ripianificabile quando si adatta alla tua pianificazione, ad esempio durante i periodi di bassa attività. Per farlo, applica l'etichetta cloud.google.com/perform-maintenance=true se sono soddisfatte le seguenti condizioni:
- Compute Engine invia una notifica relativa a un evento di manutenzione pianificato.
- L'evento di manutenzione di Compute Engine sottostante è ripianificabile. Per verificare
se l'evento è ripianificabile, cerca la notifica
can_reschedule=TRUEnei metadati dell'evento. Se l'evento non è ripianificabile, l'impostazione dell'etichettacloud.google.com/perform-maintenance=truenon ha alcun effetto e la manutenzione viene eseguita all'ora pianificata originariamente.
Se le condizioni precedenti sono soddisfatte, imposta l'etichetta del nodo cloud.google.com/perform-maintenance su true in un nodo del pool di nodi. Ad esempio:
kubectl label nodes <node-name> cloud.google.com/perform-maintenance=true
Se avvii un evento di manutenzione, GKE esegue le seguenti operazioni:
- Applica un'incompatibilità al nodo.
- Esegue l'eliminazione controllata dei pod.
- Richiede a Compute Engine di avviare immediatamente l'evento di manutenzione, anziché attendere l'ora pianificata.
Compute Engine avvia l'evento di manutenzione in base alla pianificazione
Se non avvii un evento di manutenzione dell'host, Compute Engine avvia l'evento di manutenzione pianificato autonomamente. A partire dalla versione 1.33 di GKE, il nodo non è incompatibile e i pod non vengono eliminati all'inizio del periodo di manutenzione.
Quando inizia l'evento di manutenzione, un nodo potrebbe essere arrestato una o più volte con un breve periodo di notifica prima della sua terminazione imminente. In questi casi, GKE fa del suo meglio per terminare i carichi di lavoro ed eliminare i pod in modo controllato.
Inizio della manutenzione pianificata
Quando inizia la manutenzione pianificata, Compute Engine aggiorna i metadati nella directory http://metadata.google.internal/computeMetadata/v1/instance/attributes/. Compute Engine aggiorna le etichette dei metadati come segue:
- Imposta
maintenance-eventsuTERMINATE_ON_HOST_MAINTENANCE. - In
upcoming-maintenance, impostamaintenance_statussuONGOING.
GKE rileva e gestisce l'evento di manutenzione dell'host pianificato, sia che tu lo attivi manualmente sia che lasci che GKE proceda automaticamente.
Abilitare la gestione delle interruzioni
apiVersion: v1
kind: ConfigMap
metadata:
name: gke-disruption-handling
namespace: kube-system
data:
maintenance-experience.yaml: |
gracefulTermination: true
Per abilitare la gestione delle interruzioni, crea un file denominato maintenance-config.yaml con questo ConfigMap. Applica il ConfigMap al cluster con il seguente comando:
kubectl apply -f my-configmap.yaml
Configurare GKE per terminare i carichi di lavoro in modo controllato
In questa sezione configurerai GKE per gestire il ciclo di vita dell'applicazione e ridurre al minimo l'interruzione del carico di lavoro. Se non configuri un periodo di tolleranza, il valore predefinito è di 30 secondi.
GKE fa del suo meglio per terminare questi pod in modo controllato ed eseguire l'azione di terminazione che definisci, ad esempio salvando uno stato di addestramento. GKE invia un segnale SIGTERM ai pod all'inizio del periodo di tolleranza. Se i pod non escono entro la fine del periodo di tolleranza, GKE invia un segnale SIGKILL di follow-up a tutti i processi ancora in esecuzione in qualsiasi container del pod.
Per configurare il periodo di terminazione controllata, imposta il periodo di tolleranza della terminazione (in secondi) nel campo spec.terminationGracePeriodSeconds del manifest del pod. Ad esempio, per ottenere un periodo di notifica di 10 minuti, imposta il campo spec.terminationGracePeriodSeconds nel manifest del pod su 600 secondi, come segue:
spec:
terminationGracePeriodSeconds: 600
Ti consigliamo di impostare un periodo di tolleranza della terminazione sufficientemente lungo da consentire il completamento di tutte le attività in corso entro il periodo di notifica.
Se il carico di lavoro utilizza un framework ML come MaxText, Pax o JAX con
Orbax, i carichi di lavoro
possono acquisire il segnale SIGTERM di arresto e avviare un processo di checkpoint.
Per saperne di più, consulta Autocheckpoint TPU.
Processo di terminazione controllata
Quando inizia un evento di manutenzione avviato manualmente, Compute Engine segnala l'arresto imminente della macchina aggiornando la chiave dei metadati maintenance-event.
GKE avvia la terminazione controllata.
Il seguente workflow mostra come GKE esegue la terminazione controllata dei nodi quando è imminente l'arresto di un nodo:
- Entro 60 secondi si verifica quanto segue:
- I componenti di sistema applicano l'etichetta del nodo
cloud.google.com/active-node-maintenanceimpostata suONGOINGper indicare che i carichi di lavoro vengono arrestati. - GKE applica l'incompatibilità del nodo per impedire la pianificazione di nuovi pod sul nodo. L'incompatibilità ha la chiave
cloud.google.com/impending-node-termination:NoSchedule. Ti consigliamo di non modificare i carichi di lavoro per tollerare questa incompatibilità a causa della terminazione nota che si verifica.
- I componenti di sistema applicano l'etichetta del nodo
- Il componente maintenance-handler inizia a eliminare i pod eliminando prima i pod del carico di lavoro e poi i pod di sistema (ad esempio, kube-system).
- GKE invia un segnale di arresto
SIGTERMai pod del carico di lavoro in esecuzione sul nodo per avvisarli di un arresto imminente. I pod possono utilizzare questo avviso per completare le attività in corso. GKE fa del suo meglio per terminare questi pod in modo controllato. - Al termine dell'eliminazione, GKE aggiorna il valore dell'etichetta
cloud.google.com/active-node-maintenanceaterminatingper indicare che il nodo è pronto per la terminazione.
Successivamente, si verifica la terminazione del nodo e viene allocato un nodo di sostituzione. Al termine della procedura, GKE cancella le etichette e le incompatibilità. Per aumentare il periodo di terminazione dei carichi di lavoro che utilizzano GPU o TPU, completa i passaggi descritti nella sezione Avviare manualmente un evento di manutenzione dell'host.
Monitorare l'avanzamento di una terminazione controllata attiva
Puoi filtrare i log GKE in base ai seguenti eventi di terminazione controllata:
- Quando la VM rileva un'interruzione dovuta a una terminazione imminente del nodo, ad esempio un evento di manutenzione dell'host di Compute Engine, GKE imposta
cloud.google.com/active-node-maintenancesuONGOINGquando i carichi di lavoro vengono arrestati e suterminatingquando i carichi di lavoro sono terminati e il nodo è pronto per la terminazione. - Quando limita la pianificazione di nuovi carichi di lavoro, GKE applica l'incompatibilità
cloud.google.com/impending-node-termination:NoSchedule.
Ridurre al minimo l'interruzione dei carichi di lavoro in esecuzione con la manutenzione opportunistica
Puoi ridurre al minimo l'interruzione dei carichi di lavoro in esecuzione attivando automaticamente la manutenzione quando GKE rileva che i nodi con GPU o TPU sono inattivi. Per abilitare questa funzionalità, crea un nuovo pool di nodi. Non puoi abilitare la manutenzione opportunistica su un pool di nodi esistente.
Creare un nuovo pool di nodi con la manutenzione opportunistica
Il seguente comando mostra come creare un pool di nodi con la manutenzione opportunistica abilitata:
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
Sostituisci i seguenti valori:
NODE_POOL_NAME: il nome del pool di nodi GKE.CLUSTER_NAME: il nome del cluster GKE.NODE_IDLE_TIME: il periodo di tempo in cui un nodo può rimanere inattivo (ovvero non sono in esecuzione carichi di lavoro che consumano acceleratori) prima che venga attivata la manutenzione. Il valore rappresenta la durata in secondi, con un massimo di nove cifre frazionarie, e termina con ilscarattere, ad esempio:80000s.MIN_NODES: il numero minimo di nodi che devono essere disponibili in un pool di nodi. Questa opzione blocca la manutenzione se il numero di nodi in esecuzione scende al di sotto di questo valore, ad esempio:10.WINDOW: il periodo di tempo, in secondi, in cui può essere eseguita la manutenzione opportunistica. Il valore termina con il caratteres. Ad esempio, un valore di 14 giorni, ovvero1209600s, implica che la manutenzione opportunistica può essere eseguita solo nelle due settimane precedenti la data di manutenzione pianificata. Un valore di 28 giorni, ovvero2419200s, consente di eseguire la manutenzione opportunistica in qualsiasi momento durante il periodo di manutenzione pianificato. Questo periodo per la manutenzione dell'host di Compute Engine è distinto dai periodi di manutenzione di GKE, che determinano quando può essere eseguita la manutenzione del cluster GKE e vengono configurati separatamente.
Configurazione di esempio per la manutenzione opportunistica
Considera l'esempio seguente. Hai un pool di nodi con quattro nodi e la configurazione della manutenzione opportunistica è impostata su --opportunistic-maintenance=node-idle-time=600s,window=2419200s,min-nodes=3. In questo scenario, si verifica quanto segue:
node1ha un carico di lavoro GPU in esecuzione. Questo nodo non è inattivo, quindi viene ignorato.node2è inattivo da 60 secondi. Questo nodo non è inattivo da tempo sufficiente, quindi viene ignorato.node3è inattivo da 600 secondi. Questo nodo soddisfa il requisito di inattività.node4è inattivo da 600 secondi. Questo nodo soddisfa il requisito di inattività.
Sia node3 che node4 soddisfano il requisito di inattività. Tuttavia, solo uno di questi nodi attiverà la manutenzione opportunistica perché il valore dell'opzione min-nodes è impostato su 3.
Controllare la configurazione e lo stato dei nodi con la manutenzione opportunistica
Controlla se la manutenzione opportunistica è configurata per un nodo eseguendo il seguente comando:
kubectl describe node NODE_NAME | grep node.gke.io/opportunistic-config
Sostituisci NODE_NAME con il nome del nodo che vuoi controllare.
Controlla se un nodo configurato con la manutenzione opportunistica è attualmente in manutenzione:
kubectl describe node NODE_NAME | grep node.gke.io/maintenance-state
Se il nodo viene attivato dalla manutenzione opportunistica, l'annotazione maintenance-state mostra opportunistic-triggered come true.
Limitazioni
Tieni presente le seguenti limitazioni della manutenzione opportunistica:
- Questa funzionalità può essere utilizzata solo con i node pool GPU e TPU.
- La manutenzione opportunistica non è compatibile con il gestore della scalabilità automatica dei cluster perché questo gestore esegue già lo scale down dei nodi inattivi.
- Per i node pool TPU multi-host, il valore dell'impostazione
min-nodes-per-pooldeve essere0perché questi node pool sono atomici. - La versione minima supportata di GKE è la 1.33.3-gke.1118000.
- È supportata solo la manutenzione pianificata che include la
can_reschedule=TRUEnotifica. - Per disabilitare questa funzionalità, devi ricreare il pool di nodi senza i rispettivi flag. In alternativa, puoi disabilitare manualmente la funzionalità su nodi specifici con
cloud.google.com/opportunistic-disable=true. - In rari casi, il completamento della manutenzione su un nodo potrebbe richiedere più tempo. I clienti che utilizzano questa funzionalità potrebbero avere a disposizione un numero inferiore di nodi, fino al valore dell'impostazione
min-nodes-per-pool, per un periodo di tempo.
Passaggi successivi
- Scopri come eseguire il deployment dei carichi di lavoro GPU in Autopilot.
- Scopri come eseguire il deployment dei carichi di lavoro TPU su GKE Autopilot.
- Scopri di più sul processo di migrazione live durante gli eventi di manutenzione events.