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


Questa pagina mostra come eseguire carichi di lavoro a tolleranza di errore, senza stato o batch 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 che non offrono alcuna garanzia di disponibilità. Le VM spot offrono gli stessi tipi di macchine e le stesse opzioni delle VM Compute Engine standard. Compute Engine può recuperare Spot VM in qualsiasi momento a causa di eventi di sistema, ad esempio quando le risorse per le VM standard.

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

Le VM spot sostituiscono la necessità di usare VM prerilasciabili per eseguire in batch o a tolleranza di errore. A differenza di prerilasciabili, che scadono dopo 24 ore, le VM spot senza scadenza. Le VM spot vengono interrotte quando Compute Engine richiede le risorse per eseguire VM standard.

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

Limitazioni

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, install e poi inizializzare con gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo gcloud components update.

Crea un cluster con VM spot

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

gcloud

Crea un nuovo cluster che utilizzi le VM spot nel pool di nodi predefinito instead of standard VMs:

gcloud container clusters create CLUSTER_NAME \
    --spot

Sostituisci CLUSTER_NAME con il nome del nuovo cluster.

Console

Per creare un nuovo cluster con un pool di nodi che utilizza le VM spot:

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

    Vai a Google Kubernetes Engine

  2. Fai clic su Crea.

  3. Nella finestra di dialogo Crea cluster, accanto a GKE Standard, fai clic su Configura.

  4. Nel menu di navigazione, nella sezione Pool di nodi, fai clic sul nome di il pool di nodi che vuoi configurare, quindi fai clic su Nodi.

  5. Seleziona la casella di controllo Abilita VM spot.

  6. Configura il cluster in base alle tue esigenze, quindi fai clic su Crea.

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 abilitare solo Spot VM su nuovi pool di nodi. Non puoi abilitare o disabilitare Spot VM su pool di nodi esistenti.

gcloud

Crea un nuovo pool di nodi utilizzando le VM spot:

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

Sostituisci POOL_NAME con il nome del nuovo pool di nodi.

Console

Per creare un nuovo pool di nodi utilizzando le VM spot, esegui queste operazioni: 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 su Aggiungi pool di nodi.

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

  5. Seleziona la casella di controllo Abilita VM spot.

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

Pianifica i carichi di lavoro sulle VM Spot

GKE aggiunge cloud.google.com/gke-spot=true e cloud.google.com/gke-provisioning=spot (per i nodi in esecuzione GKE versione 1.25.5-gke.2500 o successiva) etichette ai nodi che usano le VM spot. Puoi filtrare per questa etichetta nelle specifiche del pod utilizzando nodeSelector della specifica del pod o dell'affinità nodo.

Nell'esempio seguente, crei un cluster con due pool di nodi, uno dei quali utilizza le VM spot. Quindi, eseguirai il deployment di un'applicazione nginx stateless Spot VM utilizzando un nodeSelector per controllare il posizionamento di GKE tra 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 \
        --num-nodes=1 \
        --spot
    

    Sostituisci POOL_NAME con il nome del nuovo pool di nodi.

  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 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 di nodi che usano VM spot.

Utilizzare incompatibilità e tolleranze per le VM spot

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

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

    gcloud container node-pools create POOL_NAME \
        --node-taints=cloud.google.com/gke-spot="true":NoSchedule
        --spot
    
  2. Per aggiungere la tolleranza corrispondente ai pod che vuoi pianificare sulle 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 Individua le VM con l'incompatibilità dei nodi aggiunta.

Passaggi successivi