Risolvere i problemi di scale up del gestore della scalabilità automatica dei cluster


Questa pagina mostra come scoprire e risolvere i problemi relativi al fatto che Cluster Autoscaler non esegue lo scale up dei nodi nei cluster Google Kubernetes Engine (GKE).

Questa pagina è rivolta agli sviluppatori di applicazioni che vogliono risolvere una situazione imprevista o negativa con la propria app o il proprio servizio e agli amministratori e agli operatori della piattaforma che vogliono evitare interruzioni nella fornitura di prodotti e servizi.

Informazioni su quando il gestore della scalabilità automatica dei cluster esegue lo scale up dei nodi

Prima di procedere con i passaggi per la risoluzione dei problemi, può essere utile capire quando il gestore della scalabilità automatica del cluster tenta di scalare i nodi. Il gestore della scalabilità automatica del cluster aggiunge nodi solo quando le risorse esistenti non sono sufficienti.

Ogni 10 secondi, il gestore della scalabilità automatica del cluster controlla se sono presenti pod non pianificabili. Un pod non è pianificabile quando lo scheduler Kubernetes non può inserirlo in nessun nodo esistente a causa di risorse insufficienti, vincoli dei nodi o requisiti del pod non soddisfatti.

Quando il gestore della scalabilità automatica del cluster trova pod non pianificabili, valuta se l'aggiunta di un nodo consentirebbe la pianificazione del pod. Se l'aggiunta di un nodo consente la pianificazione di un pod, il gestore della scalabilità automatica del cluster aggiunge un nuovo nodo al gruppo di istanze gestite (MIG). Lo scheduler Kubernetes può quindi pianificare il pod sul nodo appena provisionato.

Controlla se hai pod non pianificabili

Per determinare se è necessario eseguire lo scale up del cluster, controlla i pod non pianificati:

  1. Nella console Google Cloud , vai alla pagina Workload.

    Vai a Carichi di lavoro

  2. Nel campo Filtro, inserisci unschedulable e premi Invio.

    Se sono elencati pod, significa che hai pod non pianificabili. Per risolvere i problemi relativi ai pod non pianificabili, consulta Errore: pod non pianificabile. La risoluzione della causa sottostante dei pod non pianificabili spesso consente al gestore della scalabilità automatica del cluster di eseguire lo scale up. Per identificare e risolvere gli errori specifici del gestore della scalabilità automatica del cluster, esplora le seguenti sezioni.

    Se non sono elencati pod, il gestore della scalabilità automatica del cluster non deve eseguire lo scale up e funziona come previsto.

Controllare se in precedenza avevi pod non pianificabili

Se stai esaminando la causa del precedente errore del gestore della scalabilità automatica del cluster, controlla i pod non pianificabili in precedenza:

  1. Nella console Google Cloud , vai alla pagina Esplora log.

    Vai a Esplora log

  2. Specifica un intervallo di tempo per le voci di log che vuoi visualizzare.

  3. Nel riquadro della query, inserisci la seguente query:

    logName="projects/PROJECT_ID/logs/events"
    jsonPayload.source.component="default-scheduler"
    jsonPayload.reason="FailedScheduling"
    

    Sostituisci PROJECT_ID con l'ID progetto.

  4. Fai clic su Esegui query.

    Se sono elencati risultati, significa che avevi pod non pianificabili nell'intervallo di tempo specificato.

Controllare se il problema è causato da una limitazione

Dopo aver verificato di avere pod non pianificati, assicurati che il problema con il gestore della scalabilità automatica dei cluster non sia causato da una delle limitazioni del gestore della scalabilità automatica dei cluster.

Visualizza errori

Spesso puoi diagnosticare la causa dei problemi di scalabilità visualizzando i messaggi di errore:

Visualizzare gli errori nelle notifiche

Se il problema che hai osservato si è verificato meno di 72 ore fa, visualizza le notifiche relative agli errori nella Google Cloud console. Queste notifiche forniscono informazioni preziose sui motivi per cui il gestore della scalabilità automatica dei cluster non ha eseguito lo scale up e offrono consigli su come risolvere l'errore e visualizzare i log pertinenti per ulteriori indagini.

Per visualizzare le notifiche nella console Google Cloud , completa i seguenti passaggi:

  1. Nella console Google Cloud , vai alla pagina Cluster Kubernetes.

    Vai ai cluster Kubernetes

  2. Controlla la colonna Notifiche. Le seguenti notifiche sono associate ai problemi di scalabilità:

    • Can't scale up
    • Can't scale up pods
    • Can't scale up a node pool
  3. Fai clic sulla notifica pertinente per visualizzare un riquadro con i dettagli sulla causa del problema e le azioni consigliate per risolverlo.

  4. (Facoltativo) Per visualizzare i log di questo evento, fai clic su Log. Questa azione ti reindirizza a Esplora log con una query precompilata per aiutarti a esaminare ulteriormente l'evento di scalabilità. Per saperne di più sul funzionamento degli eventi di scalabilità verticale, consulta Visualizzare gli eventi del gestore della scalabilità automatica del cluster.

Se i problemi persistono dopo aver esaminato i consigli riportati nella notifica, consulta le tabelle dei messaggi di errore per ulteriore assistenza.

Visualizzare gli errori negli eventi

Se il problema che hai osservato si è verificato più di 72 ore fa, visualizza gli eventi in Cloud Logging. Quando si verifica un errore, spesso viene registrato in un evento.

Per visualizzare i log del gestore della scalabilità automatica dei cluster nella console Google Cloud , completa i seguenti passaggi:

  1. Nella console Google Cloud , vai alla pagina Cluster Kubernetes.

    Vai ai cluster Kubernetes

  2. Seleziona il nome del cluster che vuoi esaminare per visualizzare la pagina Dettagli cluster.

  3. Nella pagina Dettagli cluster, fai clic sulla scheda Log.

  4. Nella scheda Log, fai clic sulla scheda Log di scalabilità automatica per visualizzare i log.

  5. (Facoltativo) Per applicare filtri più avanzati per restringere i risultati, fai clic sul pulsante con la freccia sul lato destro della pagina per visualizzare i log in Esplora log.

Per scoprire di più sul funzionamento degli eventi di scalabilità verticale, consulta Visualizzare gli eventi di scalabilità automatica del cluster. Per un esempio di come utilizzare Cloud Logging, consulta il seguente esempio di risoluzione dei problemi.

Esempio: risoluzione di un problema risalente a più di 72 ore prima

L'esempio seguente mostra come potresti esaminare e risolvere un problema con un cluster che non viene scalato.

Scenario: nell'ultima ora, un pod è stato contrassegnato come non pianificabile. Il gestore della scalabilità automatica del cluster non ha eseguito il provisioning di nuovi nodi per pianificare il pod.

Soluzione:

  1. Poiché il problema si è verificato più di 72 ore fa, lo esamini utilizzando Cloud Logging anziché esaminare i messaggi di notifica.
  2. In Cloud Logging, trovi i dettagli di logging per gli eventi del gestore della scalabilità automatica del cluster, come descritto in Visualizzare gli errori negli eventi.
  3. Cerca gli eventi scaleUp che contengono il pod che stai esaminando nel campo triggeringPods. Puoi filtrare le voci di log, incluso il filtro in base a un particolare valore del campo JSON. Scopri di più nelle query avanzate dei log.

  4. Non trovi eventi di scale up. Se lo hai fatto, puoi provare a trovare un EventResult che contenga lo stesso eventId dell'evento scaleUp. A questo punto, puoi esaminare il campo errorMsg e consultare l'elenco dei possibili messaggi di errore di scaleUp.

  5. Poiché non hai trovato eventi scaleUp, continui a cercare eventi noScaleUp ed esamina i seguenti campi:

    • unhandledPodGroups: contiene informazioni sul pod (o sul controller del pod).
    • reason: fornisce motivi globali che indicano che lo scale up potrebbe essere bloccato.
    • skippedMigs: fornisce i motivi per cui alcuni MIG potrebbero essere ignorati.
  6. Trovi un evento noScaleUp per il tuo pod e tutti i MIG nel campo rejectedMigs hanno lo stesso ID messaggio di motivo "no.scale.up.mig.failing.predicate" con due parametri: "NodeAffinity" e "node(s) did not match node selector".

Risoluzione:

Dopo aver consultato l'elenco dei messaggi di errore, scopri che il gestore della scalabilità automatica dei cluster non può fare lo scale up di unpool di nodil a causa di un predicato di pianificazione non riuscito per i pod in attesa. I parametri sono il nome del predicato non riuscito e il motivo per cui non è riuscito.

Per risolvere il problema, esamini il manifest del pod e scopri che ha un selettore di nodi che non corrisponde a nessun MIG nel cluster. Elimina il selettore dal manifest del pod e ricrea il pod. Il gestore della scalabilità automatica del cluster aggiunge un nuovo nodo e il pod viene pianificato.

Risolvere gli errori di scalabilità verticale

Dopo aver identificato l'errore, utilizza le tabelle seguenti per capire la causa dell'errore e come risolverlo.

Errori di ScaleUp

Puoi trovare i messaggi di errore degli eventi per gli eventi scaleUp nell'evento eventResult corrispondente, nel campo resultInfo.results[].errorMsg.

Messaggio Dettagli Parametri Attenuazione
"scale.up.error.out.of.resources" Gli errori delle risorse si verificano quando provi a richiedere nuove risorse in una zona che non può soddisfare la tua richiesta a causa dell'attuale indisponibilità di una risorsa di Compute Engine, ad esempio GPU o CPU. ID MIG non riusciti. Segui la procedura di risoluzione dei problemi di disponibilità delle risorse nella documentazione di Compute Engine.
"scale.up.error.quota.exceeded" L'evento scaleUp non è riuscito perché non è stato possibile aumentare alcuni MIG a causa del superamento della quota di Compute Engine. ID MIG non riusciti. Controlla la scheda Errori del MIG nella console Google Cloud per vedere quale quota viene superata. Dopo aver identificato la quota superata, segui le istruzioni per richiedere un aumento della quota.
"scale.up.error.waiting.for.instances.timeout" Lo scale up del gruppo di istanze gestite non è riuscito a causa del timeout. ID MIG non riusciti. Questo messaggio deve essere temporaneo. Se il problema persiste, contatta l'assistenza clienti Google Cloud per ulteriori indagini.
"scale.up.error.ip.space.exhausted" Impossibile fare lo scale up perché le istanze in alcuni gruppi di istanze gestite hanno esaurito gli indirizzi IP. Ciò significa che il cluster non dispone di spazio di indirizzi IP non allocati sufficiente per aggiungere nuovi nodi o pod. ID MIG non riusciti. Segui la procedura di risoluzione dei problemi descritta in Spazio di indirizzi IP liberi insufficiente per i pod.
"scale.up.error.service.account.deleted" Impossibile fare lo scale up perché l'account di servizio è stato eliminato. ID MIG non riusciti. Prova ad annullare l'eliminazione del service account. Se la procedura non va a buon fine, contatta l'assistenza clienti Google Cloud per ulteriori indagini.

Motivi di un evento noScaleUp

Un evento noScaleUp viene emesso periodicamente quando nel cluster sono presenti pod non pianificabili e il gestore della scalabilità automatica dei cluster non può scalare il cluster per pianificare i pod. Gli eventi noScaleUp sono soggetti a determinate condizioni e non coprono tutti i casi possibili.

Motivi di primo livello di NoScaleUp

I messaggi relativi al motivo principale per gli eventi noScaleUp vengono visualizzati nel campo noDecisionStatus.noScaleUp.reason. Il messaggio contiene un motivo di primo livello per cui il gestore della scalabilità automatica dei cluster non può scalare il cluster.

Messaggio Dettagli Attenuazione
"no.scale.up.in.backoff" Non è stato fatto lo scale up perché è in un periodo di backoff (temporaneamente bloccato). Questo messaggio può verificarsi durante gli eventi di scalabilità verticale con un numero elevato di pod. Questo messaggio deve essere temporaneo. Controlla questo errore dopo qualche minuto. Se questo messaggio persiste, contatta l'assistenza clienti Google Cloud per ulteriori indagini.

Motivi del provisioning automatico dei nodi di primo livello NoScaleUp

I messaggi relativi al motivo del provisioning automatico dei nodi di primo livello per gli eventi noScaleUp vengono visualizzati nel campo noDecisionStatus.noScaleUp.napFailureReason. Il messaggio contiene un motivo di primo livello per cui il gestore della scalabilità automatica dei cluster non può eseguire il provisioning di nuovi pool di nodi.

Messaggio Dettagli Attenuazione
"no.scale.up.nap.disabled"

Il provisioning automatico dei nodi non è stato in grado di eseguire lo scale up perché non è abilitato a livello di cluster.

Se il provisioning automatico dei nodi è disabilitato, i nuovi nodi non verranno sottoposti automaticamente a provisioning se il pod in attesa contiene requisiti che non possono essere soddisfatti dai node pool esistenti.

Rivedi la configurazione del cluster e valuta la possibilità di attivare il provisioning automatico dei nodi.

Motivi a livello di MIG NoScaleUp

I messaggi relativi al motivo a livello di MIG per gli eventi noScaleUp vengono visualizzati nei campi noDecisionStatus.noScaleUp.skippedMigs[].reason e noDecisionStatus.noScaleUp.unhandledPodGroups[].rejectedMigs[].reason. Il messaggio contiene un motivo per cui il gestore della scalabilità automatica dei cluster non può aumentare le dimensioni di un determinato MIG.

Messaggio Dettagli Parametri Attenuazione
"no.scale.up.mig.skipped" Impossibile fare lo scale up di un MIG perché è stato ignorato durante la simulazione. Motivi per cui il MIG è stato ignorato (ad esempio, perché non soddisfa un requisito del pod). Esamina i parametri inclusi nel messaggio di errore e spiega perché il MIG è stato ignorato.
"no.scale.up.mig.failing.predicate" Impossibile fare lo scale up di un pool di nodi a causa di un predicato di pianificazione non riuscito per i pod in attesa. Nome del predicato non riuscito e motivi per cui non è riuscito. Rivedi i requisiti del pod, ad esempio regole di affinità, incompatibilità o tolleranze e requisiti delle risorse.

Motivi per cui il provisioning automatico dei nodi a livello di gruppo di pod NoScaleUp non è stato eseguito

I messaggi relativi al motivo del provisioning automatico dei nodi a livello di gruppo di pod per gli eventi noScaleUp vengono visualizzati nel campo noDecisionStatus.noScaleUp.unhandledPodGroups[].napFailureReasons[]. Il messaggio contiene un motivo per cui il gestore della scalabilità automatica dei cluster non può eseguire il provisioning di un nuovo node pool per pianificare un determinato gruppo di pod.

Messaggio Dettagli Parametri Attenuazione
"no.scale.up.nap.pod.gpu.no.limit.defined" Il provisioning automatico dei nodi non è riuscito a eseguire il provisioning di alcun gruppo di nodi perché un pod in attesa ha una richiesta GPU, ma i limiti delle risorse GPU non sono definiti a livello di cluster. Tipo di GPU richiesto. Rivedi la richiesta GPU del pod in attesa e aggiorna la configurazione del provisioning automatico dei nodi a livello di cluster per i limiti di GPU.
"no.scale.up.nap.pod.gpu.type.not.supported" Il provisioning automatico dei nodi non ha eseguito il provisioning di alcun gruppo di nodi per il pod perché contiene richieste per un tipo di GPU sconosciuto. Tipo di GPU richiesto. Controlla la configurazione del pod in attesa per il tipo di GPU per assicurarti che corrisponda a un tipo di GPU supportato.
"no.scale.up.nap.pod.zonal.resources.exceeded" Il provisioning automatico dei nodi non ha eseguito il provisioning di alcun gruppo di nodi per il pod in questa zona perché così facendo violerebbe i limiti massimi di risorse a livello di cluster, supererebbe le risorse disponibili nella zona o non esiste un tipo di macchina che possa soddisfare la richiesta. Nome della zona presa in considerazione. Rivedi e aggiorna i limiti massimi delle risorse a livello di cluster, le richieste di risorse dei pod o le zone disponibili per il provisioning automatico dei nodi.
"no.scale.up.nap.pod.zonal.failing.predicates" Il provisioning automatico dei nodi non ha eseguito il provisioning di alcun gruppo di nodi per il pod in questa zona a causa di predicati non funzionanti. Nome della zona considerata e motivi per cui i predicati non sono riusciti. Rivedi i requisiti del pod in attesa, ad esempio regole di affinità, incompatibilità, tolleranze o requisiti delle risorse.

Esegui ulteriori accertamenti

Le sezioni che seguono forniscono indicazioni su come utilizzare Esplora log e gcpdiag per ottenere ulteriori informazioni sugli errori.

Esaminare gli errori in Esplora log

Se vuoi esaminare ulteriormente il messaggio di errore, visualizza i log specifici dell'errore:

  1. Nella console Google Cloud , vai alla pagina Esplora log.

    Vai a Esplora log

  2. Nel riquadro query, inserisci la seguente query:

    resource.type="k8s_cluster"
    log_id("container.googleapis.com/cluster-autoscaler-visibility")
    jsonPayload.resultInfo.results.errorMsg.messageId="ERROR_MESSAGE"
    

    Sostituisci ERROR_MESSAGE con il messaggio che vuoi esaminare. Ad esempio, scale.up.error.out.of.resources.

  3. Fai clic su Esegui query.

Eseguire il debug di alcuni errori con gcpdiag

gcpdiag è uno strumento open source creato con il supporto di ingegneri tecnici di Google Cloud. Non è un prodotto Google Cloud supportato ufficialmente.

Se hai riscontrato uno dei seguenti messaggi di errore, puoi utilizzare gcpdiag per risolvere il problema:

  • scale.up.error.out.of.resources
  • scale.up.error.quota.exceeded
  • scale.up.error.waiting.for.instances.timeout
  • scale.up.error.ip.space.exhausted
  • scale.up.error.service.account.deleted

Per un elenco e una descrizione di tutti i flag dello strumento gcpdiag, consulta le istruzioni per l'utilizzo di gcpdiag.

Risolvere errori di scalabilità complessi

Le sezioni seguenti forniscono indicazioni sulla risoluzione degli errori in cui le mitigazioni comportano più passaggi e degli errori a cui non è associato un messaggio di evento del gestore della scalabilità automatica del cluster.

Problema: il pod non si adatta al nodo

Il gestore della scalabilità automatica dei cluster pianifica un pod su un nodo solo se esiste un nodo con risorse sufficienti, come GPU, memoria e spazio di archiviazione, per soddisfare i requisiti del pod. Per determinare se questo è il motivo per cui il gestore della scalabilità automatica dei cluster non ha eseguito lo scale up, confronta le richieste di risorse con le risorse fornite.

L'esempio seguente mostra come controllare le risorse CPU, ma gli stessi passaggi sono applicabili a GPU, memoria e risorse di archiviazione. Per confrontare le richieste di CPU con le CPU di cui è stato eseguito il provisioning, completa i seguenti passaggi:

  1. Nella console Google Cloud , vai alla pagina Workload.

    Vai a Carichi di lavoro

  2. Fai clic sul messaggio di errore PodUnschedulable.

  3. Nel riquadro Dettagli, fai clic sul nome del pod. Se sono presenti più pod, inizia dal primo e ripeti la seguente procedura per ciascun pod.

  4. Nella pagina Dettagli pod, vai alla scheda Eventi.

  5. Dalla scheda Eventi, vai alla scheda YAML.

  6. Prendi nota delle richieste di risorse di ogni container nel pod per trovare il totale delle richieste di risorse. Ad esempio, nella seguente configurazione del pod, il pod ha bisogno di 2 vCPU:

    resources:
      limits:
        cpu: "3"
     requests:
        cpu: "2"
    
  7. Visualizza i dettagli pool di nodi dal cluster con il pod non pianificato:

    1. Nella console Google Cloud , vai alla pagina Cluster Kubernetes.

      Vai ai cluster Kubernetes

    2. Fai clic sul nome del cluster che contiene il messaggio di errore Pods unschedulable.

    3. Nella pagina Dettagli cluster, vai alla scheda Nodi.

  8. Nella sezione Pool di nodi, prendi nota del valore nella colonna Tipo di macchina. Ad esempio: n1-standard-1.

  9. Confronta la richiesta di risorse con le vCPU fornite dal tipo di macchina. Ad esempio, se un pod richiede 2 vCPU, ma i nodi disponibili hanno il tipo di macchina n1-standard-1, i nodi avrebbero solo 1 vCPU. Con una configurazione come questa, lo strumento di scalabilità automatica del cluster non attiverebbe lo scale up perché, anche se aggiungesse un nuovo nodo, questo pod non potrebbe essere inserito. Se vuoi scoprire di più sui tipi di macchine disponibili, consulta la guida e la risorsa Confronto delle famiglie di macchine nella documentazione di Compute Engine.

Tieni inoltre presente che le risorse allocabili di un nodo sono inferiori alle risorse totali, in quanto una parte è necessaria per eseguire i componenti di sistema. Per scoprire di più su come viene calcolato, consulta Risorse allocabili dei nodi.

Per risolvere il problema, decidi se le richieste di risorse definite per il carico di lavoro sono adatte alle tue esigenze. Se il tipo di macchina non deve essere modificato, crea un pool di nodi con un tipo di macchina che possa supportare la richiesta proveniente dal pod. Se le richieste di risorse del pod non sono accurate, aggiorna la definizione del pod in modo che i pod possano essere inseriti nei nodi.

Problema: cluster non integri che impediscono lo scale up

Il gestore della scalabilità automatica dei cluster potrebbe non eseguire lo scale up se considera un cluster non integro. L'integrità del cluster non si basa sull'integrità del piano di controllo, ma sul rapporto tra nodi integri e pronti. Se il 45% dei nodi di un cluster non è integro o non è pronto, il gestore della scalabilità automatica del cluster interrompe tutte le operazioni.

Se questo è il motivo per cui il gestore della scalabilità automatica dei cluster non esegue lo scale up, nella ConfigMap del gestore della scalabilità automatica dei cluster è presente un evento di tipo Warning con ClusterUnhealthy elencato come motivo.

Per visualizzare ConfigMap, esegui questo comando:

kubectl describe configmap cluster-autoscaler-status -n kube-system

Per risolvere il problema, riduci il numero di nodi non integri.

È anche possibile che alcuni nodi siano pronti, anche se non considerati tali dal gestore della scalabilità automatica dei cluster. Ciò si verifica quando su un nodo è presente un taint con il prefisso ignore-taint.cluster-autoscaler.kubernetes.io/. Il gestore della scalabilità automatica dei cluster considera un nodo come NotReady finché è presente questo taint.

Se il comportamento è causato dalla presenza di ignore-taint.cluster-autoscaler.kubernetes.io/.* taint, rimuovilo.

Passaggi successivi