Questa pagina mostra come utilizzare le VM prerilasciabili in Google Kubernetes Engine (GKE).
Panoramica
Le VM prerilasciabili sono istanze VM di Compute Engine il cui prezzo è inferiore rispetto alle VM standard e non offrono alcuna garanzia di disponibilità. Le VM prerilasciabili offrono funzionalità simili a quelle delle VM spot, ma hanno una durata massima di 24 ore dopo la creazione.
In alcuni casi, una VM prerilasciabile potrebbe durare più di 24 ore. Questo può verificarsi quando la nuova istanza di Compute Engine viene visualizzata troppo rapidamente e Kubernetes non riconosce che è stata creata una VM di Compute Engine diversa. L'istanza di Compute Engine sottostante avrà una durata massima di 24 ore e seguirà il comportamento previsto della VM prerilasciabile.
Confronto con le VM spot
Le VM prerilasciabili hanno molte somiglianze con le VM spot, tra cui le seguenti:
- Terminato quando Compute Engine richiede le risorse per eseguire VM standard.
- Utile per l'esecuzione di carichi di lavoro stateless, batch o a tolleranza di errore.
- Prezzi più bassi rispetto alle VM standard.
- Nei cluster che eseguono GKE versione 1.20 e successive, l'arresto dei nodi gestiti è abilitato per impostazione predefinita.
- Funziona con il gestore della scalabilità automatica dei cluster e il provisioning automatico dei nodi.
A differenza delle VM spot, che non hanno una scadenza massima, quelle prerilasciabili hanno una durata massima di 24 ore dopo la creazione.
Puoi abilitare le VM prerilasciabili su nuovi cluster e pool di nodi, utilizzare nodeSelector
o l'affinità dei nodi per controllare la pianificazione e utilizzare incompatibilità e tolleranze per evitare problemi con i carichi di lavoro di sistema quando i nodi vengono prerilasciati.
Terminazione e arresto controllato delle VM prerilasciabili
Quando Compute Engine deve recuperare le risorse utilizzate dalle VM prerilasciabili, viene inviato un avviso di prerilascio a GKE. Le VM prerilasciabili terminano 30 secondi dopo aver ricevuto un avviso di terminazione.
Nei cluster che eseguono GKE versione 1.20 e successive, la funzionalità di arresto controllato del nodo kubelet è abilitata per impostazione predefinita. kubelet rileva l'avviso di terminazione e termina automaticamente i pod in esecuzione sul nodo. Se i pod fanno parte di un oggetto Deployment, il controller crea e pianifica nuovi pod per sostituirli.
Secondo il criterio del "best effort", il kubelet concede il seguente periodo di terminazione gestita, in base alla versione GKE del pool di nodi:
- Dopo 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 per essere arrestati 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 per essere arrestati in modo controllato.
Durante la terminazione controllata 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 elimina 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
Modifiche al comportamento di Kubernetes
L'utilizzo di VM prerilasciabili su GKE modifica alcune garanzie e limitazioni fornite da Kubernetes, ad esempio i seguenti:
GKE arresta le VM prerilasciabili senza un periodo di tolleranza per i pod, 30 secondi dopo aver ricevuto un avviso di prerilascio da Compute Engine.
La rivendicazione delle VM prerilasciabili non è volontaria e non è coperta dalle garanzie di
PodDisruptionBudgets
. Potresti riscontrare una indisponibilità maggiore rispetto a quella diPodDisruptionBudget
configurata.
Limitazioni
- La funzionalità di arresto controllato dei nodi di kubelet è abilitata solo sui cluster che eseguono GKE versione 1.20 e successive. Per le versioni di GKE precedenti alla 1.20, puoi utilizzare il gestore di eventi di terminazione dei nodi Kubernetes su Google Cloud per terminare in modo controllato i pod al termine delle VM prerilasciabili.
- Le VM prerilasciabili non supportano i pool di nodi di Windows Server.
Crea un cluster o un pool di nodi con VM prerilasciabili
Puoi utilizzare Google Cloud CLI per creare un cluster o un pool di nodi con VM prerilasciabili.
Per creare un cluster con VM prerilasciabili, esegui questo comando:
gcloud container clusters create CLUSTER_NAME \
--preemptible
Sostituisci CLUSTER_NAME
con il nome del nuovo cluster.
Per creare un pool di nodi con VM prerilasciabili, esegui questo comando:
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--preemptible
Sostituisci POOL_NAME
con il nome del nuovo pool di nodi.
Usa nodeSelector per pianificare i pod su VM prerilasciabili
GKE aggiunge le etichette cloud.google.com/gke-preemptible=true
e cloud.google.com/gke-provisioning=preemptible
(per i nodi che eseguono GKE versione 1.25.5-gke.2500 o successiva) ai nodi che utilizzano VM prerilasciabili. Puoi utilizzare un nodeSelector
nei deployment per indicare a GKE di pianificare i pod su VM prerilasciabili.
Ad esempio, il seguente deployment filtra per le VM prerilasciabili utilizzando l'etichetta cloud.google.com/gke-preemptible
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
spec:
replicas: 3
selector:
matchLabels:
app: hello-app
template:
metadata:
labels:
app: hello-app
spec:
containers:
- name: hello-app
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
resources:
requests:
cpu: 200m
nodeSelector:
cloud.google.com/gke-preemptible: "true"
Usa le incompatibilità dei nodi per le VM prerilasciabili
Puoi incompatibilità dei nodi che utilizzano VM prerilasciabili in modo che GKE possa posizionare solo pod con la tolleranza corrispondente su questi nodi.
Per aggiungere un'incompatibilità dei nodi a un pool di nodi che utilizza VM prerilasciabili, usa il flag --node-taints
durante la creazione del pool di nodi, come nel seguente comando:
gcloud container node-pools create POOL2_NAME \
--cluster=CLUSTER_NAME \
--node-taints=cloud.google.com/gke-preemptible="true":NoSchedule
Ora, solo i pod che tollerano l'incompatibilità dei nodi vengono pianificati per il nodo.
Per aggiungere la tolleranza pertinente ai tuoi pod, modifica i deployment e aggiungi quanto segue alla specifica dei pod:
tolerations:
- key: cloud.google.com/gke-preemptible
operator: Equal
value: "true"
effect: NoSchedule
Incompatibilità dei nodi per le VM prerilasciabili della GPU
Supporto delle VM prerilasciabili tramite GPU. Prima di aggiungere un pool di nodi GPU che utilizza VM prerilasciabili, devi creare almeno un altro pool di nodi nel cluster che non utilizza VM prerilasciabili. Avere un pool di nodi standard garantisce che GKE possa posizionare in sicurezza componenti di sistema come DNS.
Se crei un nuovo cluster con pool di nodi GPU che utilizzano VM prerilasciabili o se aggiungi un nuovo pool di nodi GPU che utilizza VM prerilasciabili a un cluster che non dispone già di un pool di nodi standard, GKE non aggiunge automaticamente l'incompatibilità nvidia.com/gpu=present:NoSchedule
ai nodi. GKE potrebbe pianificare i pod di sistema sulle VM prerilasciabili, il che può causare interruzioni. Questo comportamento aumenta anche il consumo di risorse, poiché i nodi GPU sono più costosi di quelli non GPU.
Passaggi successivi
- Scopri come eseguire un'applicazione GKE su VM spot con nodi on demand come fallback.
- Scopri di più sulle VM spot in GKE.
- Scopri di più su incompatibilità e tolleranze.