Ir para o conteúdo

Como descubro automaticamente as sub-redes usadas pelo Application Load Balancer no Amazon EKS?

6 minuto de leitura
0

Quero descobrir automaticamente as sub-redes que meu Application Load Balancer usa no Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descrição

Para identificar a sub-rede que seu Application Load Balancer usa, o AWS Load Balancer Controller aws-load-balancer-controller consulta as sub-redes do cluster. A consulta usa as seguintes tags como filtro:

kubernetes.io/cluster/cluster-name      shared
kubernetes.io/role/elb                    1
OR    
kubernetes.io/role/internal-elb           1

Observação: substitua cluster-name pelo nome do seu cluster do Amazon EKS.

Para permitir que o AWS Load Balancer Controller descubra automaticamente as sub-redes usadas pelo Application Load Balancer, marque suas sub-redes.

Resolução

Observação: se você receber erros 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.

Adicionar tags a sub-redes

Conclua as etapas a seguir:

  1. Implante o AWS Load Balancer Controller em seu cluster do Amazon EKS.
  2. Para verificar se você instalou corretamente o AWS Load Balancer Controller, execute o seguinte comando:
    kubectl get deployment -n kube-system aws-load-balancer-controller
    Observação: se você implantou o AWS Load Balancer Controller em um namespace diferente, substitua -n kube-system pelo namespace correto.
  3. Crie um recurso do Kubernetes Ingress em seu cluster com a seguinte anotação:
    annotations:    kubernetes.io/ingress.class: alb
    Observação: o AWS Load Balancer Controller ajuda a criar balanceadores de carga. O recurso Ingress configura o Application Load Balancer para rotear o tráfego HTTP e HTTPS para diferentes pods em seu cluster.
  4. Nas anotações do objeto Ingress, insira internal para criar um balanceador de carga interno ou internet-facing para criar um balanceador de carga público:
    alb.ingress.kubernetes.io/scheme: internal            
    -ou-
    alb.ingress.kubernetes.io/scheme: internet-facing
    Observação: é possível usar tags para descoberta automática de sub-rede em vez da anotação manual alb.ingress.kubernetes.io/subnets.
    Para clusters versões 1.18 e anteriores, o Amazon EKS adiciona a seguinte tag a todas as sub-redes transmitidas pelo Amazon EKS durante a criação do cluster:
    kubernetes.io/cluster/CLUSTER_NAME
    Observação: substitua CLUSTER_NAME pelo nome do seu cluster.
    A tag kubernetes.io/cluster/CLUSTER_NAME só é obrigatória se você usar o AWS Load Balancer Controller versão 2.1.1 ou anterior. O Amazon EKS não adiciona nem remove automaticamente essa tag. Embora a tag fosse necessária para clusters antes da versão 1.19, ela permanece nas sub-redes mesmo após as atualizações do cluster.
  5. Para verificar se suas sub-redes têm as tags corretas, execute o seguinte comando describe-subnets da AWS CLI:
    aws ec2 describe-subnets --subnet-ids your-subnet-abcdefghxyz
    Observação: substitua your-subnet-abcdefghxyz pelo ID da sua sub-rede.
  6. Para implantar a aplicação de amostra, execute o seguinte comando:
    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
    Observação: o comando anterior cria um Application Load Balancer por causa do objeto Ingress.
  7. Para verificar se o Amazon EKS criou o recurso Ingress e um Application Load Balancer associado, execute o seguinte comando:
    kubectl get ingress/2048-ingress -n game-2048

Solucionar erros de tag

Execute as ações a seguir com base no erro que você recebe ao usar tags para descobrir sub-redes automaticamente.

Problemas de permissões negadas

O perfil do AWS Identity and Access Management (AWS IAM) da sua conta da AWS para o AWS Load Balancer Controller deve ter as permissões necessárias. Se isso não acontecer, você receberá a seguinte mensagem de erro:

"{"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 esse problema, conclua as etapas a seguir:

  1. Para verificar se sua conta de serviço está associada ao AWS Load Balancer Controller, execute o seguinte comando:

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

    Observação: se você implantou o AWS Load Balancer Controller em um namespace diferente, substitua -n kube-system pelo namespace correto.
    Exemplo de saída:

    serviceAccount: aws-load-balancer-controller
    serviceAccountName: aws-load-balancer-controller
  2. Para identificar o perfil do IAM vinculado à conta de serviço que você associou ao AWS Load Balancer Controller, execute o seguinte comando:

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

    Exemplo de saída:

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

Observação: se você não usa perfis do IAM para contas de serviço (IRSA), certifique-se de que o perfil do IAM do nó de processamento do Amazon EKS tenha as permissões necessárias. Para ver as permissões necessárias, consulte iam_policy.json no site do GitHub.

Problema de descoberta de sub-rede única

Você recebe uma das seguintes mensagens de erro quando o AWS Load Balancer Controller não descobre 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 resolve at least one subnet"}"

-ou-

"kubebuilder/controller "msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to
retrieval of subnets failed to resolve 2 qualified subnets. Subnets must contain the kubernetes.io/cluster/\u003ccluster name\u003e tag with a value of shared or owned and the kubernetes.io/role/elb tag signifying it should be used for ALBs Additionally, there must be at least 2 subnets with unique availability zones as required by ALBs. Either tag subnets to meet this requirement or use the subnets annotation on the ingress resource to explicitly call out what subnets to use for ALB creation. The subnets that did resolve were []" "controller"="alb-ingress-controller" "request"={"Namespace":"default","Name":"2048-ingress"}"

Para resolver esse problema, adicione as tags às suas sub-redes para permitir que o AWS Load Balancer Controller use a descoberta automática para criar um balanceador de carga.

Para sub-redes privadas, adicione a seguinte tag:

kubernetes.io/role/internal-elb                1

Para sub-redes públicas, adicione a seguinte tag:

kubernetes.io/role/elb                         1

Observação: é possível atribuir manualmente sub-redes ao seu balanceador de carga com a anotação alb.ingress.kubernetes.io/subnets. Para ver as permissões necessárias, consulte iam_policy.json no site do GitHub.

Identifique suas sub-redes com o seguinte formato, sem espaços iniciais ou finais:

  • Em Chave, digite kubernetes.io/cluster/your-cluster-name.
  • Em Valor, insira compartilhado ou próprio.

Se você usar o AWS Load Balancer Controller versão 2.1.1 ou anterior, deverá marcar suas sub-redes no formato anterior. A marcação é opcional para versões 2.1.2 ou posteriores.

É uma prática recomendada marcar uma sub-rede nos seguintes cenários:

  • Você tem vários clusters executados na mesma nuvem privada virtual (VPC).
  • Você tem vários serviços da AWS que compartilham sub-redes em uma VPC.
  • Você deseja mais controle sobre onde os balanceadores de carga são alocados para cada cluster.

Vários erros de descoberta de sub-rede

Você recebe a seguinte mensagem de erro quando o AWS Load Balancer Controller não descobre duas ou mais sub-redes qualificadas:

"{"level":"error","ts":"2024-08-12T19:01:27Z","msg":"Reconciler error","controller":"ingress","object":{"name":"ingress-2048","namespace":"game-2048"},"namespace":"game-2048","name":"ingress-2048","reconcileID":"1234567","error":"couldn't auto-discover subnets: unable to resolve at least one subnet (2 match VPC and tags: [kubernetes.io/role/internal-elb], 2 have fewer than 8 free IPs)"}"

Para solucionar esse problema, conclua as etapas a seguir:

  1. Confirme se você tem pelo menos duas sub-redes em duas zonas de disponibilidade diferentes.
    Observação: este é um requisito para criar um Application Load Balancer. É possível criar um Network Load Balancer com uma única sub-rede.
  2. Para cada sub-rede, especifique um bloco CIDR com pelo menos uma máscara de bits /27, como 10.0.0.0/27, e pelo menos oito endereços IP livres.
  3. Confirme se você formatou corretamente as tags nas sub-redes. Por exemplo, as tags não podem ter espaços no início ou no final.
AWS OFICIALAtualizada há um ano