Por que não consigo coletar métricas de contêineres, pods ou nós usando o Metrics Server no Amazon EKS?
Não consigo coletar métricas de contêineres, pods ou nós com o Metrics Server em meu cluster do Amazon Elastic Kubernetes Service (Amazon EKS).
Breve descrição
Por padrão, o Metrics Server não é instalado no Amazon EKS. Se você criou seu cluster recentemente e não consegue coletar métricas usando o Metrics Server, confirme se implantou a aplicação Metrics Server no seu cluster.
Se você ainda não conseguir coletar métricas com o Metrics Server, conclua as etapas nas seções a seguir:
- Verifique se você pode recuperar métricas dos nós e pods do seu cluster.
- Verifique se o APIService está disponível e pode lidar com solicitações.
- Consulte o GitHub para ver problemas comuns.
- Verifique nas suas solicitações de recursos do Horizontal Pod Autoscaler (HPA) e do aplicativo se as métricas estão aparecendo como <unknown>.
Observação: o Metrics Server não é uma prática recomendada para o monitoramento de longo prazo da performance de aplicações e clusters. Para monitoramento de longo prazo, consulte Gerenciamento de recursos para pods e contêineres, no site do Kubernetes. A comunidade Kubernetes mantém o Metrics Server e relata problemas em sua página do GitHub.
Resolução
Consulte as etapas a seguir para solucionar alguns dos problemas mais comuns com o Metrics Server.
Verifique se você pode recuperar métricas dos nós e pods do seu cluster
Verifique se há erros entre o servidor da API e o Metrics Server. Para extrair métricas dos nós e pods do seu cluster, execute os seguintes comandos:
$ kubectl top nodes
$ kubectl top pods
Se você não receber um erro de nenhum dos comandos, consulte a seção Verificar se o APIService está disponível e pode lidar com solicitações.
Se receber um erro, conclua as etapas em uma das seções a seguir com base no erro recebido:
- Erro do servidor (Proibido)
- Erro do servidor (ServiceUnavailable)
- Client.Timeout excedido enquanto aguardava cabeçalhos
- Conexão recusada
Erro do servidor (Proibido)
Essa mensagem de erro indica que você tem um problema com a autorização RBAC. Para resolver esse erro, confirme os seguintes pontos:
- O ServiceAccount está anexado à implantação corretamente.
- O ClusterRole/Perfil e o ClusterRoleBinding/RoleBindings usam as permissões RBAC corretas para o Metrics Server.
Para obter mais informações, consulte Usar a autorização RBAC, no site do Kubernetes.
Se você acessar o cluster por meio de um perfil definido no ConfigMap aws-auth, confirme se definiu o campo nome de usuário e o mapeamento.
-
Para descrever o ConfigMap aws-auth, execute o comando a seguir:
$ kubectl describe -n kube-system configmap aws-auth
-
Confirme se o campo nome de usuário está definido para o perfil que está acessando o cluster. Veja o exemplo a seguir:
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.
Erro do servidor (ServiceUnavailable)
Para verificar se há um problema com a configuração do aplicativo de serviço Metrics Server em seu cluster, execute o comando a seguir:
$ kubectl describe apiservices v1beta1.metrics.k8s.io
A saída é semelhante ao exemplo a seguir:
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>
Se o serviço Metrics Server estiver disponível e passar nas verificações, o Statusserá definido como Verdadeiro.
Se você definir Status como Vedadeiro e o problema persistir, consulte a seção Verificar se o APIService está disponível e pode lidar com solicitações.
Se o Status estiver definido como Falso, procure o código de Motivo associado e a Mensagem legível para Condições na saída. Veja o exemplo a seguir de um APIService com falha:
... 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
Se o Motivo não for FailedDiscoveryCheck, consulte a seção Outros motivos de falha na condição do APIServer.
Se o código do motivo for FailedDiscoveryCheck, o serviço Metrics Server estará disponível e os pods estarão em execução. O Kubernetes APIServer retorna um erro quando tenta acessar o endpoint do Metrics Server.
Se a mensagem de condições do APIServer contiver Client.Timeout excedido enquanto aguardava cabeçalhos, consulte a seção Resolver o erro "Client.Timeout excedido enquanto aguardava cabeçalhos".
Se a mensagem de condições do APIServer contiver conexão recusada, consulte a seção Resolver o erro "conexão recusada".
Resolver o erro “Client.Timeout excedido enquanto aguarda cabeçalhos”
Essa mensagem de erro no APIService indica que um grupo de segurança ou lista de controle de acesso à rede (ACL) não está configurado corretamente. Isso impede o acesso aos pods do metrics-server. Veja o exemplo a seguir:
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 resolver esse erro, confirme se seus grupos de segurança estão em conformidade com os requisitos mínimos de tráfego para o Amazon EKS.
Resolver o erro “conexão recusada”
Esse erro na mensagem no APIServer indica que o contêiner está escutando na porta errada. Veja o exemplo a seguir:
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 resolver esse erro, execute o comando a seguir para confirmar se os valores de portas, imagem e comando estão corretos na implantação do metrics-server:
$ kubectl describe deployment metrics-server -n kube-system
A saída é semelhante ao exemplo a seguir:
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 ...
Observação: os valores de Comando e Imagem podem variar dependendo de como o Metrics Server foi implantado e onde as imagens estão armazenadas. Se o Comando contiver o parâmetro --secure-port, a Porta (443/TCP, no exemplo anterior) exposta pelo pod deverá corresponder a esse parâmetro. Se o Comando não contiver o parâmetro --secure-port, o padrão da porta será 443.
Outros motivos de falha na condição do APIServer
Se você receber qualquer um dos seguintes códigos para o APIService, execute uma ação com base na mensagem de erro associada: ServiceNotFound, ServiceAccessError, ServicePortError, EndpointsNotFound, EndpointsAccessError ou MissingEndpoints.
-
Para informações sobre o serviço com o erro, execute o comando a seguir:
$ kubectl get service -n kube-system
Na saída, confirme se o serviço Kubernetes tem o mesmo nome e namespace definidos em APIService.Spec.Service. Em seguida, confirme se a porta está definida como 443/TCP. Veja o exemplo a seguir:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE metrics-server ClusterIP 172.20.172.133 <none> 443/TCP 65m
-
Para relacionar endpoints, execute o comando a seguir:
$ kubectl get endpoints metrics-server -n kube-system
Na saída, confirme se você tem pelo menos um endpoint para o serviço metrics-server:
NAME ENDPOINTS AGE metrics-server 10.0.35.231:443 76m
-
Para confirmar se a implantação está presente e se os rótulos correspondem aos do serviço metrics-server, execute o comando a seguir:
$ kubectl describe deploy metrics-server -n kube-system
Na saída, confirme se a implantação tem pelo menos uma 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 ...
Se ainda assim não for possível coletar métricas com o Metrics Server, consulte a seção Verificar se o APIService está disponível e pode lidar com solicitações.
Verificar se o APIService está disponível e pode lidar com solicitações
Para extrair logs de seus pods do Metrics Server, execute o comando a seguir:
$ kubectl logs -n <namespace> -l app=metrics-server
Por exemplo, os logs de erro no metrics-server começam com um 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"
Os logs de erro do Metrics Server indicam um problema de configuração no comando de implantação do Metrics Server ou um bug no contêiner do Metrics Server. Se a mensagem de erro não for óbvia ou você suspeitar que seja um bug, conclua as etapas na seção Consulte o GitHub para ver problemas comuns.
Consulte o GitHub para ver problemas comuns
Se você ainda não conseguir coletar métricas de contêineres, pods ou nós, consulte o GitHub para ver problemas comuns com o Metrics Server.
Verifique suas solicitações de HPA e de recursos de aplicativos em busca de métricas desconhecidas
-
Para verificar a configuração do HPA, execute o comando a seguir:
$ kubectl get hpa -n namespace 2048-deployment
Observação: substitua o namespace e a 2048-deployment pelos valores de configuração do HPA para seu aplicativo. Você pode ver <unknown> na coluna Destinos da saída. Veja o exemplo a seguir:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE 2048-deployment Deployment/2048-deployment <unknown>/80% 1 2 2 10s
-
Aguarde alguns minutos e repita o comando da etapa 1.
Se você ainda receber o erro <unknown>, execute o seguinte comando:
$ kubectl describe hpa -n <namespace> 2048-deployment
Em seguida, consulte a seção Eventos da saída para obter mais informações:
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
Se a coluna Mensagem mostrar solicitação ausente para [x], suas Implantações ou ReplicaSet provavelmente não estão declarando solicitações de recursos em suas especificações. Confirme se todos os contêineres do pod têm as solicitações declaradas. Deixar de fora uma solicitação pode fazer com que a métrica no HPA retorne a resposta <unknown>.
Para obter mais informações, consulte Gerenciamento de recursos para pods e contêineres, no site do Kubernetes.
Conteúdo relevante
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há um ano