Risolvere i problemi dei pool di nodi GKE Standard


Questa pagina mostra come risolvere i problemi di GKE Pool di nodi in modalità Standard.

Se hai bisogno di ulteriore assistenza, 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 in Cluster standard e fornisce suggerimenti su come correggerli.

Problema: la creazione del pool di nodi non riesce a causa di risorse insufficienti

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.

Impossibile convalidare la creazione del pool di nodi perché una zona non ne aveva abbastanza risorse, controlla se nei log sono presenti messaggi di errore pertinenti.

  1. Vai a Esplora log nella console Google Cloud:

    Vai a Esplora log

  2. 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 in un cluster Kubernetes.

  3. Fai clic su Esegui query.

Potrebbe essere visualizzato 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 'MACHINE_NAME' does not exist in zone 'ZONE_NAME'

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 di disponibilità di Compute Engine per verificare se zone specifiche supportano hardware specifico. Scegli un altro La regione o la zona Google Cloud per i tuoi nodi che potrebbe avere la disponibilità dell'hardware di cui hai bisogno.
  • Crea il pool di nodi con tipi di macchine 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 della capacità di Compute Engine per prenotare le risorse in anticipo.
  • Utilizza il provisioning secondo il criterio del massimo impegno, descritto nella sezione seguente, per creare correttamente il pool di nodi se è possibile eseguire il provisioning di almeno un numero minimo di nodi specificato rispetto al numero richiesto.

Provisioning "best effort"

Per alcuni hardware, puoi utilizzare il provisioning secondo il criterio del massimo impegno, che consente 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 richiesta nel tempo. Per indicare a GKE di utilizzare il provisioning secondo il criterio del massimo impegno, 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 Compute Engine per i nodi. Queste zone devono supportare l'hardware selezionato.
  • MACHINE_TYPE: la macchina Compute Engine per i nodi. Ad esempio, a2-highgpu-1g.
  • MINIMUM_NODES: il numero minimo di nodi per GKE il provisioning e la creazione del pool di nodi. Se omesso, il valore predefinito è 1.

Ad esempio, considera uno scenario in cui hai bisogno di 10 nodi con GPU NVIDIA A100 da 40 GB in us-central1-c. In base alle tabella di disponibilità per regioni e zone GPU, questa zona supporta le GPU A100. Per evitare errori di creazione del pool di nodi se 10 GPU perché non sono disponibili, utilizzerai il provisioning "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 us-central1-c. Nel tempo, GKE tenta di eseguire il provisioning di più nodi fino a quando non ci saranno 10 nodi nel pool di nodi.

Errore: l'istanza non contiene "instance-template" metadati

Potresti visualizzare il seguente errore come stato di un pool di nodi che non riesce a eseguire l'upgrade, la scalabilità o la riparazione automatica dei nodi:

Instance INSTANCE_NAME does not contain 'instance-template' metadata

Questo errore indica che i metadati delle istanze VM, allocate da GKE, sono stati danneggiati. Questo accade in genere quando automazioni o script creati personalizzati tentano di aggiungere nuovi metadati dell'istanza (ad esempio block-project-ssh-keys) e, anziché aggiungere o aggiornare semplicemente i valori, eliminano anche i metadati esistenti. Puoi leggere informazioni sui metadati delle istanze VM in Impostazione di metadati personalizzati.

Nel caso di uno qualsiasi dei valori critici dei metadati (tra gli altri: instance-template, kube-labels, kubelet-config, kubeconfig, cluster-name, configure-sh, cluster-uid) sono stati eliminati. Il nodo o l'intero pool di nodi potrebbe eseguire il rendering stesso instabile perché questi valori sono fondamentali per GKE operazioni aziendali.

Se i metadati dell'istanza sono stati danneggiati, ti consigliamo di recuperarli ricreando il pool di nodi contenente le istanze VM danneggiate. Dovrai aggiungere un pool di nodi al tuo cluster e aumentare il numero di nodi nel nuovo pool, contrassegnando come non pianificabili e rimuovendo i nodi in un altro. Consulta le istruzioni per eseguire la migrazione dei carichi di lavoro tra nodi piscine.

Per sapere chi e quando sono stati modificati i metadati dell'istanza, puoi esaminare le informazioni di registrazione degli audit di Compute Engine o trovare i log utilizzando Esplora log con una query di ricerca simile alla seguente:

resource.type="gce_instance_group_manager"
protoPayload.methodName="v1.compute.instanceGroupManagers.setInstanceTemplate"

Nei log puoi trovare l'indirizzo IP del mittente della richiesta e lo user agent. Per esempio:

requestMetadata: {
  callerIp: "REDACTED"
  callerSuppliedUserAgent: "google-api-go-client/0.5 GoogleContainerEngine/v1"
}

Esegui la 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 in un altro pool di nodi. Se si desidera modificare gli attributi della macchina dei nodi in del tuo pool di nodi, consulta Scalabilità verticale modificando la macchina nodo attributi.

Scopri come eseguire la migrazione dei pod in un nuovo pool di nodi

Per eseguire la migrazione dei pod in un nuovo pool di nodi, devi eseguire i seguenti passaggi:

  1. Contrassegna i nodi nel pool di nodi esistente:questa operazione contrassegna nodi nel pool di nodi esistente come non pianificabili. Quando li contrassegni come non pianificabili, Kubernetes smette di pianificare nuovi pod in questi nodi.

  2. Svuota i nodi del 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, eseguiti singolarmente per ogni nodo, fanno in modo che i pod in esecuzione nel pool di nodi esistente vengano terminati in modo corretto. Kubernetes le riprogramma ad altri nodi disponibili.

Per assicurarti che Kubernetes termini le tue applicazioni in modo corretto, i container devono gestire l'indicatore SIGTERM. Utilizza questo approccio per chiudere le connessioni attive ai client e eseguire il commit o il rollback delle transazioni di database in modo pulito. Nel manifest del pod, puoi utilizzare il campo spec.terminationGracePeriodSeconds per specificare per quanto tempo Kubernetes attendere prima di arrestare i container nel pod. Il valore predefinito è 30 secondi. Puoi scoprire di più sui pod recesso nella documentazione di Kubernetes.

Puoi contrassegnare come non pianificabili e svuotare i nodi utilizzando kubectl cordon e kubectl drain tramite comandi SQL.

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 di nodi esistente:

  1. Aggiungi un pool di nodi al tuo in un cluster Kubernetes.

    Verifica che il nuovo pool di nodi venga creato eseguendo questo comando:

    gcloud container node-pools list --cluster CLUSTER_NAME
    
  2. Esegui il seguente comando per vedere su quale nodo sono in esecuzione i pod (vedi la colonna NODE):

    kubectl get pods -o=wide
    
  3. 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
    
  4. Esegui il comando kubectl cordon NODE (sostituendo NODE con i nomi del comando precedente). Il seguente comando shell esegue l'iterazione di ciascun nodo 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
    
  5. Facoltativamente, aggiorna i carichi di lavoro in esecuzione sul pool di nodi esistente per aggiungere una nodeSelector per l'etichetta cloud.google.com/gke-nodepool:NEW_NODE_POOL_NAME, dove NEW_NODE_POOL_NAME è il nome del un nuovo pool di nodi. In questo modo, GKE posiziona questi carichi di lavoro sui nodi del nuovo pool di nodi.

  6. Scarica ogni nodo espellendo i pod con un periodo di arresto controllato 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 periodo di tempo necessario per la risoluzione controllata.

  7. Esegui il seguente comando per verificare che i nodi nel pool di nodi esistente abbiano lo stato SchedulingDisabled nell'elenco dei nodi:

    kubectl get nodes
    

    Inoltre, dovresti vedere che i pod sono ora in esecuzione sui nodi del nuovo pool di nodi:

    kubectl get pods -o=wide
    
  8. Elimina il pool di nodi esistente se non ti serve più:

    gcloud container node-pools delete default-pool --cluster CLUSTER_NAME
    

Passaggi successivi

Se hai bisogno di ulteriore assistenza, contatta Assistenza clienti Google Cloud.