Ir para o conteúdo

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 no meu cluster do Amazon Elastic Kubernetes Service (Amazon EKS).

Resolução

O Amazon EKS não instala automaticamente o Metrics Server. 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:

Observação: o Metrics Server não é uma prática recomendada para o monitoramento de longo prazo do desempenho de aplicações e clusters. Para monitoramento de longo prazo, consulte Gerenciamento de recursos em 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. Para obter mais informações, consulte Issues (Problemas) na página do Metrics Server no GitHub.

Verifique se é possível recuperar métricas dos nós e pods do seu cluster

Para verificar se é possível recuperar métricas dos nós e pods do seu cluster, execute os seguintes comandos:

kubectl top nodes
kubectl top pods

Observação: se você não receber uma mensagem de erro de nenhum dos comandos, consulte a seção Verifique se o APIService está disponível e pode lidar com solicitações.

Se você receber uma mensagem de erro, conclua as etapas em uma das seções a seguir com base no erro recebido:

Mensagem de erro "Error from server (Forbidden)"

Se você tiver um problema com a autorização do controle de acesso baseado em perfil (role based access control, RBAC), receberá uma mensagem de erro "Error from server (Forbidden)".

Para resolver esse erro, realize as seguintes ações:

  • Confirme se ServiceAccount está anexada corretamente à implantação.
  • Verifique se ClusterRole/Role e ClusterRoleBinding/RoleBindings usam as permissões RBAC corretas no Metrics Server. Para obter mais informações, consulte Using RBAC authorization (Usando autorização RBAC) no site do Kubernetes.

Se você acessar o cluster por meio de um perfil definido no aws-auth ConfigMap, confirme se definiu o campo nome de usuário e o mapeamento.

Conclua as etapas a seguir:

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

    kubectl describe -n kube-system configmap aws-auth
  2. Examine a saída do comando anterior para confirmar se o campo nome de usuário está definido no perfil que acessa o cluster.
    Exemplo de saída:

    Name:         aws-auth
    Namespace:    kube-system
    Labels:       
    Annotations:  <none>
    
    Data
    ===
    mapRoles:
    ----
    ...
    - groups:
      - system:masters
      rolearn: arn:aws:iam::123456789123:role/kubernetes-devops
      username: devops:`SessionName`

    Certifique-se de que nome de usuário está especificado na saída.

Mensagem de erro "Error from server (ServiceUnavailable)"

Se o Metrics Server não estiver configurado corretamente, você receberá a mensagem de erro "Error from server (ServiceUnavailable)".

Para verificar se há um problema com a configuração da aplicação de serviço Metrics Server em seu cluster, execute o comando a seguir:

kubectl describe apiservices v1beta1.metrics.k8s.io

Exemplo de saída:

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 Status será definido como True.

Observação: se você definir Status como True e o problema persistir, consulte a seção Verifique se o APIService está disponível e pode lidar com solicitações.

Se o Status estiver definido como False, procure o código de Reason associado e Message legível em Conditions na saída.

Exemplo de falha do APIService:

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

Observação: se Reason não for FailedDiscoveryCheck, consulte a seção Outros motivos de falha na condição do APIServer. Se a mensagem em Conditions do APIServer contiver Client.Timeout exceeded while awaiting headers, consulte a seção Resolva o erro "Client.Timeout exceeded while awaiting headers". Se a mensagem em Conditions do APIServer contiver Connection refused, consulte a seção Resolva o erro "Connection refused".

Resolva o erro "Client.Timeout exceeded while awaiting headers"

Se você não configurou corretamente um grupo de segurança ou uma lista de controle de acesso à rede (ACL da rede), receberá a mensagem de erro "Client.Timeout exceeded will awaiting headers" em APIService. Então não é possível acessar os pods do metrics-server.

Para resolver esse erro, confirme se seus grupos de segurança estão em conformidade com os requisitos mínimos de tráfego do Amazon EKS.

Resolva o erro "Connection refused"

Se um contêiner receber na porta errada, você receberá a mensagem de erro "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

Exemplo de saída:

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 variam dependendo de como você implanta o Metrics Server e onde você armazena as imagens. Se o Comando contiver o parâmetro --secure-port, a porta exposta pelo pod deve 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 no APIService, realize uma ação com base na mensagem de erro associada: ServiceNotFound, ServiceAccessError, ServicePortError, EndpointsNotFound, EndpointsAccessError ou MissingEndpoints.

Conclua as seguintes etapas para resolver esses erros:

  1. Para obter 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.
    Exemplo de saída:

    NAME                             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    metrics-server                   ClusterIP   172.20.172.133   <none>        443/TCP    65m
  2. Execute o comando a seguir para listar todos os endpoints:

    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.
    Exemplo de saída:

    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.
    Exemplo de saída:

    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 Verifique se o APIService está disponível e pode lidar com solicitações.

Verifique 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

Observação: substitua namespace pelo seu namespace.
Exemplos de logs de erros:

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"

Observação: 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. Para obter mais informações, consulte Issues (Problemas) na página do Metrics Server no GitHub.

Para verificar as métricas desconhecidas do HorizontalPodAutoscaler (HPA) e das solicitações de recursos da aplicação, conclua as seguintes etapas:

  1. Para verificar a configuração do HPA, execute o comando a seguir:

    kubectl get hpa -n namespace 2048-deployment

    Observação: substitua namespace e 2048-deployment pelos valores de configuração do HPA em sua aplicação.
    É possível ver <unknown> na coluna Targets da saída.
    Exemplo de saída:

    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

    Observação: substitua namespace pelo seu namespace.
    Em seguida, consulte a seção Events da saída para obter mais informações.
    Exemplo de saída:

    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

    Observação: se a coluna Message mostrar missing request for [x], suas Implantações ou ReplicaSet podem não declarar solicitações de recursos em suas especificações. Confirme se todos os contêineres do pod têm as solicitações declaradas. Se você omitir uma solicitação, a métrica no HPA retornará a resposta <unknown>.
    Para obter mais informações, consulte Gerenciamento de recursos em Pods e contêineres, Deployments (Implantações) e ReplicaSet no site do Kubernetes.

AWS OFICIALAtualizada há 6 meses