Resolução de problemas de métricas do sistema

Esta página mostra como resolver problemas relacionados com métricas do sistema nos seus clusters do Google Kubernetes Engine (GKE).

As métricas do seu cluster não aparecem no Cloud Monitoring

Certifique-se de que ativou a API Monitoring e a API Logging no seu projeto. Também deve confirmar que consegue ver o seu projeto na vista geral do Cloud Monitoring na Google Cloud consola.

Se o problema persistir, verifique as seguintes potenciais causas:

  • Ativou a monitorização no seu cluster?

    A monitorização está ativada por predefinição para clusters criados a partir da Google Cloud consola e da CLI Google Cloud, mas pode verificar clicando nos detalhes do cluster na Google Cloud consola executando o seguinte comando:

    gcloud container clusters describe CLUSTER_NAME
    

    O resultado deste comando deve incluir SYSTEM_COMPONENTS na lista de enableComponents na secção monitoringConfig, semelhante ao seguinte exemplo:

    monitoringConfig:
      componentConfig:
        enableComponents:
        - SYSTEM_COMPONENTS
    

    Se a monitorização não estiver ativada, execute o seguinte comando para a ativar:

    gcloud container clusters update CLUSTER_NAME --monitoring=SYSTEM
    
  • Há quanto tempo é que o seu cluster foi criado ou tem a monitorização ativada?

    As métricas de um novo cluster podem demorar até uma hora a começar a ser apresentadas no Cloud Monitoring.

  • Um heapster ou um gke-metrics-agent (o OpenTelemetry Collector) está a ser executado no seu cluster no espaço de nomes kube-system?

    Este pod pode não estar a conseguir agendar cargas de trabalho porque o seu cluster tem poucos recursos. Verifique se o Heapster ou o OpenTelemetry está a ser executado executando kubectl get pods --namespace=kube-system e verificando se existem pods com heapster ou gke-metrics-agent no nome.

  • O painel de controlo do cluster consegue comunicar com os nós?

    O Cloud Monitoring depende dessa comunicação. Pode verificar se o plano de controlo está a comunicar com os nós executando o seguinte comando:

    kubectl logs POD_NAME
    

    Se este comando devolver um erro, os túneis SSH podem estar a causar o problema. Para ver os passos de resolução de problemas, consulte o artigo Resolva problemas de SSH.

Identifique e corrija problemas de autorizações para escrever métricas

O GKE usa contas de serviço da IAM anexadas aos seus nós para executar tarefas do sistema, como registo e monitorização. No mínimo, estas contas de serviço de nós têm de ter a função Conta de serviço de nós predefinida do Kubernetes Engine (roles/container.defaultNodeServiceAccount) no seu projeto. Por predefinição, o GKE usa a conta de serviço predefinida do Compute Engine, que é criada automaticamente no seu projeto, como a conta de serviço do nó.

Se a sua organização aplicar a restrição da política da organização iam.automaticIamGrantsForDefaultServiceAccounts, a conta de serviço do Compute Engine predefinida no seu projeto pode não receber automaticamente as autorizações necessárias para o GKE.

  • Para identificar o problema, verifique se existem erros 401 na carga de trabalho de monitorização do sistema no seu 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 o resultado for true, significa que a carga de trabalho do sistema está a ter erros 401, o que indica uma falta de autorizações. Se o resultado for false, ignore os restantes passos e experimente um procedimento de resolução de problemas diferente.

Para conceder a função roles/container.defaultNodeServiceAccount à conta de serviço predefinida do Compute Engine, conclua os passos seguintes:

consola

  1. Aceda à página Boas-vindas:

    Aceder a Boas-vindas

  2. No campo Número do projeto, clique em Copiar para a área de transferência.
  3. Aceda à página IAM:

    Aceda ao IAM

  4. Clique em Conceder acesso.
  5. No campo Novos responsáveis, especifique o seguinte valor:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    Substitua PROJECT_NUMBER pelo número do projeto que copiou.
  6. No menu Selecionar uma função, selecione a função Conta de serviço do nó predefinido do Kubernetes Engine.
  7. Clique em Guardar.

gcloud

  1. Encontre o seu Google Cloud número do projeto:
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    Substitua PROJECT_ID pelo ID do seu projeto.

    O resultado é semelhante ao seguinte:

    12345678901
    
  2. Conceda a função roles/container.defaultNodeServiceAccount à conta de serviço predefinida do Compute Engine:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    Substitua PROJECT_NUMBER pelo número do projeto do passo anterior.

Confirme se o agente de métricas tem memória suficiente

Se tiver tentado os passos de resolução de problemas anteriores e as métricas continuarem a não ser apresentadas, o agente de métricas pode ter memória insuficiente.

Na maioria dos casos, a atribuição predefinida de recursos ao agente de métricas do GKE é suficiente. No entanto, se o DaemonSet falhar repetidamente, pode verificar o motivo do encerramento com as seguintes instruções:

  1. Obtenha os nomes dos pods do agente de métricas do GKE:

    kubectl get pods -n kube-system -l component=gke-metrics-agent
    
  2. Encontre o pod com o estado CrashLoopBackOff.

    O resultado é semelhante ao seguinte:

    NAME                    READY STATUS           RESTARTS AGE
    gke-metrics-agent-5857x 0/1   CrashLoopBackOff 6        12m
    
  3. Descreva o pod que tem o estado CrashLoopBackOff:

    kubectl describe pod POD_NAME -n kube-system
    

    Substitua POD_NAME pelo nome do Pod do passo anterior.

    Se o motivo do encerramento do Pod for OOMKilled, o agente precisa de memória adicional.

    O resultado é semelhante ao seguinte:

      containerStatuses:
      ...
      lastState:
        terminated:
          ...
          exitCode: 1
          finishedAt: "2021-11-22T23:36:32Z"
          reason: OOMKilled
          startedAt: "2021-11-22T23:35:54Z"
    
  4. Adicione uma etiqueta de nó ao nó com o agente de métricas com falhas. Pode usar uma etiqueta de nó persistente ou temporária. Recomendamos que tente adicionar mais 20 MB. Se o agente continuar a falhar, pode executar este comando novamente, substituindo a etiqueta do nó por uma que peça uma quantidade superior de memória adicional.

    Para atualizar um node pool com uma etiqueta persistente, execute o seguinte comando:

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

    Substitua o seguinte:

    • NODEPOOL_NAME: o nome do node pool.
    • CLUSTER_NAME: o nome do cluster existente.
    • ADDITIONAL_MEMORY_NODE_LABEL: uma das etiquetas de nós de memória adicionais; use um dos seguintes valores:
      • Para adicionar 10 MB: cloud.google.com/gke-metrics-agent-scaling-level=10
      • Para adicionar 20 MB: cloud.google.com/gke-metrics-agent-scaling-level=20
      • Para adicionar 50 MB: cloud.google.com/gke-metrics-agent-scaling-level=50
      • Para adicionar 100 MB: cloud.google.com/gke-metrics-agent-scaling-level=100
      • Para adicionar 200 MB: cloud.google.com/gke-metrics-agent-scaling-level=200
      • Para adicionar 500 MB: cloud.google.com/gke-metrics-agent-scaling-level=500
    • COMPUTE_LOCATION: a localização do Compute Engine do cluster.

    Em alternativa, pode adicionar uma etiqueta de nó temporária que não persista após uma atualização através do seguinte comando:

    kubectl label node/NODE_NAME \
    ADDITIONAL_MEMORY_NODE_LABEL --overwrite
    

    Substitua o seguinte:

    • NODE_NAME: o nome do nó do agente de métricas afetado.
    • ADDITIONAL_MEMORY_NODE_LABEL: uma das etiquetas de nós de memória adicionais; use um dos valores do exemplo anterior.

O que se segue?