¿Por qué no puedo recopilar métricas de contenedores, pods o nodos mediante el Servidor de métricas en Amazon EKS?
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.
-
Para describir el ConfigMap aws-auth, ejecute el siguiente comando:
$ kubectl describe -n kube-system configmap aws-auth
-
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.
-
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
-
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
-
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
-
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
-
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.
Contenido relevante
- OFICIAL DE AWSActualizada hace 8 meses
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 2 años