Como descubro automaticamente as sub-redes usadas pelo Application Load Balancer no Amazon EKS?
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 usada pelo seu Application Load Balancer usa, o Kubernetes Cloud Controller Manager (cloud-controller-manager) e o AWS Load Balancer Controller (aws-load-balancer-controller) para consultar as sub-redes de um cluster. A consulta usa a seguinte tag como filtro:
kubernetes.io/cluster/cluster-name shared
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
Adicionar tags a sub-redes
Para marcar suas sub-redes, conclua as etapas a seguir:
-
Implante o Complemento AWS Load Balancer Controller do seu cluster do Amazon EKS.
-
Verifique se o AWS Load Balancer Controller está instalado:
kubectl get deployment -n kube-system aws-load-balancer-controller
Observação: se estiver implantando em um namespace diferente, substitua -n kube-system pelo namespace apropriado.
-
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 cria balanceadores de carga. O recurso do Ingress configura o Application Load Balancer para rotear o tráfego HTTP (S) para diferentes pods em seu cluster.
-
Adicione uma anotação interna ou voltada para a Internet para especificar onde você deseja que o Ingress crie seu balanceador de carga:
alb.ingress.kubernetes.io/scheme: internal -or- alb.ingress.kubernetes.io/scheme: internet-facing
Observação: selecione interno para criar um balanceador de carga interno ou voltado para a Internet para criar um balanceador de carga público.
-
Use tags para permitir que o AWS Load Balancer Controller crie um balanceador de carga que descubra automaticamente suas sub-redes. Tags não podem ter espaços no início ou no final. Por exemplo:
kubernetes.io/role/internal-elb Set to 1 or empty tag value for internal load balancers kubernetes.io/role/elb Set to 1 or empty tag value for internet-facing load balancers
Observação: você pode usar tags para descoberta automática em vez da anotação manual alb.ingress.kubernetes.io/subnets.
Exemplo de sub-rede com as tags corretas para um cluster que possui um balanceador de carga interno:kubernetes.io/role/internal-elb 1
Exemplo de uma sub-rede com as tags corretas para um cluster que possui um balanceador de carga público:
kubernetes.io/role/elb 1
Observação: para clusters versões 1.18 e anteriores, o Amazon EKS adiciona a tag a seguir a todas as sub-redes transmitidas durante a criação do cluster. A tag não foi adicionada aos clusters da versão 1.19. Se você usar a tag e atualizar para a versão 1.19 do cluster, não será necessário adicionar a tag novamente. A tag permanece na sua sub-rede.
Você pode usar a tag a seguir para controlar onde um Application Load Balancer é alocado. Para vários clusters, use esta tag além das tags necessárias para alocar automaticamente um Application Load Balancer no cluster do EKS:
kubernetes.io/cluster/$CLUSTER_NAME shared
-
Verifique se suas sub-redes possuem as tags corretas:
aws ec2 describe-subnets --subnet-ids your-subnet-xxxxxxxxxxxxxxxxx
-
Implante uma aplicação de exemplo para verificar se o AWS Load Balancer Controller cria um Application Load Balancer por causa do objeto Ingress:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
-
Verifique se o recurso de Ingresso foi criado e tem um Application Load Balancer associado:
kubectl get ingress/2048-ingress -n game-2048
Um balanceador de carga interno ou voltado para a Internet é criado, dependendo das anotações (alb.ingress.kubernetes.io/scheme:) que você definiu no objeto Ingress e nas sub-redes.
Solucionar erros comuns de tags
Os seguintes erros geralmente ocorrem quando você usa tags para descobrir sub-redes automaticamente.
Erro de permissões negadas
Você recebe a seguinte mensagem de erro quando o perfil do AWS Identity and Access Management (IAM) da sua conta 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 esse problema, realize as etapas a seguir:
-
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
cVocê recebe um resultado semelhante ao seguinte:
serviceAccount: aws-load-balancer-controllerserviceAccountName: aws-load-balancer-controller
Observação: se estiver implantando em um namespace diferente, substitua -n kube-system pelo namespace apropriado.
-
Verifique qual perfil do IAM está anexado à conta de serviço associada ao AWS Load Balancer Controller:
$ kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arn
cVocê recebe um resultado semelhante ao seguinte:
annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxx:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-xxxxxxxxxxxxx
-
Conceda todas as permissões relevantes ao seu perfil do IAM, como ec2:DescribeAvailabilityZones. Para obter mais informações sobre como o AWS Load Balancer Controller assume um perfil do IAM para executar chamadas de API, consulte IAM roles for service accounts. Para obter uma lista de permissões relevantes, consulte IAM JSON policy, na página da web do AWS Load Balancer Controller do GitHub.
Erro de descoberta de sub-rede única
Você recebe uma das seguintes mensagens de erro quando o controlador do AWS Load Balancer 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 apropriadas às suas sub-redes para permitir que o AWS Load Balancer Controller use a descoberta automática para criar um balanceador de carga:
Tags de sub-redes privadas:
kubernetes.io/role/internal-elb Set to 1 or empty tag value for internal load balancers
Tags 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 seu balanceador de carga com a anotação alb.ingress.kubernetes.io/subnets.
Identifique suas sub-redes com o seguinte formato, sem espaços iniciais ou finais:
Chave: kubernetes.io/cluster/your-cluster-name
Valor: shared ou owned
Se você usar o AWS Load Balancer Controller versão v2.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 controlador do AWS Load Balancer não descobre duas ou mais sub-redes qualificadas:
“{" level” :"error”, "ts” :"2024-08-12T 19:01:27 Z”, "msg” :"Erro de reconciliador”, "controlador” :"entrada”, "object”: {"name” :"ingress-2048", "namespace” :"game-2048"}, "namespace” :"game-2048", "name” :"name” :"name” :"name” :"name” :"name” :"name” :"name” :"namespace” :"game-2048", "name” :"name” :"name” :"name” :"name” :"name” :"name” :"name” :"name” :"name” :"name” :"name” :"name” :"namespace "ingress-2048", "reconcileID” :"1234567", "error” :"não foi possível descobrir sub-redes automaticamente: não foi possível resolver pelo menos uma sub-rede (2 correspondem à VPC e às tags:\ [ kubernetes.io/role/internal-elb], 2 têm menos de 8 IPs gratuitos) "}”
Para solucionar esse problema, realize as etapas a seguir:
- Confirme se você tem pelo menos duas sub-redes em duas zonas de disponibilidade diferentes. Este é um requisito para criar um Application Load Balancer.
Observação: você pode criar um Network Load Balancer com uma única sub-rede. - Para cada sub-rede, especifique um bloco CIDR com pelo menos uma máscara de bits /27 (por exemplo: 10.0.0.0/27) e pelo menos oito endereços IP livres.
- Confirme que as tags nas sub-redes estão formatadas corretamente. Por exemplo, as tags não podem ter espaços no início ou no final.
Vídeos relacionados
Conteúdo relevante
- Resposta aceitafeita há 13 diaslg...
- feita há 15 diaslg...
- feita há 15 diaslg...
- feita há um mêslg...
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 3 meses
- AWS OFICIALAtualizada há um ano