Questa pagina mostra come risolvere i problemi relativi ai pool di nodi in modalità GKE Standard.
Se hai bisogno di ulteriore aiuto, contatta l'assistenza clienti Google Cloud.Problemi di creazione del pool di nodi
Questa sezione elenca i problemi che potrebbero verificarsi durante la creazione di nuovi pool di nodi nei cluster standard e fornisce suggerimenti su come risolverli.
Creazione del pool di nodi non riuscita a causa della disponibilità delle risorse
Il seguente problema si verifica quando crei un pool di nodi con hardware specifico in una zona Google Cloud che non dispone di hardware sufficiente per soddisfare i tuoi requisiti.
Per verificare che la creazione del pool di nodi non sia riuscita perché una zona non disponeva di risorse sufficienti, verifica se nei log sono presenti messaggi di errore pertinenti.
Vai a Esplora log nella console Google Cloud:
Nel campo Query, specifica la seguente query:
log_id(cloudaudit.googleapis.com/activity) resource.labels.cluster_name="CLUSTER_NAME" protoPayload.status.message:("ZONE_RESOURCE_POOL_EXHAUSTED" OR "does not have enough resources available to fulfill the request" OR "resource pool exhausted" OR "does not exist in zone")
Sostituisci
CLUSTER_NAME
con il nome del tuo cluster GKE.Fai clic su Esegui query.
Potrebbe essere mostrato uno dei seguenti messaggi di errore:
resource pool exhausted
The zone does not have enough resources available to fulfill the request. Try a different zone, or try again later.
ZONE_RESOURCE_POOL_EXHAUSTED
ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS
Machine type with name '<code><var>MACHINE_NAME</var></code>' does not exist in zone '<code><var>ZONE_NAME</var></code>'
Risolvi
Per risolvere il problema, prova i seguenti suggerimenti:
- Assicurati che la regione o la zona Google Cloud selezionata disponga dell'hardware specifico di cui hai bisogno. Utilizza la tabella della disponibilità di Compute Engine per verificare se zone specifiche supportano hardware specifico. Scegli una regione o una zona Google Cloud diversa per i tuoi nodi che potrebbe avere una migliore disponibilità dell'hardware di cui hai bisogno.
- Crea il pool di nodi con tipi di macchina più piccoli. Aumenta il numero di nodi nel pool di nodi in modo che la capacità di calcolo totale rimanga la stessa.
- Utilizza la prenotazione di capacità di Compute Engine per prenotare le risorse in anticipo.
- Utilizza il provisioning del tipo best effort, descritto nella sezione seguente, per creare correttamente il pool di nodi se può eseguire il provisioning di almeno un numero minimo specificato di nodi rispetto al numero richiesto.
Provisioning best effort
Per determinati hardware, puoi utilizzare il provisioning di tipo best effort, che indica a GKE di creare correttamente il pool di nodi se può eseguire il provisioning di almeno un numero minimo specificato di nodi. GKE continua a tentare di eseguire il provisioning dei nodi rimanenti per soddisfare la richiesta originale nel tempo. Per indicare a GKE di utilizzare il provisioning best effort, utilizza il seguente comando:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--node-locations=ZONE1,ZONE2,... \
--machine-type=MACHINE_TYPE
--best-effort-provision \
--min-provision-nodes=MINIMUM_NODES
Sostituisci quanto segue:
NODE_POOL_NAME
: il nome del nuovo pool di nodi.ZONE1,ZONE2,...
: le zone di Compute Engine per i nodi. Queste zone devono supportare l'hardware selezionato.MACHINE_TYPE
: il tipo di macchina Compute Engine per i nodi. Ad esempio,a2-highgpu-1g
.MINIMUM_NODES
: numero minimo di nodi affinché GKE possa eseguire il provisioning e creare correttamente il pool di nodi. Se omesso, il valore predefinito è1
.
Ad esempio, considera uno scenario in cui sono necessari 10 nodi con GPU NVIDIA A100 da 40 GB collegate in us-central1-c
. In base alla tabella di disponibilità delle regioni e delle zone GPU, questa zona supporta le GPU A100. Per evitare errori di creazione del pool di nodi se non sono disponibili 10 macchine GPU, utilizza il provisioning del criterio del "best effort".
gcloud container node-pools create a100-nodes \
--cluster=ml-cluster \
--node-locations=us-central1-c \
--num-nodes=10 \
--machine-type=a2-highgpu-1g \
--accelerator=type=nvidia-tesla-a100,count=1 \
--best-effort-provision \
--min-provision-nodes=5
GKE crea il pool di nodi anche se sono disponibili solo cinque GPU in us-central1-c
. Nel corso del tempo, GKE tenta di eseguire il provisioning di
più nodi fino a quando il pool di nodi contiene 10 nodi.
Migrazione dei carichi di lavoro tra pool di nodi
Utilizza le seguenti istruzioni per eseguire la migrazione dei carichi di lavoro da un pool di nodi a un altro. Se vuoi modificare gli attributi delle macchine dei nodi nel pool di nodi, consulta Scalabilità verticale modificando gli attributi delle macchine dei nodi.
Eseguire la migrazione dei pod in un nuovo pool di nodi
Per eseguire la migrazione dei pod in un nuovo pool di nodi, devi:
Imposta il pool di nodi esistente su. Questa operazione contrassegna i nodi del pool di nodi esistente come non pianificabili. Quando li contrassegni come non pianificabili, Kubernetes smette di pianificare nuovi pod in questi nodi.
Svuota il pool di nodi esistente: questa operazione rimuove in modo controllato i carichi di lavoro in esecuzione sui nodi del pool di nodi esistente.
Questi passaggi causano la chiusura controllata dei pod in esecuzione nel pool di nodi esistente. Kubernetes le ripianifica su altri nodi disponibili.
Per assicurarti che Kubernetes termini correttamente le tue applicazioni, i tuoi container devono gestire l'indicatore SIGTERM. Utilizza questo approccio per chiudere le connessioni attive ai client ed eseguire il commit o il rollback delle transazioni del database in modo pulito. Nel manifest del pod, puoi usare il campo spec.terminationGracePeriodSeconds
per specificare quanto tempo Kubernetes deve attendere prima di arrestare i container nel pod. Il valore predefinito è 30 secondi.
Per ulteriori informazioni sulla terminazione dei pod, consulta la documentazione di Kubernetes.
Puoi contrassegnare come non pianificabile e svuotare i nodi utilizzando i comandi kubectl cordon
e kubectl drain
.
Crea un pool di nodi ed esegui la migrazione dei carichi di lavoro
Per eseguire la migrazione dei carichi di lavoro in un nuovo pool di nodi, crea il nuovo pool di nodi, quindi contrassegna e svuota i nodi nel pool esistente:
Aggiungi un pool di nodi al cluster.
Verifica che il nuovo pool di nodi sia stato creato eseguendo questo comando:
gcloud container node-pools list --cluster CLUSTER_NAME
Esegui questo comando per vedere su quale nodo sono in esecuzione i pod (vedi la colonna
NODE
):kubectl get pods -o=wide
Ottieni un elenco di nodi nel pool di nodi esistente, sostituendo
EXISTING_NODE_POOL_NAME
con il nome:kubectl get nodes -l cloud.google.com/gke-nodepool=EXISTING_NODE_POOL_NAME
Esegui il comando
kubectl cordon NODE
(sostituisciNODE
con i nomi del comando precedente). Il seguente comando shell esegue l'iterazione di ogni nodo nel pool di nodi esistente e li contrassegna come non pianificabili:for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=EXISTING_NODE_POOL_NAME -o=name); do kubectl cordon "$node"; done
Se vuoi, aggiorna i carichi di lavoro in esecuzione sul pool di nodi esistente per aggiungere un nodeSelector per l'etichetta
cloud.google.com/gke-nodepool:NEW_NODE_POOL_NAME
, doveNEW_NODE_POOL_NAME
è il nome del nuovo pool di nodi. In questo modo, GKE posiziona i carichi di lavoro sui nodi del nuovo pool di nodi.Svuota ogni nodo rimuovendo i pod con un periodo di terminazione controllata assegnato di 10 secondi:
for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=EXISTING_NODE_POOL_NAME -o=name); do kubectl drain --force --ignore-daemonsets --delete-emptydir-data --grace-period=GRACEFUL_TERMINATION_SECONDS "$node"; done
Sostituisci
GRACEFUL_TERMINATION_PERIOD_SECONDS
con il periodo di tempo necessario per la risoluzione provvisoria.Esegui questo comando per vedere che i nodi nel pool di nodi esistente hanno lo stato
SchedulingDisabled
nell'elenco dei nodi:kubectl get nodes
Inoltre, dovresti vedere che ora i pod sono in esecuzione sui nodi nel nuovo pool di nodi:
kubectl get pods -o=wide
Elimina il pool di nodi esistente se non ne hai più bisogno:
gcloud container node-pools delete default-pool --cluster CLUSTER_NAME