Questa pagina mostra come utilizzare le VM preemptibili in Google Kubernetes Engine (GKE).
Panoramica
Le VM prerilasciabili sono istanze VM di Compute Engine il cui prezzo è inferiore rispetto alle VM standard e che non offrono alcuna garanzia di disponibilità. Le VM prerilasciabili offrono funzionalità simili alle VM spot, ma durano solo fino a 24 ore dopo la creazione.
In alcuni casi, una VM preassegnata potrebbe durare più di 24 ore. Ciò può verificarsi quando la nuova istanza Compute Engine è troppo veloce e Kubernetes non riconoscere che è stata creata una VM di Compute Engine diversa. L'istanza Compute Engine di base avrà una durata massima di 24 ore e seguirà il comportamento previsto per le VM prerilasciabili.
Confronto con le VM spot
Le VM prerilasciabili condividono molte somiglianze con le VM spot, tra cui:
- 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 inferiori rispetto alle VM standard.
- Nei cluster che eseguono GKE versione 1.20 e successive, l'arresto dei nodi in modo corretto è 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, le VM prerilasciabili durano al massimo 24 ore dopo la creazione.
Puoi abilitare le VM prerilasciabili su nuovi cluster e pool di nodi, usa nodeSelector
o affinità nodo per controllare la pianificazione e utilizzare incompatibilità e tolleranze per evitare
a problemi con i carichi di lavoro di sistema
quando i nodi vengono prerilasciati.
Terminazione e chiusura controllata delle VM prerilasciabili
Quando Compute Engine deve recuperare le risorse utilizzate dalle VM prerilasciabili, viene inviata una notifica di prerilascio a GKE. Le VM prerilasciabili terminano 30 secondi dopo la ricezione di un notifica di risoluzione.
Per impostazione predefinita, i cluster usano il nodo gestito automaticamente arresta. Kubelet rileva la notifica di interruzione e termina in modo corretto i pod in esecuzione sul nodo. Se i pod fanno parte di 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 priorityClass 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, 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 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
Modifiche al comportamento di Kubernetes
L'utilizzo di VM prerilasciabili su GKE modifica alcune garanzie dei vincoli forniti da Kubernetes, ad esempio:
GKE arresta le VM prerilasciabili senza un periodo di tolleranza per i pod, 30 secondi dopo aver ricevuto una notifica di preemption da Compute Engine.
Il recesso dalle VM prerilasciabili è involontario e non è coperto dalle garanzie di
PodDisruptionBudgets
. Potresti riscontrare una maggiore indisponibilità rispetto alPodDisruptionBudget
configurato.
Limitazioni
- La funzionalità di chiusura di kubelet per i nodi è abilitato solo sui cluster che eseguono GKE versione 1.20 e successive. Per le versioni di GKE precedenti alla 1.20, puoi utilizzare il Gestore eventi di terminazione dei nodi Kubernetes su Google Cloud per terminare in modo corretto i pod quando le VM prerilasciabili vengono terminate.
- Le VM prerilasciabili non supportano i pool di nodi 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 preemptibili.
Per creare un cluster con VM prerilasciabili, esegui il seguente 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 il comando seguente:
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--preemptible
Sostituisci POOL_NAME
con il nome del nuovo pool di nodi.
Utilizzare 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 1.25.5-gke.2500 o versioni successive) ai nodi che utilizzano VM preemptibili. Puoi utilizzare un nodeSelector
nei tuoi deployment per indicare
GKE pianificare i pod su VM prerilasciabili.
Ad esempio, i seguenti filtri di deployment per le VM prerilasciabili che utilizzano 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"
Utilizzare gli elementi dannosi dei nodi per le VM prerilasciabili
Puoi contaggiare i nodi che utilizzano VM prerilasciabili in modo che GKE possa collocare su questi nodi solo i pod con la tolleranza corrispondente.
Per aggiungere un'alterazione del nodo a un pool di nodi che utilizza VM prerilasciabili, utilizza il flag --node-taints
durante la creazione del pool di nodi, in modo simile al 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à del nodo sono pianificati per il nodo.
Per aggiungere la tolleranza pertinente ai pod, modifica i deployment e aggiungi quanto segue alla specifica del pod:
tolerations:
- key: cloud.google.com/gke-preemptible
operator: Equal
value: "true"
effect: NoSchedule
Incompatibilità dei nodi per le VM prerilasciabili GPU
Le VM prerilasciabili supportano l'utilizzo di 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 le utilizza. La presenza di un pool di nodi standard garantisce che GKE possa posizionare in sicurezza componenti di sistema come il 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 in un cluster che
hanno già un pool di nodi standard, GKE non esegue
aggiunge l'incompatibilità nvidia.com/gpu=present:NoSchedule
ai nodi. GKE
potrebbe pianificare pod di sistema sulle VM prerilasciabili,
o interruzioni del servizio. Questo comportamento aumenta anche il consumo di risorse, poiché le GPU
sono più costosi rispetto ai nodi 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.