Questa pagina mostra come utilizzare le VM prerilasciabili in Google Kubernetes Engine (GKE).
Panoramica
Le VM prerilasciabili sono istanze VM di Compute Engine con un prezzo inferiore rispetto alle VM standard e non forniscono 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 prerilasciabile potrebbe durare più di 24 ore. Ciò può verificarsi quando la nuova istanza di Compute Engine viene avviata 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 VM prerilasciabile
Confronto con le VM spot
Le VM prerilasciabili condividono molte somiglianze con le VM spot, tra cui:
- Vengono terminate quando Compute Engine richiede le risorse per eseguire le VM standard.
- Sono utili per l'esecuzione di workload stateless, batch o a tolleranza di errore.
- Hanno un prezzo inferiore rispetto alle VM standard.
- Nei cluster che eseguono GKE versione 1.20 e successive, l'arresto normale dei nodi è abilitato per impostazione predefinita.
- Funzionano con il gestore della scalabilità automatica dei cluster e il provisioning automatico dei nodi.
A differenza delle VM spot, che non hanno un tempo di scadenza massimo, le VM prerilasciabili durano solo fino a 24 ore dopo la creazione.
Puoi abilitare le VM prerilasciabili su nuovi cluster e node pool, utilizzare nodeSelector o l'affinità dei nodi per controllare la pianificazione e utilizzare incompatibilità e tolleranze per evitare problemi con i workload di sistema quando i nodi vengono prerilasciati.
Terminazione e arresto normale 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 vengono terminate 30 secondi dopo aver ricevuto una notifica di terminazione.
Per impostazione predefinita, i cluster utilizzano l'arresto normale dei nodi. Il kubelet rileva la notifica di terminazione e termina normalmente i pod in esecuzione sul nodo. Se i pod fanno parte di un workload gestito, ad esempio un deployment, il controller crea e pianifica nuovi pod per sostituire quelli terminati.
In base al principio del massimo impegno, il kubelet concede un periodo di terminazione normale di 15 secondi per i pod non di sistema, dopodiché i pod di sistema (con le priorityClass system-cluster-critical o system-node-critical) hanno 15 secondi per terminare normalmente. Durante la terminazione normale dei nodi, il kubelet aggiorna lo stato dei pod e assegna una fase Failed e un motivo Terminated ai pod terminati.
Il periodo di terminazione normale per i pod non di sistema ha una durata massima di 15 secondi.
La specifica di un valore maggiore di 15 secondi nel campo terminationGracePeriodSeconds del manifest del pod non ha alcun effetto. L'intera VM viene arrestata 30 secondi dopo la notifica di prerilascio.
Modifiche al comportamento di Kubernetes
L'utilizzo di VM prerilasciabili su GKE modifica le garanzie fornite da PodDisruptionBudgets di Kubernetes. Il recupero delle VM prerilasciabili
è involontario e non è coperto dalle garanzie di
PodDisruptionBudgets.
Potresti riscontrare una maggiore indisponibilità rispetto a quella configurata in PodDisruptionBudget.
Limitazioni
- La funzionalità di arresto normale dei nodi 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 GCP per terminare normalmente i pod quando le VM prerilasciabili vengono terminate.
- Le VM prerilasciabili non supportano i node pool Windows Server.
- In GKE, il periodo di tolleranza di 15 secondi per i pod non di sistema e il successivo periodo di 15 secondi per i pod di sistema sono fissi e non possono essere modificati.
I campi di configurazione kubelet sottostanti
shutdownGracePeriodeshutdownGracePeriodCriticalPodssono immutabili.
Creare un cluster o pool di nodi con VM prerilasciabili
Puoi utilizzare Google Cloud CLI per creare un cluster o pool di nodi con VM prerilasciabili.
Per creare un cluster con VM prerilasciabili, esegui il comando seguente:
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 sulle VM prerilasciabili
GKE aggiunge le 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 successive) etichette ai nodi che utilizzano
VM prerilasciabili. Puoi utilizzare un nodeSelector nei deployment per indicare a GKE di pianificare i pod sulle VM prerilasciabili.
Ad esempio, il seguente deployment filtra 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"
Utilizzare le incompatibilità dei nodi per le VM prerilasciabili
Puoi applicare incompatibilità ai nodi che utilizzano VM prerilasciabili in modo che GKE possa inserire solo i pod con la tolleranza corrispondente su questi nodi.
Per aggiungere un'incompatibilità dei nodi 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à dei nodi vengono pianificati sul 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 delle GPU. Prima di aggiungere un node pool GPU che utilizza VM prerilasciabili, devi creare almeno un altro node pool nel cluster che non utilizzi VM prerilasciabili. Un pool di nodi standard garantisce che GKE possa inserire in sicurezza i componenti di sistema come DNS.
Se crei un nuovo cluster con node pool GPU che utilizzano VM prerilasciabili o se aggiungi un nuovo pool di nodi GPU che utilizza VM prerilasciabili a un cluster che non ha già 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, perché i nodi GPU sono più costosi dei 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.