Utilizzo di VM prerilasciabili per eseguire carichi di lavoro a tolleranza di errore


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 prerilasciabile potrebbe durare più di 24 ore. Questo può verificarsi quando la nuova istanza Compute Engine viene avviata troppo rapidamente e Kubernetes non riconosce che è stata creata un'altra VM Compute Engine. L'istanza Compute Engine di base avrà una durata massima di 24 ore e seguirà il comportamento VM prerilasciabile prerilasciabili.

Confronto con le VM spot

Le VM prerilasciabili condividono molte somiglianze con le VM spot, tra cui:

A differenza delle VM spot, che non hanno un tempo di scadenza massimo, le VM prerilasciabili rimangono attive solo per un massimo di 24 ore dopo la creazione.

Puoi attivare le VM prerilasciabili sui nuovi cluster e nei pool di nodi, utilizzare l'affinità dei nodi o nodeSelector per controllare la pianificazione e utilizzare le incompatibilità e le 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 inviata una notifica di prerilascio a GKE. Le VM prerilasciabili 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

Modifiche al comportamento di Kubernetes

L'utilizzo di VM prerilasciabili su GKE modifica le garanzie fornite da Kubernetes PodDisruptionBudgets. Il recupero delle VM prerilasciabili è involontario e non è coperto dalle garanzie di PodDisruptionBudgets. Potresti riscontrare una maggiore indisponibilità rispetto al valore configurato di PodDisruptionBudget.

Limitazioni

  • La funzionalità di arresto dei nodi di Kubelet viene attivata solo nei 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 node pool Windows Server.
  • In GKE, non puoi modificare la durata del periodo di tolleranza per l'interruzione del nodo. I campi di configurazione di kubelet shutdownGracePeriod e shutdownGracePeriodCriticalPods sono immutabili.

Crea un cluster o un pool di nodi con VM preemptible

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 seguente comando:

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 a GKE di pianificare i pod su VM prerilasciabili.

Ad esempio, i seguenti filtri di deployment per le VM prerilasciabili che utilizzano l'etichettacloud.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 preemptible

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 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

Contaminazioni 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 a un cluster che non ha già un pool di nodi standard, GKE non aggiunge automaticamente il taint 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 di quelli non GPU.

Passaggi successivi