¿Por qué no puedo recopilar métricas de contenedores, pods o nodos mediante el Servidor de métricas en Amazon EKS?

10 minutos de lectura
0

No puedo recopilar métricas de contenedores, pods o nodos con el Servidor de métricas en mi clúster de Amazon Elastic Kubernetes Service (Amazon EKS).

Descripción corta

En Amazon EKS, el Servidor de métricas no está instalado de forma predeterminada. Si acaba de crear su clúster y no puede recopilar métricas con el Servidor de métricas, confirme que ha implementado la aplicación del Servidor de métricas en su clúster.

Si sigue sin poder recopilar métricas con el Servidor de métricas, lleve a cabo los pasos de las siguientes secciones:

  • Compruebe si puede recuperar las métricas de los nodos y pods de su clúster.
  • Compruebe si APIService está disponible y puede gestionar solicitudes.
  • Consulte GitHub para ver los problemas más comunes.
  • Compruebe el escalador automático horizontal de pods y las solicitudes de recursos de la aplicación si las métricas se muestran como <unknown>.

Nota: No se recomienda usar el Servidor de métricas para la supervisión a largo plazo del rendimiento de las aplicaciones y los clústeres. Para obtener información sobre la supervisión a largo plazo, consulte Administración de recursos para pods y contenedores en el sitio web de Kubernetes. La comunidad de Kubernetes mantiene el Servidor de métricas e informa de los problemas en su página de GitHub.

Resolución

Consulte los siguientes pasos para solucionar algunos de los problemas más comunes del el Servidor de métricas.

Comprobar si se pueden recuperar las métricas de los nodos y pods del clúster

Compruebe si hay errores entre el servidor de la API y el Servidor de métricas. Para obtener métricas de los nodos y los pods del clúster, ejecute los siguientes comandos:

$ kubectl top nodes
$ kubectl top pods

Si no recibe ningún error en ninguno de los comandos, complete los pasos de la sección Comprobar si el APIService está disponible y puede gestionar solicitudes.

Si recibe un error, siga los pasos de una de las siguientes secciones en función de dicho error:

  • Error del servidor (Forbidden)
  • Error del servidor (ServiceUnavailable)
  • Se ha superado el tiempo de espera del cliente mientras esperaba los encabezados
  • Conexión rechazada

Error del servidor (Forbidden)

Este mensaje de error indica que tiene un problema con la autorización del RBAC. Para solucionar este error, confirme los siguientes puntos:

  • La ServiceAccount está conectada correctamente al despliegue.
  • Los rolesClusterRole/Role y ClusterRoleBinding/RoleBindings utilizan los permisos RBAC correctos para el Servidor de métricas.

Para obtener más información, consulte Uso de la autorización RBAC en el sitio web de Kubernetes.

Si accede a su clúster a través de un rol definido en el aws-auth ConfigMap, confirme que ha configurado el campo username y la asignación.

  1. Para describir el ConfigMap aws-auth, ejecute el siguiente comando:

    $ kubectl describe -n kube-system configmap aws-auth
  2. Confirme que el campo username esté configurado para el rol que accede al clúster. Vea el siguiente ejemplo:

    Name:         aws-auth
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    mapRoles:
    ----
    ...
    -
      groups:
      - system:masters
      rolearn: arn:aws:iam::123456789123:role/kubernetes-devops
      username: devops:{{SessionName}}  # Ensure this has been specified.

Error del servidor (ServiceUnavailable)

Para comprobar si hay algún problema con la configuración de la aplicación de servicio del Servidor de métricas en su clúster, ejecute el siguiente comando:

$ kubectl describe apiservices v1beta1.metrics.k8s.io

El resultado es similar al siguiente ejemplo:

Name:         v1beta1.metrics.k8s.io
Namespace:
Labels:       app=metrics-server
...
Status:
  Conditions:
    Last Transition Time:  2020-01-09T13:57:23Z
    Message:               all checks passed
    Reason:                Passed
    Status:                True
    Type:                  Available
Events:                    <none>

Si el servicio del Servidor de métricas está disponible y supera las comprobaciones, el Status se establece en True.

Si establece el Status en True y el problema persiste, consulte la sección Comprobar si el APIService está disponible y puede gestionar solicitudes.

Si el Status está establecido en False, busque el código del motivo asociado y el mensaje legible por humanos sobre las condiciones en el resultado. Consulte el siguiente ejemplo de un APIService que da error:

...
Status:
  Conditions:
    Last Transition Time:  2020-01-09T14:40:28Z
    Message:               no response from https://10.0.35.231:443: Get https://10.0.35.231:443: dial tcp 10.0.35.231:443: connect: connection refused
    Reason:                FailedDiscoveryCheck
    Status:                False
    Type:                  Available

Si el motivo no es FailedDiscoveryCheck, consulte la sección Otros motivos de error de condiciones del APIServer.

Si el código del motivo es FailedDiscoveryCheck, significa que el servicio del Servidor de métricas está disponible y los pods se están ejecutando. El APIServer de Kubernetes devuelve un error cuando intenta llegar al punto de conexión del Servidor de métricas.

Si el mensaje de condiciones del APIServer contiene Se ha superado el tiempo de espera del cliente mientras esperaba los encabezados, consulte la sección Solucionar el error de «Se ha superado el tiempo de espera del cliente mientras esperaba los encabezados».

Si el mensaje de condiciones del APIServer contiene conexión rechazada, consulte la sección Solucionar el error de «conexión rechazada».

Solucionar el error «Se ha superado el tiempo de espera del cliente mientras esperaba los encabezados»

Este mensaje de error en el APIService indica que un grupo de seguridad o una lista de control de acceso a la red (ACL) no están configurados correctamente. Esto impide el acceso a los pods del metrics-server . Vea el siguiente ejemplo:

no response from https://10.0.35.231:443: Get https://10.0.35.231:443: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

Para solucionar este error, confirme que sus grupos de seguridad cumplen con los requisitos mínimos de tráfico de Amazon EKS.

Solucionar el error «conexión rechazada»

Este error en el mensaje del APIServer indica que el contenedor está escuchando en el puerto incorrecto. Vea el siguiente ejemplo:

no response from https://10.0.35.231:443: Get https://10.0.35.231:443: dial tcp 10.0.35.231:443: connect: connection refused

Para solucionar este error, ejecute el siguiente comando para confirmar que los valores de puertos, imagen y comando son correctos en el despliegue de metrics-server:

$ kubectl describe deployment metrics-server -n kube-system

El resultado es similar al siguiente ejemplo:

Name:                   metrics-server
Namespace:              kube-system
CreationTimestamp:      Wed, 08 Jan 2020 11:48:45 +0200
Labels:                 app=metrics-server
...
  Containers:
   metrics-server:
    Image:      gcr.io/google_containers/metrics-server-amd64:v0.3.6
    Port:       443/TCP
    Command:
    - /metrics-server
    - --logtostderr
    - --secure-port=443
...

Nota: Los valores de comando e imagen pueden variar según la forma en que se haya desplegado el Servidor de métricas y el lugar donde se almacenen las imágenes. Si el comando contiene el parámetro --secure-port, el puerto (443/TCP, en el ejemplo anterior) expuesto por el pod debe coincidir con este parámetro. Si el comando no contiene el parámetro --secure-port, el puerto se establece de forma predeterminada en 443.

Otros motivos de error de condiciones del APIServer

Si recibe alguno de los siguientes códigos en el APIService, actúe en función del mensaje de error asociado: ServiceNotFound, ServiceAccessError, ServicePortError, EndpointsNotFound, EndpointsAccessError o MissingEndpoints.

  1. Para obtener información sobre el servicio con el error, ejecute el siguiente comando:

    $ kubectl get service -n kube-system

    En el resultado, confirme que el servicio de Kubernetes tiene el mismo nombre y espacio de nombres que se definen en APIService.Spec.Service. A continuación, confirme que el puerto esté configurado en 443/TCP. Vea el siguiente ejemplo:

    NAME                             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    metrics-server                   ClusterIP   172.20.172.133   <none>        443/TCP    65m
  2. Para enumerar los puntos de conexión, ejecute el siguiente comando:

    $ kubectl get endpoints metrics-server -n kube-system

    En el resultado, confirme que tiene al menos un punto de conexión para el servicio del metrics-server:

    NAME             ENDPOINTS         AGE
    metrics-server   10.0.35.231:443   76m
  3. Para confirmar que el despliegue está presente y que las etiquetas coinciden con las del servicio del metrics-server, ejecute el siguiente comando:

    $ kubectl describe deploy metrics-server -n kube-system

    En el resultado, confirme que el despliegue tiene al menos una réplica:

    Name:                   metrics-server
    Namespace:              kube-system
    CreationTimestamp:      Wed, 08 Jan 2020 11:48:45 +0200
    Labels:                 app=metrics-server
                            release=metrics-server
    ...
    Selector:               app=metrics-server,release=metrics-server
    Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
    ...
    Pod Template:
      Labels:           app=metrics-server
                        release=metrics-server
      Service Account:  metrics-server
      Containers:
       metrics-server:
        Image:      gcr.io/google_containers/metrics-server-amd64:v0.3.6
    ...

Si sigue sin poder recopilar métricas con el Servidor de métricas, consulte la sección Comprobar si el APIService está disponible y puede gestionar solicitudes.

Comprobar si el APIService está disponible y puede gestionar solicitudes

Para extraer los registros de sus pods del Servidor de métricas, ejecute el siguiente comando:

$ kubectl logs -n <namespace> -l app=metrics-server

Por ejemplo, los registros de errores en el metrics-server comienzan con E:

E0610 23:13:28.247604       1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-nv8sz: no metrics known for pod "default/php-apache-b5f58cc5f-nv8sz"
E0610 23:13:43.260069       1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-nv8sz: no metrics known for pod "default/php-apache-b5f58cc5f-nv8sz"
E0610 23:16:13.346070       1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-cj67b: no metrics known for pod "default/php-apache-b5f58cc5f-cj67b"
E0610 23:16:13.346087       1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-sqc6l: no metrics known for pod "default/php-apache-b5f58cc5f-sqc6l"
E0610 23:16:13.346091       1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-4cpwk: no metrics known for pod "default/php-apache-b5f58cc5f-4cpwk"

Los registros de errores del Servidor de métricas indican o bien un problema de configuración en el comando de despliegue del Servidor de métricas o bien un error en el contenedor del mismo. Si el mensaje de error no es obvio o sospecha que se trata de un error, siga los pasos de la sección Consultar GitHub para ver los problemas más comunes.

Consultar GitHub para ver los problemas más comunes

Si sigue sin poder recopilar métricas de contenedores, pods o nodos, consulte GitHub para ver si hay problemas comunes con el Servidor de métricas.

Comprobar las solicitudes de recursos de aplicaciones y HPA para ver si hay métricas desconocidas

  1. Para comprobar la configuración del HPA, ejecute el siguiente comando:

    $ kubectl get hpa -n namespace 2048-deployment

    Nota: Sustituya el espacio de namespace e 2048-deployment por los valores de configuración de HPA de su aplicación. Puede que vea <unknown> en la columna Objetivos del resultado. Vea el siguiente ejemplo:

    NAME              REFERENCE                    TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    2048-deployment   Deployment/2048-deployment   <unknown>/80%   1         2         2          10s
  2. Espere varios minutos y, a continuación, repita el comando del paso 1.

    Si aún recibe el error <unknown>, ejecute el comando siguiente:

    $ kubectl describe hpa -n <namespace> 2048-deployment

    A continuación, consulte la sección Eventos del resultado para obtener más información:

    Name:                                                  2048-deployment
    Namespace:                                             2048-game
    ...
    Metrics:                                               ( current / target )
      resource cpu on pods  (as a percentage of request):  <unknown> / 80%
    Min replicas:                                          1
    Max replicas:                                          2
    Deployment pods:                                       2 current / 2 desired
    Conditions:
      Type           Status  Reason                   Message
      ----           ------  ------                   -------
      AbleToScale    True    SucceededGetScale        the HPA controller was able to get the target's current scale
      ScalingActive  False   FailedGetResourceMetric  the HPA was unable to compute the replica count: missing request for cpu
    Events:
      Type     Reason                   Age                     From                       Message
      ----     ------                   ----                    ----                       -------
      Warning  FailedGetResourceMetric  3m29s (x4333 over 19h)  horizontal-pod-autoscaler  missing request for cpu

    Si la columna Mensaje muestra falta una solicitud para [x], es probable que sus despliegues o ReplicaSet no declaren las solicitudes de recursos en su especificación. Confirme que todos los contenedores del pod tengan las solicitudes declaradas. Omitir una solicitud puede provocar que la métrica en el HPA devuelva la respuesta <unknown>.

Para obtener más información, consulte Administración de recursos para pods y contenedores en el sitio web de Kubernetes.

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 8 meses