Soluciona problemas del sistema de métricas

En esta página, se muestra cómo resolver problemas relacionados con las métricas del sistema en tus clústeres de Google Kubernetes Engine (GKE).

Las métricas del clúster no aparecen en Cloud Monitoring

Asegúrate de haber habilitado la API de Monitoring y la API de Logging en tu proyecto. También debes confirmar que puedes ver tu proyecto en la descripción general de Cloud Monitoring en la Google Cloud consola.

Si el problema persiste, verifica alguna de las posibles causas siguientes:

  • ¿Habilitaste la supervisión en tu clúster?

    La supervisión está habilitada de forma predeterminada para los clústeres creados desde la Google Cloud consola y desde Google Cloud CLI, pero puedes verificarlo si haces clic en los detalles del clúster en la Google Cloud consola o si ejecutas el siguiente comando:

    gcloud container clusters describe CLUSTER_NAME
    

    El resultado de este comando debe incluir SYSTEM_COMPONENTS en la lista de enableComponents en la sección monitoringConfig, similar al siguiente ejemplo:

    monitoringConfig:
      componentConfig:
        enableComponents:
        - SYSTEM_COMPONENTS
    

    Si la supervisión no está habilitada, ejecuta el siguiente comando para habilitarla:

    gcloud container clusters update CLUSTER_NAME --monitoring=SYSTEM
    
  • ¿Cuánto tiempo pasó desde que se creó el clúster o se habilitó la supervisión?

    Puede tomar hasta una hora para que las métricas de un clúster nuevo comiencen a aparecer Cloud Monitoring.

  • ¿Hay un heapster o gke-metrics-agent (el recopilador de OpenTelemetry) ejecutándose en el clúster en el espacio de nombres kube-system?

    Es posible que este pod no pueda programar cargas de trabajo porque tu clúster se está quedando sin recursos. Para comprobar si OpenTelemetry o Heapster están en ejecución, puedes ejecutar kubectl get pods --namespace=kube-system y verificar los Pods con heapster o gke-metrics-agent en el nombre.

  • ¿El plano de control del clúster puede comunicarse con los nodos?

    Cloud Monitoring depende de esa comunicación. Para verificar si el plano de control se comunica con los nodos, ejecuta el siguiente comando:

    kubectl logs POD_NAME
    

    Si este comando muestra un error, es posible que los túneles SSH causen el problema. Para obtener los pasos de solución de problemas, consulta Soluciona problemas de SSH.

Identifica y corrige problemas de permisos para escribir métricas

GKE usa cuentas de servicio de IAM que se adjuntan a tus nodos para ejecutar tareas del sistema, como el registro y la supervisión. Como mínimo, estas cuentas de servicio de nodo deben tener el rol de cuenta de servicio de nodo predeterminado de Kubernetes Engine (roles/container.defaultNodeServiceAccount) en tu proyecto. De forma predeterminada, GKE usa la cuenta de servicio predeterminada de Compute Engine, que se crea automáticamente en tu proyecto, como la cuenta de servicio de nodo.

Si tu organización aplica la iam.automaticIamGrantsForDefaultServiceAccounts restricción de política de la organización, es posible que la cuenta de servicio predeterminada de Compute Engine en tu proyecto no obtenga automáticamente los permisos necesarios para GKE.

  • Para identificar el problema, busca errores 401 en la carga de trabajo de supervisión del sistema en tu clúster:

    [[ $(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"
    

    Si el resultado es true, la carga de trabajo del sistema experimenta errores 401, lo que indica una falta de permisos. Si el resultado es false, omite el resto de estos pasos y prueba un procedimiento de solución de problemas diferente.

Para otorgar el rol roles/container.defaultNodeServiceAccount a la cuenta de servicio predeterminada de Compute Engine, completa los siguientes pasos:

Console

  1. Ve a la página Bienvenido:

    Ir a Bienvenido

  2. En el campo Número de proyecto, haz clic en Copiar al portapapeles.
  3. Ve a la página IAM:

    Ir a IAM

  4. Haz clic en Grant access.
  5. En el campo Nuevos principales, especifica el siguiente valor:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    Reemplaza PROJECT_NUMBER por el número de proyecto que copiaste.
  6. En el menú Selecciona un rol, selecciona el rol Cuenta de servicio de nodo predeterminada de Kubernetes Engine.
  7. Haz clic en Guardar.

gcloud

  1. Busca el número de tu Google Cloud proyecto:
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    Reemplaza PROJECT_ID por el ID del proyecto.

    El resultado es similar a este:

    12345678901
    
  2. Otorga la roles/container.defaultNodeServiceAccount función a la cuenta de servicio predeterminada de Compute Engine:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    Reemplaza PROJECT_NUMBER por el número de proyecto del paso anterior.

Confirma que el agente de métricas tenga suficiente memoria

Si probaste los pasos de solución de problemas anteriores y las métricas aún no aparecen, es posible que el agente de métricas no tenga suficiente memoria.

En la mayoría de los casos, la asignación predeterminada de recursos al agente de métricas de GKE es suficiente. Sin embargo, si el DaemonSet falla de forma repetida, puedes verificar el motivo de la finalización con las siguientes instrucciones:

  1. Obtén los nombres de los Pods del agente de métricas de GKE:

    kubectl get pods -n kube-system -l component=gke-metrics-agent
    
  2. Busca el Pod con el estado CrashLoopBackOff.

    El resultado es similar a este:

    NAME                    READY STATUS           RESTARTS AGE
    gke-metrics-agent-5857x 0/1   CrashLoopBackOff 6        12m
    
  3. Describe el Pod que tiene el estado CrashLoopBackOff:

    kubectl describe pod POD_NAME -n kube-system
    

    Reemplaza POD_NAME por el nombre del Pod del paso anterior.

    Si el motivo de finalización del Pod es OOMKilled, el agente necesita memoria adicional.

    El resultado es similar a este:

      containerStatuses:
      ...
      lastState:
        terminated:
          ...
          exitCode: 1
          finishedAt: "2021-11-22T23:36:32Z"
          reason: OOMKilled
          startedAt: "2021-11-22T23:35:54Z"
    
  4. Agrega una etiqueta de nodo al nodo con el agente de métricas con errores. Puedes usar una etiqueta de nodo persistente o temporal. Te recomendamos que intentes agregar 20 MB adicionales. Si el agente falla, puedes volver a ejecutar este comando y reemplazar la etiqueta de nodo por una que solicite una mayor cantidad de memoria adicional.

    Para actualizar un grupo de nodos con una etiqueta persistente, ejecuta el siguiente comando:

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

    Reemplaza lo siguiente:

    • NODEPOOL_NAME: el nombre del grupo de nodos
    • CLUSTER_NAME: es el nombre del clúster existente.
    • ADDITIONAL_MEMORY_NODE_LABEL: Una de las etiquetas de nodo de memoria adicionales; usa uno de los siguientes valores:
      • Para agregar 10 MB, ejecuta este comando: cloud.google.com/gke-metrics-agent-scaling-level=10
      • Para agregar 20 MB, ejecuta este comando: cloud.google.com/gke-metrics-agent-scaling-level=20
      • Para agregar 50 MB, ejecuta este comando: cloud.google.com/gke-metrics-agent-scaling-level=50
      • Para agregar 100 MB: cloud.google.com/gke-metrics-agent-scaling-level=100
      • Para agregar 200 MB: cloud.google.com/gke-metrics-agent-scaling-level=200
      • Para agregar 500 MB, ejecuta este comando: cloud.google.com/gke-metrics-agent-scaling-level=500
    • COMPUTE_LOCATION: la ubicación de Compute Engine del clúster.

    Como alternativa, puedes agregar una etiqueta de nodo temporal que no persistirá después de una actualización a través del siguiente comando:

    kubectl label node/NODE_NAME \
    ADDITIONAL_MEMORY_NODE_LABEL --overwrite
    

    Reemplaza lo siguiente:

    • NODE_NAME: el nombre del nodo del agente de métricas afectado.
    • ADDITIONAL_MEMORY_NODE_LABEL: es una de las etiquetas de nodo de memoria adicionales; usa uno de los valores del ejemplo anterior.

¿Qué sigue?