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

Questa pagina mostra come utilizzare le VM preemptible in Google Kubernetes Engine (GKE).

Best practice:

Le VM spot sono l'ultima versione delle VM prerilasciabili. Anziché le VM prerilasciabili, ti consigliamo di utilizzare i pod spot nei cluster Autopilot o le VM spot nei cluster Standard. GKE continua a supportare le VM prerilasciabili, che utilizzano lo stesso modello di prezzi delle VM spot.

Panoramica

Le VM prerilasciabili sono istanze VM di Compute Engine il cui prezzo è inferiore rispetto alle VM standard e non garantiscono la 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 Compute Engine viene avviata troppo rapidamente e Kubernetes non riconosce che è stata creata una VM Compute Engine diversa. L'istanza di Compute Engine sottostante avrà una durata massima di 24 ore e seguirà il comportamento VM prerilasciabile preemptible.

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 preemptible durano solo fino a 24 ore dopo la creazione.

Puoi attivare 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 carichi di lavoro di sistema quando i nodi vengono prerilasciati.

Terminazione e arresto normale delle VM preemptible

Quando Compute Engine deve recuperare le risorse utilizzate dalle VM preemptible, a GKE viene inviata una notifica di prerilascio. Le VM prerilasciabili vengono terminate 30 secondi dopo aver ricevuto un avviso di terminazione.

Per impostazione predefinita, i cluster utilizzano l'arresto normale dei nodi. kubelet rileva l'avviso di terminazione e termina normalmente 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 i pod terminati.

In base al criterio del "best effort", kubelet concede un periodo di terminazione controllata 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 in modo controllato. Durante l'arresto normale del nodo, kubelet aggiorna lo stato dei pod e assegna una fase Failed e un motivo Terminated ai pod terminati.

Il periodo di terminazione controllata per i pod non di sistema ha una durata massima di 15 secondi. La specifica di un valore superiore a 15 secondi nel campo terminationGracePeriodSeconds del manifest del pod non ha alcun effetto. L'intera VM si arresta 30 secondi dopo la notifica di prerilascio.

Modifiche al comportamento di Kubernetes

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

Limitazioni

  • Le VM preemptible non supportano i node pool Windows Server.
  • Con le VM preemptible, non puoi modificare 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. I campi di configurazione shutdownGracePeriod e shutdownGracePeriodCriticalPods kubelet sottostanti sono immutabili. Tuttavia, le VM spot supportano la modifica di queste impostazioni. Per ulteriori informazioni, consulta Terminazione e arresto normale delle VM spot.

Crea un cluster o pool di nodi con VM preemptible

Puoi utilizzare Google Cloud CLI per creare un cluster o un pool di nodi con VM preemptive.

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.

Utilizza nodeSelector per pianificare i pod sulle VM preemptible

GKE aggiunge le etichette cloud.google.com/gke-preemptible=true e cloud.google.com/gke-provisioning=preemptible ai nodi che utilizzano VM preemptible. Puoi utilizzare un nodeSelector nei tuoi deployment per indicare a GKE di pianificare i pod sulle VM preemptible.

Ad esempio, i seguenti filtri di Deployment per le VM preemptive 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"

Utilizza i taint dei nodi per le VM preemptible

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 taint 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, sul nodo vengono pianificati solo i pod che tollerano l'incompatibilità del nodo.

Per aggiungere la tolleranza pertinente ai tuoi pod, modifica i deployment e aggiungi quanto segue alle specifiche dei pod:

tolerations:
- key: cloud.google.com/gke-preemptible
  operator: Equal
  value: "true"
  effect: NoSchedule

Taint dei nodi per le VM GPU preemptible

Le VM preemptible supportano l'utilizzo delle GPU. Prima di aggiungere un node pool GPU che utilizza VM preemptible, devi creare almeno un altro node pool nel cluster che non utilizzi VM preemptible. Un pool di nodi standard contribuisce a garantire che GKE possa posizionare in modo sicuro i 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 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 preemptible, 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