Esecuzione di carichi di lavoro a tolleranza di errore a costi inferiori con le VM spot

Questa pagina mostra come eseguire carichi di lavoro batch, stateless o a tolleranza di errore a costi inferiori utilizzando le VM spot nei cluster e nei pool di nodi Google Kubernetes Engine (GKE).

Panoramica

Le VM spot sono macchine virtuali (VM) di Compute Engine il cui prezzo è inferiore rispetto alle VM standard predefinite e non garantiscono la disponibilità. Le VM spot offrono gli stessi tipi di macchine e opzioni delle VM Compute Engine standard. Compute Engine può recuperare le VM spot in qualsiasi momento a causa di eventi di sistema, ad esempio quando le risorse sono necessarie per le VM standard.

Per saperne di più sulle VM spot in GKE, consulta VM spot.

Le VM spot sostituiscono la necessità di utilizzare le VM preemptible per eseguire workload stateless, batch o a tolleranza di errore. A differenza delle VM preemptible, che scadono dopo 24 ore, le VM spot non hanno un periodo di scadenza. Le VM spot vengono terminate quando Compute Engine richiede le risorse per eseguire le VM standard.

Le VM spot sono supportate anche sui cluster GKE Autopilot tramite i pod spot. Con i pod spot, Autopilot pianifica e gestisce automaticamente i carichi di lavoro sulle VM spot.

Limitazioni

  • Le VM spot non supportano i node pool Windows Server.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

  • Abilita l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Per utilizzare Google Cloud CLI per questa attività, installala e poi inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo il comando gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.

Provisioning delle VM spot in GKE

Puoi eseguire il provisioning di VM spot creando un cluster che utilizza VM spot per il pool di nodi predefinito. In alternativa, puoi creare un pool di nodi che utilizza VM spot.

Utilizza la console Google Cloud o Google Cloud CLI per impostare i parametri per l'arresto normale delle VM spot. Per saperne di più sulla possibilità di impostare i parametri di arresto normale, consulta Terminazione e arresto normale delle VM spot.

Crea un cluster con VM spot

Puoi creare un nuovo cluster utilizzando le VM spot con Google Cloud CLI o la console Google Cloud .

Console

Per creare un nuovo pool di nodi con un cluster che utilizza VM spot, segui questi passaggi:

  1. Nella console Google Cloud , vai alla pagina Crea un cluster Kubernetes.

    Vai a Crea un cluster Kubernetes

  2. Nel menu di navigazione, nella sezione Pool di nodi, fai clic sul nome del pool di nodi che vuoi configurare.

  3. Per Modello di provisioning, seleziona VM spot.

  4. (Facoltativo) Per configurare il periodo di terminazione normale per i pod in esecuzione sui nodi in questo pool di nodi, seleziona un valore dal menu a discesa Periodo di tolleranza per l'arresto e, se applicabile, inserisci un valore nel campo Periodo di tolleranza per l'arresto dei pod critici (secondi). I valori, se configurati, vengono memorizzati nella configurazione del sistema di nodi, dove puoi aggiornarli in un secondo momento, se necessario. Per ulteriori informazioni, consulta Terminazione e arresto normale delle VM spot.

  5. Configura il cluster come necessario, quindi fai clic su Crea.

gcloud

Crea un nuovo cluster che utilizzi le VM spot nel pool di nodi predefinito anziché le VM standard:

gcloud container clusters create CLUSTER_NAME \
    --spot
    [--system-config-from-file=SYSTEM_CONFIG_PATH]

Sostituisci CLUSTER_NAME con il nome del nuovo cluster.

Facoltativamente, se vuoi impostare i parametri per l'arresto normale per il pool di nodi predefinito, sostituisci SYSTEM_CONFIG_PATH con il percorso del file contenente la configurazione di kubelet. Per ulteriori informazioni, consulta Terminazione controllata delle VM spot in GKE. Puoi anche aggiornare questi parametri dopo la creazione pool di nodi, ma GKE deve ricreare i nodi per apportare le modifiche.

Crea un pool di nodi con VM spot

Puoi creare nuovi pool di nodi utilizzando le VM spot con gcloud CLI o la console Google Cloud . Puoi attivare le VM Spot solo sui nuovi node pool. Non puoi attivare o disattivare le VM spot sui node pool esistenti.

Console

Per creare un nuovo pool di nodi utilizzando le VM spot, segui questi passaggi:

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud .

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.

  3. Fai clic sulla scheda Nodi.

  4. Fai clic su Crea node pool gestito dall'utente.

  5. Nel menu di navigazione, fai clic su Nodi.

  6. Per Modello di provisioning, seleziona VM spot.

  7. (Facoltativo) Per configurare il periodo di terminazione controllata per i pod in esecuzione sui nodi di questo pool di nodi, seleziona un valore per il menu a discesa Periodo di tolleranza per l'arresto e, se applicabile, inserisci un valore per il campo Periodo di tolleranza per l'arresto dei pod critici (secondi). I valori, se configurati, vengono memorizzati nella configurazione del sistema di nodi, dove puoi aggiornarli in un secondo momento, se necessario. Per ulteriori informazioni, consulta Terminazione e arresto normale delle VM spot.

  8. Configura il pool di nodi in base alle tue esigenze, poi fai clic su Crea pool di nodi.

gcloud

Crea un nuovo pool di nodi utilizzando le VM spot:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --spot
    [--system-config-from-file=SYSTEM_CONFIG_PATH]

Sostituisci quanto segue:

  • POOL_NAME: il nome del nuovo pool di nodi.
  • CLUSTER_NAME: il nome del tuo cluster.

Facoltativamente, se vuoi impostare i parametri per l'arresto normale, sostituisci SYSTEM_CONFIG_PATH con il percorso del file contenente la configurazione di kubelet. Per saperne di più, consulta Terminazione controllata delle VM spot in GKE. Puoi anche aggiornare questi parametri dopo la creazione pool di nodi, ma GKE deve ricreare i nodi per apportare le modifiche.

Pianificare i carichi di lavoro sulle VM spot

GKE aggiunge le etichette cloud.google.com/gke-spot=true e cloud.google.com/gke-provisioning=spot (per i nodi che eseguono GKE 1.25.5-gke.2500 o versioni successive) ai nodi che utilizzano le VM spot. Puoi filtrare questa etichetta nelle specifiche del pod utilizzando il campo nodeSelector nelle specifiche del pod o l'affinità dei nodi.

Nell'esempio seguente, crei un cluster con due pool di nodi, uno dei quali utilizza le VM spot. Poi, esegui il deployment di un'applicazione nginx stateless sulle VM spot, utilizzando un nodeSelector per controllare dove GKE posiziona i pod.

  1. Crea un nuovo cluster con il pool di nodi predefinito utilizzando VM standard:

    gcloud container clusters create CLUSTER_NAME
    

    Sostituisci CLUSTER_NAME con il nome del nuovo cluster.

  2. Recupera le credenziali per il cluster:

    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. Crea un pool di nodi utilizzando le VM spot:

    gcloud container node-pools create POOL_NAME \
       --cluster=CLUSTER_NAME \
        --num-nodes=1 \
        --spot
    

    Sostituisci quanto segue:

    • POOL_NAME: il nome del nuovo pool di nodi.
    • CLUSTER_NAME: il nome del tuo cluster.
  4. Salva il seguente manifest come file denominato pi-app.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      template:
        metadata:
          labels:
            app: pi
        spec:
          nodeSelector:
            cloud.google.com/gke-spot: "true"
          terminationGracePeriodSeconds: 25
          containers:
          - name: pi
            image: perl:5.34.0
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never
      backoffLimit: 4
    

    In questo manifest, il campo nodeSelector indica a GKE di pianificare i pod solo sui nodi che utilizzano VM Spot.

  5. Applica il manifest al tuo cluster:

    kubectl apply -f pi-app.yaml
    
  6. Descrivi il pod:

    kubectl describe pod pi
    

    L'output è simile al seguente:

    Name:         pi-kjbr9
    Namespace:    default
    Priority:     0
    Node:         gke-cluster-2-spot-pool-fb434072-44ct
    ...
    Labels:       app=pi
                  job-name=pi
    Status:       Succeeded
    ...
    Controlled By:  Job/pi
    Containers:
    ...
    Conditions:
      Type              Status
      Initialized       True 
      Ready             False 
      ContainersReady   False 
      PodScheduled      True 
    Volumes:
    ...
    Node-Selectors:              cloud.google.com/gke-spot=true
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason     Age    From               Message
      ----    ------     ----   ----               -------
      Normal  Scheduled  4m3s   default-scheduler  Successfully assigned default/pi-kjbr9 to gke-cluster-2-spot-pool-fb434072-44ct
      Normal  Pulling    4m2s   kubelet            Pulling image "perl:5.34.0"
      Normal  Pulled     3m43s  kubelet            Successfully pulled image "perl:5.34.0" in 18.481761978s
      Normal  Created    3m43s  kubelet            Created container pi
      Normal  Started    3m43s  kubelet            Started container pi
    

    Il campo Node mostra che GKE pianifica i pod solo sui nodi che utilizzano VM spot.

Utilizza taints e tolerations per le VM spot

Come best practice, crea cluster con almeno un pool di nodi senza VM spot in cui puoi posizionare i workload di sistema come il DNS. Puoi utilizzare le incompatibilità dei nodi e le corrispondenti tolleranze per indicare a GKE di evitare di posizionare determinati workload sulle VM spot.

  1. Per creare un pool di nodi con nodi che utilizzano VM spot e hanno taint dei nodi, utilizza il flag --node-taints durante la creazione del pool di nodi:

    gcloud container node-pools create POOL_NAME \
        --cluster=CLUSTER_NAME \
        --node-taints=cloud.google.com/gke-spot="true":NoSchedule \
        --spot
    
  2. Per aggiungere la tolleranza corrispondente ai pod che vuoi pianificare per le VM spot, modifica i deployment e aggiungi quanto segue alla specifica del pod:

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

    GKE pianifica solo i pod con questa tolleranza sulle VM spot con l'incompatibilità del nodo aggiunta.

Passaggi successivi