Por que meu AWS Load Balancer Controller não consegue encontrar minha sub-rede no Amazon EKS?

Última atualização: 2021-10-06

Meu AWS Load Balancer Controller não consegue encontrar minha sub-rede no Amazon Elastic Kubernetes Service (Amazon EKS).

Descrição breve

Você receberá um erro se o AWS Load Balancer Controller não conseguir encontrar sua sub-rede no Amazon EKS.

Se você receber o erro a seguir, a função do AWS Identity and Access Management (IAM) da sua conta de serviço para o AWS Load Balancer Controller não tem as permissões necessárias:

{"level":"error","ts":1621443417.9175518,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":" ingress-2048","namespace":" game-2048","error":"couldn't auto-discover subnets: UnauthorizedOperation: You are not authorized to perform this operation.\n\tstatus code: 403, request id: 72ee57ae-f804-4f81-b069-8b04114b67b0"}

Para solucionar o erro anterior, execute as etapas na seção Solucionar o erro de permissão negada:

-ou-

Se você receber o erro a seguir, o AWS Load Balancer Controller não consegue descobrir pelo menos uma sub-rede:

{"level":"error","ts":1608229710.3212903,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"ingress-2048","namespace":"game-2048","error":"couldn't auto-discover subnets: unable to discover at least one subnet"}

Para solucionar o erro anterior, execute as etapas na seção Solucionar o erro único de descoberta sub-rede:

-ou-

Se você receber um dos erros a seguir, o AWS Load Balancer Controller não consegue descobrir duas ou mais sub-redes qualificadas.

"msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to failed to resolve 2 qualified subnet with at least 8 free IP Addresses for ALB
{"level":"error","ts":1606329481.2930484,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"reciter-ing","namespace":"reciter","error":"InvalidSubnet: Not enough IP space available in subnet-xxxxxxxxxxxxxx. ELB requires at least 8 free IP addresses in each subnet.\n\tstatus code: 400, request id: 2a37780c-f411-xxxxx-xxxxx-xxxxxxxxx"}

Para solucionar os erros anteriores, execute as etapas na seção Solucionar vários erros de descoberta de sub-rede:

Resolução

Solucionar o erro de permissão negada

1.    Verifique se sua conta de serviço está associada ao AWS Load Balancer Controller:

$ kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount

Resultado:

serviceAccount: aws-load-balancer-controller
serviceAccountName: aws-load-balancer-controller

Observação: se a implantação for implantada em um namespace diferente, substitua -n kube-system pelo namespace apropriado.

2.    Veja qual função do IAM está vinculada à conta de serviço associada ao AWS Load Balancer Controller:

$ kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arn

Resultado:

annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxx:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-xxxxxxxxxxxxx

3.    Conceda permissões EC2:DescribeAvailabilityZones à função do IAM identificada na etapa 2.

Solucionar o erro único de descoberta sub-rede

1.    Adicione as etiquetas adequadas a suas sub-redes para permitir que o AWS Load Balancer Ingress Controller crie um balanceador de carga usando a descoberta automática.

Exemplo de etiquetas de sub-redes privadas:

kubernetes.io/role/internal-elb                Set to 1 or empty tag value for internal load balancers

Exemplo de etiquetas de sub-redes públicas:

kubernetes.io/role/elb                         Set to 1 or empty tag value for internet-facing load balancers

Observação: você pode atribuir manualmente sub-redes ao balanceador de carga usando a anotação alb.ingress.kubernetes.io/subnets. Para mais informações, consulte Anotações de entrada no site do AWS Load Balancer Controller.

Exemplo de uma sub-rede com as etiquetas corretas para um cluster com um balanceador de carga interno (sub-rede privada):

kubernetes.io/role/internal-elb          1

Exemplo de uma sub-rede com as etiquetas corretas para um cluster com um balanceador de carga público (sub-rede pública):

kubernetes.io/role/elb

2.    Etiquete suas sub-redes com o formato adequado.

Chave: kubernetes.io/cluster/nome-do-seu-cluster

Valor: shared (compartilhado) ou owned (particular)

Importante: se estiver usando o AWS Load Balancer Controller versão v2.1.1 ou anterior, é necessário etiquetar suas sub-redes no formato anterior. A etiquetagem é opcional para as versões 2.1.2 ou posteriores. Uma das práticas recomendadas é etiquetar uma sub-rede se alguma das seguintes situações for verdadeira:

  • Você tem vários clusters em execução na mesma VPC.
  • Você tem vários serviços da AWS que compartilham sub-redes em uma VPC.
  • Você quer ter mais controle sobre onde os balanceadores de carga são provisionados para cada cluster.

Solucionar vários erros de descoberta de sub-rede

1.    Confirme se tem pelo menos duas sub-redes em duas zonas de disponibilidade diferentes. Isso é um requisito para criar um balanceador de carga da aplicação.

Observação: é possível criar um balanceador de carga da rede com uma única sub-rede.

2.    Para cada sub-rede, especifique um bloco CIDR com um bitmask mínimo de /27 (p. ex.: 10.0.0.0/27) e pelo menos 8 endereços IP livres.

3.    Confirme se as etiquetas nas sub-redes estão formatadas corretamente. Por exemplo, as etiquetas não podem ter espaços à esquerda ou à direita.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?