Por que não consigo coletar métricas de contêineres, pods ou nós usando o Metrics Server no Amazon EKS?

9 minuto de leitura
0

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.

  1. Para descrever o ConfigMap aws-auth, execute o comando a seguir:

    $ kubectl describe -n kube-system configmap aws-auth
  2. 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.

  1. 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
  2. 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
  3. 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

  1. 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
  2. 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.

AWS OFICIAL
AWS OFICIALAtualizada há um ano