Questa pagina spiega cosa sono le VM Spot e come funzionano in Google Kubernetes Engine (GKE). Per informazioni su come utilizzare le VM Spot, consulta Utilizzare le VM Spot.
Panoramica delle VM Spot in GKE
Le VM spot sono istanze di macchine virtuali (VM) di Compute Engine il cui prezzo è inferiore rispetto alle VM di Compute Engine standard e non offrono alcuna garanzia di disponibilità. Le VM spot offrono gli stessi tipi di macchine e opzioni delle VM standard.
Puoi utilizzare le VM Spot nei cluster e nei pool di nodi per eseguire carichi di lavoro stateless, batch o a tolleranza di errore che possono tollerare le interruzioni causate dalla natura temporanea delle VM Spot.
Le VM Spot rimangono disponibili finché Compute Engine non richiede le risorse per le VM standard. Per massimizzare l'efficienza dei costi, combinali con le VM Spot e le best practice per l'esecuzione di applicazioni Kubernetes con ottimizzazione dei costi su GKE.
Per saperne di più sulle VM Spot, consulta Spot VM nella documentazione di Compute Engine.
Vantaggi delle VM Spot
Le VM Spot e le VM prerilasciabili hanno molti vantaggi, tra cui:
- Prezzi inferiori rispetto alle VM di Compute Engine standard.
- Utile per carichi di lavoro stateless a tolleranza di errore resilienti alla natura temporanea di queste VM.
- Funziona con il gestore della scalabilità automatica del cluster e con il provisioning automatico dei nodi.
A differenza delle VM prerilasciabili, che scadono dopo 24 ore, le VM Spot non hanno scadenza. Le VM Spot vengono terminate solo quando Compute Engine ha bisogno delle risorse altrove.
Come funzionano le VM Spot in GKE
Quando crei un cluster o un pool di nodi con VM Spot, GKE crea VM Spot sottostanti di Compute Engine che si comportano come un gruppo di istanze gestite. I nodi che utilizzano le VM Spot si comportano come nodi GKE standard, ma non garantiscono la disponibilità. Quando le risorse utilizzate dalle VM Spot sono obbligatorie per eseguire le VM standard, Compute Engine termina quelle VM Spot per utilizzare le risorse altrove.
Interruzione e chiusura controllata delle VM Spot
Quando Compute Engine deve recuperare le risorse utilizzate dalle VM Spot, viene inviata una notifica di terminazione a GKE. Le VM spot terminano 30 secondi dopo aver ricevuto una notifica di terminazione.
Nei cluster che eseguono GKE versione 1.20 e successive, la funzionalità di arresto dei nodi controllato di kubelet è abilitata per impostazione predefinita. Il kubelet nota l'avviso di terminazione e termina in modo controllato i pod in esecuzione sul nodo. Se i pod fanno parte di un deployment, il controller crea e pianifica nuovi pod per sostituire i pod terminati.
Se possibile, il kubelet concede il seguente periodo di tolleranza, in base alla versione di GKE del pool di nodi:
- Più tardi di 1,22,8-gke.200: 15 secondi per i pod non di sistema, dopodiché i pod di sistema (con le classi di priorità
system-cluster-critical
osystem-node-critical
) hanno 15 secondi di tempo per terminarsi in modo controllato. - 1.22.8-gke.200 e versioni precedenti: 25 secondi per i pod non di sistema, dopodiché i pod di sistema (con le classi di priorità
system-cluster-critical
osystem-node-critical
) hanno 5 secondi di tempo per terminarsi in modo controllato.
Durante la terminazione dei nodi, il kubelet aggiorna lo stato dei pod, assegnando una fase Failed
e un motivo Terminated
ai pod terminati.
Quando il numero di pod terminati raggiunge una soglia di 1000 per i cluster con meno di 100 nodi o di 5000 per i cluster con 100 o più nodi, la garbage collection pulisce i pod.
Puoi anche eliminare manualmente i pod terminati utilizzando i seguenti comandi:
kubectl get pods --all-namespaces | grep -i NodeShutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
kubectl get pods --all-namespaces | grep -i Terminated | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
Pianificazione dei carichi di lavoro sulle VM Spot
GKE aggiunge automaticamente entrambe le etichette cloud.google.com/gke-spot=true
e cloud.google.com/gke-provisioning=spot
(per i nodi che eseguono GKE versione 1.25.5-gke.2500 o successive) ai nodi che utilizzano VM Spot. Puoi pianificare pod specifici sui nodi che utilizzano VM Spot utilizzando il campo nodeSelector nella specifica del pod. I seguenti esempi utilizzano l'etichetta cloud.google.com/gke-spot
:
apiVersion: v1
kind: Pod
spec:
nodeSelector:
cloud.google.com/gke-spot: "true"
In alternativa, puoi utilizzare l'affinità nodo per indicare a GKE di pianificare i pod sulle VM Spot, in modo simile all'esempio seguente:
apiVersion: v1
kind: Pod
spec:
...
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: cloud.google.com/gke-spot
operator: In
values:
- true
...
Puoi anche utilizzare nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution
per preferire che GKE posiziona i pod sui nodi che utilizzano VM Spot.
La preferenza di VM Spot non è consigliata, perché GKE potrebbe pianificare i pod su nodi validi esistenti che usano VM standard.
Usare incompatibilità e tolleranze per la programmazione
Per evitare interruzioni del sistema, utilizza un'incompatibilità dei nodi per assicurarti che GKE non pianifichi i carichi di lavoro critici sulle VM Spot. Quando incompatibilità i nodi che utilizzano VM Spot, GKE pianifica solo i pod con la tolleranza corrispondente sui nodi.
Se utilizzi incompatibilità dei nodi, assicurati che il cluster abbia anche almeno un pool di nodi che utilizza VM di Compute Engine standard. I pool di nodi che utilizzano VM standard forniscono un luogo affidabile in cui GKE può pianificare i componenti critici del sistema come il DNS.
Per informazioni sull'utilizzo di un'incompatibilità dei nodi per le VM Spot, consulta Utilizzare incompatibilità e tolleranze per le VM Spot.
Utilizzo di VM Spot con pool di nodi GPU
Le VM Spot supportano le GPU.
Quando crei un nuovo pool di nodi GPU, GKE aggiunge automaticamente l'incompatibilità nvidia.com/gpu=present:NoSchedule
ai nuovi nodi. Solo i pod con una tolleranza corrispondente possono essere eseguiti su questi nodi. GKE aggiunge automaticamente questa tolleranza ai pod che richiedono GPU.
Prima di creare un pool di nodi GPU che utilizza VM Spot, il cluster deve avere almeno un pool di nodi non GPU esistente che utilizza VM standard. Se il cluster ha solo un pool di nodi GPU con VM Spot, GKE non aggiunge l'incompatibilità nvidia.com/gpu=present:NoSchedule
ai nodi. Di conseguenza, GKE potrebbe pianificare carichi di lavoro di sistema sui pool di nodi GPU con VM Spot, il che può causare interruzioni a causa delle VM Spot e aumentare il consumo di risorse, in quanto i nodi GPU sono più costosi dei nodi non GPU.
Gestore della scalabilità automatica dei cluster e provisioning automatico dei nodi
Puoi utilizzare il gestore della scalabilità automatica del cluster e il provisioning automatico dei nodi per scalare automaticamente i tuoi cluster e i tuoi pool di nodi in base alle esigenze dei tuoi carichi di lavoro. Il gestore della scalabilità automatica dei cluster e il provisioning automatico dei nodi supportano sia le VM spot sia le VM spot.
Spot VM e provisioning automatico dei nodi
Il provisioning automatico dei nodi crea ed elimina automaticamente i pool di nodi nel cluster per soddisfare le esigenze dei carichi di lavoro. Quando pianifica i carichi di lavoro che richiedono VM Spot utilizzando un nodeSelector
o un'affinità nodo, il provisioning automatico dei nodi crea nuovi pool di nodi per soddisfare i pod dei carichi di lavoro. GKE aggiunge automaticamente l'incompatibilità cloud.google.com/gke-spot=true:NoSchedule
ai nodi nei nuovi pool di nodi. Solo i pod con la tolleranza corrispondente possono essere eseguiti sui nodi in questi pool di nodi. Devi aggiungere la tolleranza corrispondente ai tuoi deployment per consentire a GKE di posizionare i pod nelle VM Spot:
tolerations:
- key: cloud.google.com/gke-spot
operator: Equal
value: "true"
effect: NoSchedule
Puoi assicurarti che GKE pianifichi solo i tuoi pod sulle VM Spot utilizzando sia una tolleranza sia una nodeSelector
o una regola di affinità nodo per filtrare in base alle VM Spot.
Se pianifichi un carico di lavoro utilizzando solo una tolleranza, GKE può pianificare i pod su VM Spot o VM standard esistenti con capacità. Se hai bisogno di pianificare un carico di lavoro sulle VM Spot, utilizza una
nodeSelector
o un'affinità nodo oltre a una tolleranza. Per saperne di più, consulta Pianificazione dei carichi di lavoro sulle VM Spot.
Spot VM e gestore della scalabilità automatica dei cluster
Il gestore della scalabilità automatica del cluster aggiunge e rimuove automaticamente i nodi nei pool in base alla domanda. Se nel tuo cluster sono presenti pod che non possono essere posizionati su VM Spot esistenti, il gestore della scalabilità automatica aggiunterà nuovi nodi che utilizzano VM Spot.
Criterio predefinito
A partire dalla versione 1.24.1-gke.800 di GKE, puoi definire il criterio di scalabilità automatica. Il gestore della scalabilità automatica dei cluster tenta di eseguire il provisioning di pool di nodi di VM Spot quando sono disponibili risorse e il criterio di località predefinito è impostato su ANY
. Con questo criterio, le VM Spot hanno un rischio inferiore di essere prerilasciate. Per altri tipi di VM, il criterio di distribuzione predefinito del gestore della scalabilità automatica dei cluster è BALANCED
.
Modifiche al comportamento di Kubernetes
L'utilizzo di Spot VM su GKE modifica alcune garanzie e vincoli forniti da Kubernetes, ad esempio:
- La rivendicazione delle VM Spot non è volontaria e non è coperta dalle garanzie di
PodDisruptionBudgets
. Potresti riscontrare una maggiore disponibilità rispetto alla configurazionePodDisruptionBudget
.
Best practice per le VM Spot
Quando progetti un sistema che utilizza VM Spot, puoi evitare gravi interruzioni utilizzando le seguenti linee guida:
- Le VM Spot non hanno garanzie di disponibilità. Progetta i tuoi sistemi partendo dal presupposto che GKE potrebbe rivendicare una o tutte le tue VM Spot in qualsiasi momento, senza garantire quando saranno disponibili nuove istanze.
- Per garantire che i carichi di lavoro e i job vengano elaborati anche quando non sono disponibili VM Spot, assicurati che i cluster abbiano una combinazione di pool di nodi che utilizzano VM Spot e pool di nodi che utilizzano VM di Compute Engine standard.
- Assicurati che il cluster abbia almeno un pool di nodi non GPU che utilizza VM standard prima di aggiungere un pool di nodi GPU che utilizza VM Spot.
- Anche se in genere i nomi dei nodi non cambiano quando i nodi vengono ricreati, gli indirizzi IP interni ed esterni utilizzati dalle VM Spot potrebbero cambiare dopo la creazione.
- Utilizza le incompatibilità e le tolleranze dei nodi per assicurarti che non siano pianificati pod critici sui pool di nodi che utilizzano le VM Spot.
- Per eseguire i carichi di lavoro stateful sulle VM Spot, verifica che i carichi di lavoro possano terminare entro 25 secondi dall'arresto al fine di ridurre al minimo il rischio di danneggiamento permanente dei dati.
- Segui le best practice per la terminazione dei pod di Kubernetes.
Passaggi successivi
- Scopri come utilizzare le VM spot nei pool di nodi.
- Scopri di più sulla scalabilità automatica dei tuoi cluster.
- Scopri come scalare le app di cui hai eseguito il deployment.
- Scopri di più sulle VM Spot nella documentazione di Compute Engine.
- Segui un tutorial sul deployment di un carico di lavoro batch utilizzando le VM spot in GKE.