Questa pagina spiega che cosa sono le VM a prezzo scontato e come funzionano in Google Kubernetes Engine (GKE). Per scoprire 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 Compute Engine standard e che non forniscono alcuna garanzia di disponibilità. Le Spot VM offrono gli stessi tipi di macchine e le stesse opzioni delle VM standard.
Puoi utilizzare le VM spot nei tuoi cluster e 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 scoprire di più sulle VM spot, consulta la sezione VM spot nella documentazione di Compute Engine.
Vantaggi delle VM spot
Le VM spot e le VM prerilasciabili condividono molti vantaggi, tra cui:
- Prezzi inferiori rispetto alle VM Compute Engine standard.
- Utili per carichi di lavoro stateless e a tolleranza di errore che sono resilienti alla natura temporanea di queste VM.
- Funziona con il gestore della scalabilità automatica dei cluster e il provisioning automatico dei nodi.
A differenza delle VM prerilasciabili, che scadono dopo 24 ore, le VM Spot non hanno un tempo di scadenza. Le VM spot vengono interrotte solo quando Compute Engine ha bisogno di queste 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 di Compute Engine sottostanti che si comportano come un gruppo di istanze gestite (MIG). I nodi che utilizzano VM spot si comportano come i nodi GKE standard, ma senza alcuna garanzia di disponibilità. Quando le risorse utilizzate dalle VM spot sono necessarie per eseguire VM standard, Compute Engine termina le VM spot per utilizzare le risorse altrove.
Terminazione e arresto controllato delle VM spot
Quando Compute Engine deve recuperare le risorse utilizzate dalle VM spot, a GKE viene inviata una notifica di risoluzione del contratto. Le VM spot vengono interrotte 30 secondi dopo aver ricevuto una notifica di interruzione.
Per impostazione predefinita, i cluster utilizzano il ritiro gestito dei nodi. Kubelet rileva la notifica di interruzione e termina in modo corretto i pod in esecuzione sul nodo. Se i pod fanno parte di un carico di lavoro gestito, ad esempio un deployment, il controller crea e pianifica nuovi pod per sostituire quelli terminati.
In base al criterio del massimo impegno, kubelet concede un periodo di interruzione controllata di 15 secondi per i pod non di sistema, dopodiché i pod di sistema (con priorityClasses system-cluster-critical
o system-node-critical
) hanno 15 secondi per terminare in modo ordinato. Durante l'arresto controllato del nodo, kubelet aggiorna lo stato dei pod e assegna una fase Failed
e un motivo Terminated
ai pod terminati.
La VM si arresta 30 secondi dopo l'invio della notifica di risoluzione del contratto anche se specifichi un valore maggiore di 15 secondi nel campo terminationGracePeriodSeconds
del manifest del pod.
Quando il numero di pod terminati raggiunge una soglia di 1000 per i cluster con meno di 100 nodi o 5000 per i cluster con almeno 100 nodi, la garbage collection ripulisce 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 sia le etichette cloud.google.com/gke-spot=true
che 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 a spot. Puoi pianificare pod specifici sui nodi
che utilizzano VM spot utilizzando il
campo nodeSelector
nella specifica del pod. Gli esempi riportati di seguito 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à dei nodi 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 posizioni i pod sui nodi che utilizzano VM spot.
Non è consigliabile preferire le VM spot, perché GKE potrebbe pianificare i pod su nodi validi esistenti che utilizzano invece VM standard.
Utilizzo di incompatibilità e tolleranze per la pianificazione
Per evitare interruzioni del sistema, utilizza un contaminante del nodo per assicurarti che GKE non pianifichi i workload critici sulle VM Spot. Quando contami i nodi che utilizzano VM Spot, GKE pianifica su questi nodi solo i pod con la corrispondente tolleranza.
Se utilizzi i taint dei nodi, assicurati che il cluster disponga anche di almeno un pool di nodi che utilizzi VM Compute Engine standard. I pool di nodi che utilizzano VM standard forniscono un luogo affidabile in cui GKE può pianificare componenti di sistema critici come il DNS.
Per informazioni sull'utilizzo di un'alterazione del nodo per le VM spot, consulta Utilizzare le alterazioni e le tolleranze per le VM spot.
Utilizzo di VM Spot con pool di nodi GPU
Le VM spot supportano l'utilizzo di GPU.
Quando crei un nuovo pool di nodi GPU, GKE aggiunge automaticamente il marchio nvidia.com/gpu=present:NoSchedule
ai nuovi nodi. Solo i pod con la 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 tuo cluster ha solo un pool di nodi GPU con VM spot, GKE non aggiunge l'alterazione nvidia.com/gpu=present:NoSchedule
a questi nodi. Di conseguenza, GKE potrebbe pianificare i carichi di lavoro di sistema nei pool di nodi GPU con VM Spot, il che può causare interruzioni a causa delle VM Spot e aumentare il consumo di risorse perché 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 dei cluster e il provisioning automatico dei nodi per eseguire lo scale up e lo scale down automatici dei cluster e dei pool di nodi in base alle esigenze dei tuoi carichi di lavoro. Sia il gestore della scalabilità automatica del cluster sia il provisioning automatico dei nodi supportano l'utilizzo delle VM Spot.
VM spot e provisioning automatico dei nodi
Il provisioning automatico dei nodi crea ed elimina automaticamente i pool di nodi nel
cluster per soddisfare le richieste dei tuoi carichi di lavoro. Quando pianifichi carichi di lavoro che richiedono VM Spot utilizzando un'affinità nodeSelector
o dei nodi, il provisioning automatico dei nodi crea nuovi pool di nodi per ospitare i pod dei carichi di lavoro. GKE aggiunge automaticamente il taint cloud.google.com/gke-spot=true:NoSchedule
ai nodi dei nuovi pool di nodi. Solo i pod con la tolleranza corrispondente possono essere eseguiti sui nodi di questi pool di nodi. Devi aggiungere la tolleranza corrispondente ai tuoi deployment per consentire a GKE di posizionare i pod sulle VM a spot:
tolerations:
- key: cloud.google.com/gke-spot
operator: Equal
value: "true"
effect: NoSchedule
Puoi assicurarti che GKE pianifichi i pod solo su VM spot utilizzando sia una tolleranza sia una regola di affinità nodeSelector
o del 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 vuoi che un carico di lavoro venga pianificato sulle VM spot, utilizza un'affinità nodeSelector
o un nodo oltre a una tolleranza. Per scoprire di più, consulta Pianificazione dei carichi di lavoro sulle VM spot.
VM spot e gestore della scalabilità automatica del cluster
Il gestore della scalabilità automatica dei cluster aggiunge e rimuove automaticamente i nodi nei pool di nodi in base alla domanda. Puoi configurare il gestore della scalabilità automatica dei cluster in modo da aggiungere nuovi nodi con una preferenza per le VM Spot. Per scoprire di più, consulta VM spot e il gestore della scalabilità automatica dei cluster.
Policy predefinita
A partire dalla versione 1.24.1-gke.800 di GKE, puoi definire il criterio di località del gestore della scalabilità. Il gestore della scalabilità automatica dei cluster tenta di eseguire il provisioning dei pool di nodi delle VM Spot quando le risorse sono disponibili e il criterio di località predefinito è impostato su ANY
. Con questo criterio, le VM Spot hanno un
rischio inferiore di essere preempted. Per gli altri tipi di VM, il criterio di distribuzione del gestore della scalabilità automatica del cluster predefinito è BALANCED
.
Eseguire l'upgrade dei pool di nodi standard utilizzando le VM spot
Se i pool di nodi del cluster standard che utilizzano VM spot sono configurati per utilizzare gli upgrade di picco, GKE crea nodi di picco con VM spot. Tuttavia, GKE non attende che le VM spot siano pronte prima di mettere in isolamento e svuotare i nodi esistenti, poiché le VM spot non forniscono alcuna garanzia di disponibilità. Per scoprire di più, consulta Upgrade di Surge.
Modifiche al comportamento di Kubernetes
L'utilizzo delle VM spot su GKE modifica alcune garanzie e vincoli forniti da Kubernetes, ad esempio:
- Il recesso dalle VM spot è involontario e non è coperto dalle garanzie di
PodDisruptionBudgets
. Potresti riscontrare una maggiore indisponibilità rispetto al valore configurato diPodDisruptionBudget
.
Best practice per le VM spot
Quando progetti un sistema che utilizza VM spot, puoi evitare interruzioni importanti utilizzando le seguenti linee guida:
- Le VM spot non hanno garanzie di disponibilità. Progetta i tuoi sistemi tenendo conto del fatto che GKE potrebbe recuperare una o tutte le tue VM spot in qualsiasi momento, senza alcuna garanzia di quando diventano disponibili nuove istanze.
- Per assicurarti che i carichi di lavoro e i job vengano elaborati anche quando non sono disponibili VM Spot, assicurati che i tuoi cluster abbiano un mix di pool di nodi che utilizzano VM Spot e pool di nodi che utilizzano VM Compute Engine standard.
- Prima di aggiungere un pool di nodi GPU che utilizza VM spot, assicurati che il cluster abbia almeno un pool di nodi non GPU che utilizzi VM standard.
- Sebbene i nomi dei nodi di solito non cambino quando vengono ricreati, gli indirizzi IP interni ed esterni utilizzati dalle VM Spot potrebbero cambiare dopo la ricreazione.
- Utilizza le incompatibilità e le tolleranze dei nodi per assicurarti che i pod critici non vengano pianificati su pool di nodi che utilizzano VM spot.
- Per eseguire carichi di lavoro con stato sulle VM spot, verifica che i carichi di lavoro possano terminare in modo corretto entro 25 secondi dall'arresto per ridurre al minimo il rischio di danneggiamento dei dati dei volumi permanenti.
- Segui le best practice per la terminazione dei pod Kubernetes.
Passaggi successivi
- Scopri come utilizzare le VM spot nei pool di nodi.
- Scopri di più sulla scalabilità automatica dei cluster.
- Scopri come scalare le app di cui è stato eseguito il deployment.
- Scopri di più sulle VM spot nella documentazione di Compute Engine.
- Guarda un tutorial sul deployment di un carico di lavoro batch utilizzando le VM spot in GKE.