Risolvere i problemi relativi alle metriche di sistema


Questa pagina mostra come risolvere i problemi relativi alle metriche di sistema nei cluster Google Kubernetes Engine (GKE).

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

Le metriche del cluster non vengono visualizzate in Cloud Monitoring

Assicurati di aver abilitato l'API Monitoring e l'API Logging nel tuo progetto. Devi anche verificare di poter visualizzare il progetto nella panoramica di Cloud Monitoring nella consoleGoogle Cloud .

Se il problema persiste, controlla le seguenti potenziali cause:

  • Hai attivato il monitoraggio nel tuo cluster?

    Il monitoraggio è abilitato per impostazione predefinita per i cluster creati dalla console Google Cloud e da Google Cloud CLI, ma puoi verificarlo facendo clic sui dettagli del cluster nella console Google Cloud eseguendo il seguente comando:

    gcloud container clusters describe CLUSTER_NAME
    

    L'output di questo comando deve includere SYSTEM_COMPONENTS nell'elenco di enableComponents nella sezione monitoringConfig, in modo simile all'esempio seguente:

    monitoringConfig:
      componentConfig:
        enableComponents:
        - SYSTEM_COMPONENTS
    

    Se il monitoraggio non è attivo, esegui il seguente comando per attivarlo:

    gcloud container clusters update CLUSTER_NAME --monitoring=SYSTEM
    
  • Quanto tempo è passato dalla creazione del cluster o dall'attivazione del monitoraggio?

    Potrebbero essere necessarie fino a un'ora prima che le metriche di un nuovo cluster inizino a essere visualizzate in Cloud Monitoring.

  • È in esecuzione un heapster o un gke-metrics-agent (il raccoglitore OpenTelemetry) nel tuo cluster nello spazio dei nomi kube-system?

    La pianificazione dei carichi di lavoro di questo pod potrebbe non riuscire perché le risorse del tuo cluster sono in esaurimento. Verifica se Heapster o OpenTelemetry è in esecuzione eseguendo kubectl get pods --namespace=kube-system e cercando i pod con heapster o gke-metrics-agent nel nome.

  • Il piano di controllo del cluster è in grado di comunicare con i nodi?

    Cloud Monitoring si basa su questa comunicazione. Puoi verificare se il piano di controllo comunica con i nodi eseguendo il seguente comando:

    kubectl logs POD_NAME
    

    Se questo comando restituisce un errore, il problema potrebbe essere causato dai tunnel SSH. Per la procedura di risoluzione dei problemi, consulta la sezione Risolvere i problemi relativi a SSH.

Identifica e correggi i problemi di autorizzazione per la scrittura delle metriche

GKE utilizza gli account di servizio IAM collegati ai tuoi nodi per eseguire attività di sistema come il logging e il monitoraggio. Come minimo, questi account di servizio dei nodi devono avere il ruolo Kubernetes Engine Default Node Service Account (roles/container.defaultNodeServiceAccount) nel progetto. Per impostazione predefinita, GKE utilizza l'account di servizio predefinito di Compute Engine, creato automaticamente nel progetto, come account di servizio del nodo.

Se la tua organizzazione applica il vincolo del criterio dell'organizzazione iam.automaticIamGrantsForDefaultServiceAccounts, il account di servizio Compute Engine predefinito nel progetto potrebbe non ottenere automaticamente le autorizzazioni richieste per GKE.

  • Per identificare il problema, controlla la presenza di errori 401 nel monitoraggio del sistema nel cluster:

    [[ $(kubectl logs -l k8s-app=gke-metrics-agent -n kube-system -c gke-metrics-agent | grep -cw "Received 401") -gt 0 ]] && echo "true" || echo "false"
    

    Se l'output è true, il carico di lavoro del sistema presenta errori 401, che indicano una mancanza di autorizzazioni. Se l'output è false, salta il resto di questi passaggi e prova una procedura di risoluzione dei problemi diversa.

Per concedere il ruolo roles/container.defaultNodeServiceAccount all'account di servizio predefinito di Compute Engine, completa i seguenti passaggi:

console

  1. Vai alla pagina Welcome (Ti diamo il benvenuto):

    Vai a Benvenuto

  2. Nel campo Numero progetto, fai clic su Copia negli appunti.
  3. Vai alla pagina IAM:

    Vai a IAM

  4. Fai clic su Concedi accesso.
  5. Nel campo Nuove entità, specifica il seguente valore:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    Sostituisci PROJECT_NUMBER con il numero del progetto che hai copiato.
  6. Nel menu Seleziona un ruolo, seleziona il ruolo Kubernetes Engine Default Node Service Account.
  7. Fai clic su Salva.

gcloud

  1. Trova il numero del tuo progetto Google Cloud :
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    Sostituisci PROJECT_ID con l'ID progetto.

    L'output è simile al seguente:

    12345678901
    
  2. Concedi il ruolo roles/container.defaultNodeServiceAccount all'account di servizio predefinito Compute Engine:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    Sostituisci PROJECT_NUMBER con il numero del progetto del passaggio precedente.

Verificare che l'agente delle metriche disponga di memoria sufficiente

Se hai provato i passaggi per la risoluzione dei problemi precedenti e le metriche non vengono ancora visualizzate, l'agente delle metriche potrebbe non avere memoria sufficiente.

Nella maggior parte dei casi, l'allocazione predefinita delle risorse all'agente metriche GKE è sufficiente. Tuttavia, se il DaemonSet si arresta in modo anomalo ripetutamente, puoi controllare il motivo dell'interruzione seguendo le istruzioni riportate di seguito:

  1. Recupera i nomi dei pod dell'agente delle metriche GKE:

    kubectl get pods -n kube-system -l component=gke-metrics-agent
    
  2. Trova il pod con lo stato CrashLoopBackOff.

    L'output è simile al seguente:

    NAME                    READY STATUS           RESTARTS AGE
    gke-metrics-agent-5857x 0/1   CrashLoopBackOff 6        12m
    
  3. Descrivi il pod con lo stato CrashLoopBackOff:

    kubectl describe pod POD_NAME -n kube-system
    

    Sostituisci POD_NAME con il nome del pod del passaggio precedente.

    Se il motivo dell'interruzione del pod è OOMKilled, l'agente ha bisogno di memoria aggiuntiva.

    L'output è simile al seguente:

      containerStatuses:
      ...
      lastState:
        terminated:
          ...
          exitCode: 1
          finishedAt: "2021-11-22T23:36:32Z"
          reason: OOMKilled
          startedAt: "2021-11-22T23:35:54Z"
    
  4. Aggiungi un'etichetta al nodo con l'agente delle metriche in errore. Puoi utilizzare un'etichetta del nodo permanente o temporanea. Ti consigliamo di provare ad aggiungere altri 20 MB. Se l'agente continua ad arrestarsi in modo anomalo, puoi eseguire di nuovo questo comando, sostituendo l'etichetta del nodo con una che richiede una quantità maggiore di memoria aggiuntiva.

    Per aggiornare un pool di nodi con un'etichetta permanente, esegui il comando seguente:

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --node-labels=ADDITIONAL_MEMORY_NODE_LABEL \
        --location=COMPUTE_LOCATION
    

    Sostituisci quanto segue:

    • NODEPOOL_NAME: il nome del pool di nodi.
    • CLUSTER_NAME: il nome del cluster esistente.
    • ADDITIONAL_MEMORY_NODE_LABEL: una delle etichette dei nodi di memoria aggiuntive. Utilizza uno dei seguenti valori:
      • Per aggiungere 10 MB: cloud.google.com/gke-metrics-agent-scaling-level=10
      • Per aggiungere 20 MB: cloud.google.com/gke-metrics-agent-scaling-level=20
      • Per aggiungere 50 MB: cloud.google.com/gke-metrics-agent-scaling-level=50
      • Per aggiungere 100 MB: cloud.google.com/gke-metrics-agent-scaling-level=100
      • Per aggiungere 200 MB: cloud.google.com/gke-metrics-agent-scaling-level=200
      • Per aggiungere 500 MB: cloud.google.com/gke-metrics-agent-scaling-level=500
    • COMPUTE_LOCATION: la posizione di Compute Engine del cluster.

    In alternativa, puoi aggiungere un'etichetta del nodo temporanea che non permane dopo un upgrade utilizzando il seguente comando:

    kubectl label node/NODE_NAME \
    ADDITIONAL_MEMORY_NODE_LABEL --overwrite
    

    Sostituisci quanto segue:

    • NODE_NAME: il nome del nodo dell'agente di misurazione interessato.
    • ADDITIONAL_MEMORY_NODE_LABEL: una delle etichette dei nodi di memoria aggiuntivi; utilizza uno dei valori dell'esempio precedente.

Passaggi successivi