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

9 minuto de leitura
0

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

Breve descrição

Certifique-se de verificar os procedimentos a seguir antes de começar:

  • O eksctl está instalado ou atualizado para a versão mais recente.
  • Os valores do espaço reservado em trechos de código foram substituídos por seus próprios valores.

Observação: a variável --region nem sempre é usada nos comandos porque o valor padrão para sua região da AWS é usado. Verifique o valor padrão ao executar o comando “configure” da AWS Command Line Interface (AWS CLI). Se for necessário alterar a região da AWS, use o sinalizador --region.

Observação: se você receber erros ao executar comandos da AWS CLI, confirme se está executando uma versão recente da AWS CLI.

Resolução

O pod do Cluster Autoscaler está com um status CrashLoopBackOff

Verifique o status do pod do Cluster Autoscaler ao executar o comando a seguir:

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

Veja a seguir um exemplo de um pod do Cluster Autoscaler que está com o status CrashLoopBackOff:

NAME                            READY   STATUS             RESTARTS      AGE
cluster-autoscaler-xxxx-xxxxx   0/1     CrashLoopBackOff   3 (20s ago)   99s

Visualize os logs do pod do Cluster Autoscaler ao executar o comando a seguir:

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

Se os logs indicarem que há problemas relativos às permissões do AWS Identity and Access Management (IAM), realize os procedimentos a seguir:

  • Verifique se um provedor OIDC está associado ao cluster do Amazon EKS.
  • Verifique se a conta de serviço do Cluster Autoscaler está anotada com o perfil do IAM.
  • Verifique se a política do IAM adequada está vinculada ao perfil do IAM anterior.
  • Verifique se a relação de confiança está configurada corretamente.

Observação: veja a seguir um exemplo de log que indica problemas relativos às permissões do IAM:

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

Importante: verifique todos os comandos da AWS CLI fornecidos e substitua todas as instâncias de strings de exemplo pelos seus valores. Por exemplo, substitua example-cluster pelo seu cluster.

Verifique se um provedor OIDC está associado ao cluster do EKS

1.    Verifique se você tem um provedor OpenID Connect (OIDC) do IAM existente para seu cluster ao executar o comando a seguir:

oidc_id=$(aws eks describe-cluster --name example-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)

2.    Verifique se um provedor OIDC do IAM com o ID do seu cluster já está em sua conta ao executar o comando a seguir:

aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

Observação: se a saída for retornada, você já terá um provedor OIDC do IAM para seu cluster e poderá passar a próxima etapa. Se nenhuma saída for retornada, você deverá criar um provedor OIDC do IAM para seu cluster na próxima etapa.

3.    Crie um provedor de identidade OIDC do IAM para o cluster ao executar o comando a seguir:

eksctl utils associate-iam-oidc-provider --cluster example-cluster --approve

Verifique se a conta de serviço do Cluster Autoscaler está anotada com o perfil do IAM

Verifique se a conta de serviço está anotada com o perfil do IAM ao executar o comando a seguir:

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

O resultado esperado é apresentado a seguir:

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

Verifique se a política do IAM adequada está vinculada ao perfil do IAM anterior

Para obter um exemplo, veja o procedimento a seguir:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "autoscaling:DescribeAutoScalingInstances",
        "autoscaling:SetDesiredCapacity",
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribeTags",
        "autoscaling:DescribeLaunchConfigurations",
        "ec2:DescribeLaunchTemplateVersions",
        "ec2:DescribeInstanceTypes",
        "autoscaling:TerminateInstanceInAutoScalingGroup"
      ],
      "Resource": "*"
    }
  ]
}

Verifique se a relação de confiança está configurada corretamente

Para obter um exemplo, veja o procedimento a seguir:

{
  "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"
        }
      }
    }
  ]
}

Reinicie o pod do Cluster Autoscaler quando qualquer alteração for realizada no perfil da conta de serviço ou na política do IAM.

Se os logs indicarem problemas de rede (por exemplo, tempo limite de E/S), realize o procedimento a seguir:

Observação: veja a seguir um exemplo de log que indica problemas de rede:

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

1.    Verifique se o cluster do Amazon EKS está configurado com a configuração de rede necessária. Verifique se a sub-rede do nó de processamento tem uma tabela de rotas que poderá rotear o tráfego para os endpoints a seguir, seja em endpoints globais, seja em regionais:

  • Amazon Elastic Compute Cloud (Amazon EC2)
  • AWS Auto Scaling
  • AWS Security Token Service (AWS STS)

2.    Certifique-se de que a lista de controle de acesso à rede (ACL da rede) da sub-rede ou o grupo de segurança do nó de processamento não esteja bloqueando o tráfego de comunicação com esses endpoints.

3.    Se o cluster do Amazon EKS for privado, verifique a configuração dos endpoints da Amazon Virtual Private Cloud (VPC) relevantes. Por exemplo, o Amazon EC2, o AWS Auto Scaling e o AWS STS.

Observação: o grupo de segurança de cada endpoint da VPC é necessário para permitir o grupo de segurança do nó de processamento do Amazon EKS. Também é necessário permitir o bloco CIDR da VPC do Amazon EKS na porta 443 no tráfego de entrada.

O Cluster Autoscaler não está aumentando ou reduzindo a escala horizontalmente dos nós

Se o Cluster Autoscaler não estiver aumentando ou reduzindo a escala horizontalmente dos nós, verifique o seguinte:

  • Verifique os logs do pod do Cluster Autoscaler.
  • Verifique a marcação do grupo do Auto Scaling para o Cluster Autoscaler.
  • Verifique a configuração do manifesto de implantação.
  • Verifique o número atual de nós.
  • Verifique a solicitação de recurso do pod.
  • Verifique a configuração do taint para o nó no grupo de nós.
  • Verifique se o nó está anotado com scale-down-disable.

Verifique os logs do pod do Cluster Autoscaler

Para visualizar os logs do pod e identificar os motivos pelos quais o Cluster Autoscaler não está aumentando ou reduzindo a escala horizontalmente dos nós, execute o comando a seguir:

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

Verifique se o pod com status Pending (Pendente) contém alguma regra de programação, como a regra de afinidade, ao executar o comando “describe pod” a seguir:

kubectl describe pod <example_podname> -n <example_namespace>

Verifique a seção events (eventos) na saída. Esta seção apresenta informações sobre a razão pela qual um pod está com um status pendente.

Observação: o Cluster Autoscaler respeita o nodeSelector e o requiredDuringSchedulingIgnoredDuringExecution em nodeAffinity, supondo que você tenha rotulado os grupos de nós adequadamente. Se um pod não puder ser programado com nodeSelector ou requiredDuringSchedulingIgnoredDuringExecution, o Cluster Autoscaler considerará somente os grupos de nós que atendem a esses requisitos para expansão. Modifique as regras de programação definidas adequadamente em pods ou nós para que um pod seja programado em um nó.

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

O grupo do Auto Scaling correspondente do grupo de nós deve ser etiquetado da maneira apresentada a seguir para que o Cluster Autoscaler descubra o grupo do Auto Scaling:

Etiqueta 1:

  • chave: k8s.io/cluster-autoscaler/example-cluster
  • valor: owned (de propriedade)

Etiqueta 2:

  • chave: k8s.io/cluster-autoscaler/enabled
  • valor: true (verdadeiro)

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

Para verificar a configuração do manifesto de implantação do Cluster Autoscaler, execute o comando a seguir:

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

Verifique se o manifesto está configurado com o argumento node-group-auto-discovery adequado da seguinte forma:

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

Verifique o número atual de nós

Para verificar se o número atual de nós atingiu os valores mínimo ou máximo do grupo de nós gerenciados, execute o comando a seguir:

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

Se os valores mínimo ou máximo forem atingidos, modifique os valores com os novos requisitos de workload.

Verifique a solicitação de recurso do pod

Para verificar se a solicitação de recurso do pod não pode ser atendida pelos tipos de instância de nó atuais, execute o comando a seguir:

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

Para que a solicitação de recurso seja atendida, modifique as solicitações de recursos do pod ou crie um novo grupo de nós. Ao criar um novo grupo de nós, verifique se o tipo de instância dos nós pode atender ao requisito de recurso para pods.

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

Verifique se os taints estão configurados para o nó e se o pod pode tolerá-los ao executar o comando a seguir:

kubectl describe node <example_nodename> | grep taint -A2

Se os taints estiverem configurados, remova os que estão definidos no nó. Se o pod não puder tolerar taints, defina as tolerâncias no pod para que ele possa ser programado no nó com os taints.

Verifique se o nó está anotado com scale-down-disable

Para verificar se o nó está anotado com scale-down-disable, execute o comando a seguir:

kubectl describe node <example_nodename> | grep scale-down-disable

O resultado esperado é apresentado a seguir:

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

Se scale-down-disable estiver definido como “true” (verdadeiro), remova a anotação para que o nó possa reduzir a escala verticalmente ao executar o comando a seguir:

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

Para obter mais informações sobre a solução de problemas, consulte Cluster Autoscaler FAQ (Perguntas frequentes sobre o Cluster Autoscaler) no site do GitHub.


AWS OFICIAL
AWS OFICIALAtualizada há um ano