Ir para o conteúdo

Como soluciono problemas ao configurar o Cluster Autoscaler em um cluster do Amazon EKS?

10 minuto de leitura
0

Quero solucionar problemas ao iniciar o Cluster Autoscaler no meu cluster do Amazon Elastic Kubernetes Service (Amazon EKS).

Resolução

Observação: se você receber mensagens de erro ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Os comandos na resolução a seguir não usam a sinalização --region porque usam a região padrão da AWS. Para verificar sua região padrão, execute o seguinte comando configure da AWS CLI:

aws configure

Para alterar a região, use a sinalização --region.

Pré-requisitos: Instale ou atualize o eksctl para a versão mais recente. Para obter instruções, consulte Opções de instalação para Eksctl no site do eksctl.

Execute as seguintes ações de solução de problemas com base no problema que você encontrar. Para solucionar problemas de sonda, consulte Como solucionar problemas de sonda de disponibilidade e prontidão com meus clusters do Amazon EKS?

O pod Cluster Autoscaler está em um estado “CrashLoopBackOff”

Para solucionar o problema do estado “CrashLoopBackOff”, conclua as seguintes etapas:

  1. Para verificar o status do pod do Cluster Autoscaler, execute o seguinte comando:

    kubectl get pods -n kube-system | grep cluster-autoscaler

    Exemplo de saída:

    NAME                            READY   STATUS             RESTARTS      AGE
    cluster-autoscaler-abcd-abcd   0/1     CrashLoopBackOff   3 (20s ago)   99s
  2. Para obter detalhes sobre por que o pod está preso no estado “CrashLoopBackOff”, execute o seguinte comando:

    kubectl describe pod cluster-autoscaler-abcd-abcde -n kube-system

    Observação: substitua cluster-autoscaler-abcd-abcde pelo nome do pod do Cluster Autoscaler.
    Na saída, verifique o valor de Reason. Se você encontrar um problema OOMKilled, use o comando kubectl edit para aumentar os valores de limites e solicitações para recursos de memória na implantação do Cluster Autoscaler. Para obter mais informações sobre kubectl edit, consulte kubectl edit no site do Kubernetes. Para ver os valores de memória padrão no Cluster Autoscaler, consulte cluster-autoscaler-autodiscover.yaml no site do GitHub.
    Exemplo de saída:

    Name:               cluster-autoscaler-abcd-abcde
    Namespace:          kube-system
    State:              Waiting
    Reason:             CrashLoopBackOff
    Last State:         Terminated
    Reason:             OOMKilled
    Exit Code:          137
    ...
  3. Para verificar se há problemas nos logs do pod do Cluster Autoscaler, execute o seguinte comando:

    kubectl logs -f -n kube-system -l app=cluster-autoscaler

    Se os logs apresentarem problemas de permissão do AWS Identity and Access Management (AWS IAM), prossiga para O pod do Cluster Autoscaler apresenta problemas de permissões do IAM. Exemplo de saída:

    Failed to create AWS Manager: cannot autodiscover ASGs: AccessDenied: User: abc is not authorized to perform: autoscaling: DescribeTags because no identity-based policy allows the autoscaling:DescribeTags action status code: 403, request id: abcdexyz

    Se os logs apresentarem problemas de rede, como tempo limite de E/S, prossiga para O pod do Cluster Autoscaler apresenta problemas de rede. Exemplo de saída:

    Failed to create AWS Manager: cannot autodiscover ASGs: WebIdentityErr: failed to retrieve credentials caused by: RequestError: send request failed caused by: Post https://sts.region.amazonaws.com/: dial tcp: i/o timeout

O pod do Cluster Autoscaler apresenta problemas de permissões do IAM

Verifique se você associou um provedor OIDC ao cluster

Certifique-se de ter criado um provedor do OpenID Connect (OIDC) para seu cluster.

Verifique se você anotou a conta de serviço do Cluster Autoscaler com o perfil do IAM

Para verificar as anotações da sua conta de serviço da AWS, execute o seguinte comando:

kubectl get serviceaccount cluster-autoscaler -n kube-system -o yaml

Verifique as anotações para garantir que a saída liste o seu perfil de conta de serviço do Cluster Autoscaler. Exemplo de saída:

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/cluster_auto_scaler_iam_role
  name: cluster-autoscaler
  namespace: kube-system

Para solucionar problemas com o seu perfil de conta de serviço, consulte Como solucionar problemas de um provedor de OIDC e IRSA no Amazon EKS?

Verifique a política do IAM

Certifique-se de anexar a política do IAM correta ao perfil da conta de serviço do Cluster Autoscaler. Para ver um exemplo de política e uma lista de permissões necessárias, consulte IAM policy (Política do IAM) no site do GitHub.

Verifique se você configurou corretamente a relação de confiança

Verifique se você configurou corretamente a relação de confiança. Exemplo de relação de confiança:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::example_awsaccountid:oidc-provider/oidc.eks.example_region.amazonaws.com/id/example_oidcid"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.example_region.amazonaws.com/id/example_oidcid:aud": "sts.amazonaws.com",
          "oidc.eks.example_region.amazonaws.com/id/example_oidcid:sub": "system:serviceaccount:kube-system:cluster-autoscaler"
        }
      }
    }
  ]
}

Observação: substitua example_awsaccountid pelo ID da sua conta da AWS, example_region pela sua região e example_oidcid pelo seu ID do OIDC.

Sempre que você alterar o perfil ou a política da conta de serviço, execute o seguinte comando para reiniciar o pod do Cluster Autoscaler:

kubectl rollout restart deployment cluster-autoscaler -n kube-system

O pod do Cluster Autoscaler apresenta problemas de rede

Certifique-se de ter configurado o cluster do Amazon EKS com a configuração de rede necessária. Verifique se a sub-rede do nó de processamento tem uma tabela de rotas que pode rotear o tráfego para os seguintes endpoints:

Se o cluster do Amazon EKS for privado, você deve criar um endpoint da Amazon Virtual Private Cloud (Amazon VPC) para os endpoints anteriores.

Observação: cada grupo de segurança do endpoint da VPC deve permitir o grupo de segurança do nó de processamento do Amazon EKS. Os grupos de segurança também devem permitir tráfego de entrada para o bloco CIDR da VPC do Amazon EKS na porta 443.

Verifique se a lista de controle de acesso à rede (ACL da rede) da sub-rede e os grupos de segurança do nó de processamento não bloqueiam o tráfego que se comunica com esses endpoints.

O Cluster Autoscaler não reduz nem aumenta a escala horizontalmente dos nós

Verifique os logs do pod do Cluster Autoscaler para visualizar as regras de programação

Para verificar o status dos seus pods, execute o seguinte comando:

kubectl logs -f -n kube-system -l app=cluster-autoscaler

Para verificar se o pod com status Pendente contém regras de programação, como a regra de afinidade, execute o seguinte comando:

kubectl describe pod example_podname -n example_namespace

Observação: substitua example_podname pelo nome do pod e example_namespace pelo seu namespace.

Na saída, consulte a seção eventos para obter mais informações sobre por que o pod está no status Pendente. Exemplo de saída:

$ kubectl describe pod cluster-autoscaler-abcde-abcd -n kube-system
Name: cluster-autoscaler-5b6b675456-npf8p
...
Status: Pending
...
Events:
 Type Reason Age From Message
 ---- ------ ---- ---- -------
 Warning FailedScheduling 12s (x4 over 2m) default-scheduler 0/4 nodes are available: 1 node(s) didn't match node selector, 3 node(s) didn't match pod affinity rules.

Observação: o Cluster Autoscaler respeita o nodeSelector e requiredDuringSchedulingIgnoredDuringExecution em nodeAffinity. Certifique-se de rotular seus grupos de nós com esses valores. Para rotular seus grupos de nós, execute o seguinte comando:

kubectl get nodes --show-labels

Se o Cluster Autoscaler não conseguir programar um pod com nodeSelector ou requiredDuringSchedulingIgnoredDuringExecution, ele usará somente grupos de nós que atendam aos requisitos de expansão. Para programar um pod em um nó, é necessário modificar as regras de programação definidas nos pods ou nos nós. Para obter mais informações, consulte Affinity and anti-affinity (Afinidade e antiafinidade) no site do Kubernetes.

Verifique a marcação do grupo do Amazon EC2 Auto Scaling para o Cluster Autoscaler

Para que o Cluster Autoscaler descubra um grupo do Auto Scaling, você deve marcar o grupo do Amazon EC2 Auto Scaling do grupo de nós com as seguintes tags.

Na tag 1, configure os seguintes valores:

  • Em key, insira k8s.io/cluster-autoscaler/example-cluster.
  • Em value, insira owned.

Observação: substitua example-cluster pelo nome do seu cluster.

Na tag 2, configure os seguintes valores:

  • Em key, insira k8s.io/cluster-autoscaler/enabled.
  • Em value, insira true.

Verifique a configuração do manifesto de implantação

Para abrir o manifesto de implantação, execute o seguinte comando:

kubectl -n kube-system edit deployment.apps/cluster-autoscaler

Na saída, em node-group-auto-discover, certifique-se de que o manifesto lista o nome correto do cluster ou do grupo de nós. Exemplo de saída:

containers:- command   ./cluster-autoscaler
   --v=4
   --stderrthreshold=info
   --cloud-provider=aws
   --skip-nodes-with-local-storage=false
   --expander=least-waste
   --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/example-cluster
   --balance-similar-node-groups
   --skip-nodes-with-system-pods=false

Certifique-se de não exceder se número máximo de nós

Para verificar o número atual de nós, execute o seguinte comando describe-nodegroup:

aws eks describe-nodegroup --cluster-name example-cluster --nodegroup-name example-nodegroup

Observação: substitua example-cluster pelo nome do seu cluster e example-nodegroup pelo nome do seu grupo de nós.

Se você atingiu o número mínimo ou máximo de nós, execute o seguinte comando update-nodegroup-config para modificar os valores:

aws eks update-nodegroup-config \
    --cluster-name cluster-name \
    --nodegroup-name nodegroup-name \
    --scaling-config minSize=minvalue,maxSize=maxvalue,desiredSize=desiredvalue \

Observação: substitua cluster-name pelo nome do seu cluster e nodegroup-name pelo nome do seu grupo de nós. Além disso, substitua minvalue pelo número mínimo de nós, maxvalue pelo número máximo de nós e desiredvalue pelo valor desejado de nós.

Certifique-se de que seus nós conseguem ingressar no cluster

Verifique se as novas instâncias que o grupo do Amazon EC2 Auto Scaling inicia podem ingressar no cluster do Amazon EKS. Se não conseguirem, consulte Como posso fazer os meus nós de processamento ingressarem no meu cluster do Amazon EKS?

Certifique-se de que você está usando o tipo correto de instância de nó

Para verificar se o Cluster Autoscaler pode atender à solicitação de recurso do pod com os tipos de instância do nó atual, execute o seguinte comando:

kubectl -n example_namespace get pod example_podname -o yaml | grep resources -A6

Observação: substitua example-cluster pelo nome do seu cluster e example-podname pelo nome do seu pod.

Exemplo de saída:

 containers:
        - image: registry.k8s.io/autoscaling/cluster-autoscaler:v1.32.1
          name: cluster-autoscaler
          resources:
            limits:
              cpu: 100m
              memory: 600Mi
            requests:
              cpu: 100m
              memory: 600Mi

Na saída, verifique os valores de limites e solicitações. Certifique-se de que os valores de cpu e memória sejam altos o suficiente para que o nó mantenha o pod. Para consultar os requisitos do seu pod, execute o seguinte comando:

kubectl describe pod podname -n namespace,

Observação: substitua podname pelo nome do seu pod e namespace pelo seu namespace.

Se os requisitos do pod forem maiores do que as capacidades do nó, use o comando kubectl edit para aumentar os valores de limites e solicitações para recursos de memória na implantação do Cluster Autoscaler. Ou crie um novo grupo de nós com um tipo diferente de instância que atenda aos requisitos de recursos do pod. Para obter mais informações sobre kubectl edit, consulte kubectl edit no site do Kubernetes.

Verifique a configuração de taint do nó no grupo de nós

Para verificar se você configurou taints para o nó e se o pod pode tolerar os taints, execute o seguinte comando:

kubectl describe node example_nodename | grep taint -A2

Observação: substitua example_nodename pelo nome do seu nó.

Se você configurou taints, remova os taints definidos no nó. Para ver as etapas, consulte Seu pod está no estado Pendente em Como soluciono problemas de status do pod no Amazon EKS? Se o Pod não tolerar taints, defina a tolerância no pod. Para obter mais informações, consulte Taints and tolerations (Taints e tolerâncias) no site do Kubernetes.

Certifique-se de que o nó não esteja com a redução de escala vertical desativada

Para verificar o status de scale-down-disable em seu nó, execute o seguinte comando:

kubectl describe node example_nodename | grep scale-down-disable

Observação: substitua example_nodename pelo nome do seu nó.

Exemplo de saída:

cluster-autoscaler.kubernetes.io/scale-down-disabled: true

Se scale-down-disable estiver definido como true, execute o seguinte comando para remover a anotação do nó e permitir que ele reduza a escala verticalmente:

kubectl annotate node example_nodename cluster-autoscaler.kubernetes.io/scale-down-disabled-

Observação: substitua example_nodename pelo nome do seu nó.

Para obter mais etapas de solução de problemas do Cluster Autoscaler, consulte Frequently Asked Questions (Perguntas frequentes) no site do GitHub.

AWS OFICIALAtualizada há um ano