Questa pagina mostra come eseguire carichi di lavoro a tolleranza di errore, stateless o batch a costi inferiori utilizzando le VM spot nei cluster e nei pool di nodi di 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 le stesse opzioni delle VM di Compute Engine standard. Compute Engine può recuperare le VM spot in qualsiasi momento a causa di eventi di sistema, ad esempio quando sono necessarie risorse per le VM standard.
Per saperne di più sulle VM spot in GKE, consulta VM spot.
Le VM spot sostituiscono la necessità di utilizzare VM prerilasciabili per eseguire carichi di lavoro stateless, in batch o a tolleranza di errore. A differenza delle VM prerilasciabili, che scadono dopo 24 ore, le VM spot non hanno scadenza. Le VM spot vengono terminate quando Compute Engine richiede le risorse per eseguire le VM standard.
Le VM spot sono supportate anche su cluster GKE Autopilot tramite pod spot. Con i pod spot, Autopilot pianifica e gestisce automaticamente i carichi di lavoro sulle VM spot.
Limitazioni
- La funzionalità di arresto controllato dei nodi di 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 di Kubernetes su Google Cloud per terminare in modo controllato i pod quando le VM spot vengono prerilasciate.
- Le VM spot non supportano i pool di nodi 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
- Se vuoi utilizzare Google Cloud CLI per questa attività, installa e initialize gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo
gcloud components update
.
Crea un cluster con VM spot
Puoi creare un nuovo cluster utilizzando le VM spot con Google Cloud CLI o la console Google Cloud.
gcloud
Crea un nuovo cluster che utilizza le VM spot nel pool di nodi predefinito anziché le VM standard:
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 utilizzando le VM spot, segui questi passaggi:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic su add_box Crea.
Nella finestra di dialogo Crea cluster, accanto a GKE Standard, fai clic su Configura.
Nel menu di navigazione, nella sezione Pool di nodi, fai clic sul nome del pool di nodi che vuoi configurare, quindi fai clic su Nodi.
Seleziona la casella di controllo Abilita le VM spot.
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 le VM spot solo su nuovi pool di nodi. Non puoi abilitare o disabilitare le VM spot 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, segui questi passaggi:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.
Fai clic su
Aggiungi pool di nodi.Dal menu di navigazione, fai clic su Nodi.
Seleziona la casella di controllo Abilita le VM spot.
Configura il pool di nodi in base alle esigenze, quindi fai clic su Crea.
Pianifica 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 versione 1.25.5-gke.2500 o successiva) ai nodi che utilizzano le VM spot. Puoi filtrare questa etichetta nella specifica del pod utilizzando il campo nodeSelector
nella specifica del pod o l'affinità nodo.
Nell'esempio seguente, crei un cluster con due pool di nodi, uno dei quali utilizza VM spot. Quindi, esegui il deployment di un'applicazione nginx
stateless nelle VM spot, utilizzando un nodeSelector
per controllare la posizione in cui GKE posiziona i pod.
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.Recupera le credenziali per il cluster:
gcloud container clusters get-credentials CLUSTER_NAME
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.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 solo i pod su nodi che utilizzano VM spot.Applica il manifest al tuo cluster:
kubectl apply -f pi-app.yaml
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 su nodi che utilizzano VM spot.
Utilizza incompatibilità e tolleranze per le VM spot
Come best practice, crea cluster con almeno un pool di nodi senza VM spot in cui puoi inserire carichi di lavoro di sistema come DNS. Puoi utilizzare le incompatibilità dei nodi e le tolleranze corrispondenti per indicare a GKE di evitare di posizionare determinati carichi di lavoro sulle VM spot.
Per creare un pool di nodi con nodi che utilizzano VM spot e che presentano incompatibilità 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
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à dei nodi aggiunta.
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.
- Segui un tutorial sul deployment di un carico di lavoro batch con le VM spot in GKE.