Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Come posso scoprire automaticamente le sottoreti utilizzate dal mio Application Load Balancer in Amazon EKS?
Desidero scoprire automaticamente le sottoreti utilizzate dal mio Application Load Balancer (ALB) in Amazon Elastic Kubernetes Service (Amazon EKS).
Breve descrizione
Per identificare le sottoreti che utilizza Application Load Balancer, Kubernetes Cloud Controller Manager (cloud-controller-manager) e AWS Load Balancer Controller (aws-load-balancer-controller) interrogano le sottoreti di un cluster. Questa query utilizza il seguente tag come filtro:
kubernetes.io/cluster/cluster-name shared
Nota: Sostituisci cluster-name con il nome del tuo cluster Amazon EKS.
Per consentire all'AWS Load Balancer Controller di rilevare automaticamente le sottoreti utilizzate dall'Application Load Balancer, assegna un tag alle sottoreti.
Risoluzione
Aggiungere tag alle sottoreti
Per etichettare le tue sottoreti, completa i seguenti passaggi:
-
Implementa il componente aggiuntivo AWS Load Balancer Controller per il tuo cluster Amazon EKS.
-
Verifica che AWS Load Balancer Controller sia installato:
kubectl get deployment -n kube-system aws-load-balancer-controller
Nota: Se la distribuzione è distribuita in uno spazio dei nomi diverso, sostituisci -n kube-system con lo spazio dei nomi appropriato.
-
Crea una risorsa Kubernetes Ingress sul tuo cluster con la seguente annotazione:
annotations: kubernetes.io/ingress.class: alb
Nota: L'AWS Load Balancer Controller crea sistemi di bilanciamento del carico. La risorsa Ingress configura Application Load Balancer per indirizzare il traffico HTTP(S) verso diversi pod all'interno del cluster.
-
Aggiungi un'annotazione interna o internet-facing per specificare dove desideri che Ingress crei il tuo sistema di bilanciamento del carico:
alb.ingress.kubernetes.io/scheme: internal -or- alb.ingress.kubernetes.io/scheme: internet-facing
Nota: Scegli interno per creare un sistema di bilanciamento del carico interno o internet-facing per creare un sistema di bilanciamento del carico pubblico.
-
Usa i tag per consentire all'AWS Load Balancer Controller di creare un sistema di bilanciamento del carico che rileva automaticamente le tue sottoreti. I tag non possono avere spazi iniziali o finali. Ad esempio:
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
Nota: Puoi usare i tag per il rilevamento automatico invece dell'annotazione manuale alb.ingress.kubernetes.io/subnets.
Esempio di sottorete con i tag corretti per un cluster con un sistema di bilanciamento del carico interno:kubernetes.io/role/internal-elb 1
Esempio di sottorete con i tag corretti per un cluster con un sistema di bilanciamento del carico pubblico:
kubernetes.io/role/elb 1
Nota: Per le versioni del cluster 1.18 e precedenti, Amazon EKS aggiunge il seguente tag a tutte le sottoreti trasmesse durante la creazione del cluster. Il tag non viene aggiunto ai cluster della versione 1.19. Se utilizzi il tag e esegui l'aggiornamento alla versione 1.19 del cluster, non devi aggiungere nuovamente il tag. Il tag rimane nella tua sottorete.
È possibile utilizzare il seguente tag per controllare dove viene eseguito il provisioning di un Application Load Balancer. Per più cluster, utilizza questo tag in aggiunta ai tag richiesti per allocare automaticamente un Application Load Balancer nel cluster EKS:
kubernetes.io/cluster/$CLUSTER_NAME shared
-
Verifica che le tue sottoreti abbiano i tag corretti:
aws ec2 describe-subnets --subnet-ids your-subnet-xxxxxxxxxxxxxxxxx
-
Implementa un'applicazione di esempio per verificare che AWS Load Balancer Controller crei un Application Load Balancer pubblico legato all'oggetto Ingress:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
-
Verifica che la risorsa Ingress sia stata creata e abbia un Application Load Balancer associato:
kubectl get ingress/2048-ingress -n game-2048
Viene creato un sistema di bilanciamento del carico interno o internet-facing, a seconda delle annotazioni (alb.ingress.kubernetes.io/scheme:) che hai definito nell'oggetto e nelle sottoreti di Ingress.
Risolvi i problemi più comuni relativi ai tag
I seguenti errori si verificano in genere quando si utilizzano i tag per rilevare automaticamente le sottoreti.
Errore relativo alle autorizzazioni negate
Quando il ruolo AWS Identity and Access Management (IAM) del tuo account per AWS Load Balancer Controller non dispone delle autorizzazioni richieste, viene visualizzato il seguente messaggio di errore:
"{"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"}"
Per risolvere questo problema, completa i seguenti passaggi:
-
Verifica che il tuo account di servizio sia associato all'AWS Load Balancer Controller:
$ kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount
Riceverai un output simile al seguente esempio:
serviceAccount: aws-load-balancer-controllerserviceAccountName: aws-load-balancer-controller
Nota: Se la distribuzione è distribuita in uno spazio dei nomi diverso, sostituisci -n kube-system con lo spazio dei nomi appropriato.
-
Verifica quale ruolo IAM è associato all'account di servizio associato all'AWS Load Balancer Controller:
$ kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arn
Riceverai un output simile al seguente esempio:
annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxx:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-xxxxxxxxxxxxx
-
Concedi tutte le autorizzazioni pertinenti al tuo ruolo IAM, ad esempio ec2:DescribeAvailabilityZones. Per ulteriori informazioni su come AWS Load Balancer Controller assume un ruolo IAM per eseguire chiamate API, consulta Ruoli IAM per gli account di servizio. Per un elenco delle autorizzazioni pertinenti, consulta la policy IAM JSON sulla pagina web AWS Load Balancer Controller di GitHub.
Errore di rilevamento di una singola sottorete
Quando il controller AWS Load Balancer non rileva almeno una sottorete, viene visualizzato uno dei seguenti messaggi di errore:
"{"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"}"
-or-
"kubebuilder/controller "msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to
retrieval of subnets failed to resolve 2 qualified subnets. Le sottoreti devono contenere il tag kubernetes.io/cluster/\u003ccluster name\u003e con il valore condiviso o di proprietà e il tag kubernetes.io/role/elb che indica che deve essere utilizzato per gli ALB. Inoltre, devono essere presenti almeno 2 sottoreti con zone di disponibilità uniche, come richiesto dagli ALB. Contrassegna le sottoreti per soddisfare questo requisito o utilizza l'annotazione delle sottoreti sulla risorsa di ingresso per indicare esplicitamente quali sottoreti utilizzare per la creazione di ALB. Le sottoreti risolte sono state []" "controller"="alb-ingress-controller" "request"={"Namespace":"default","Name":"2048-ingress"}"
Per risolvere questo problema, aggiungi i tag appropriati sulle tue sottoreti per consentire al controller AWS Load Balancer di utilizzare l'individuazione automatica per creare un sistema di bilanciamento del carico:
Tag delle sottoreti private:
kubernetes.io/role/internal-elb Set to 1 or empty tag value for internal load balancers
Tag delle sottoreti pubbliche:
kubernetes.io/role/elb Set to 1 or empty tag value for internet-facing load balancers
Nota: Puoi assegnare manualmente le sottoreti al tuo load balancer con l'annotazione alb.ingress.kubernetes.io/subnets.
Contrassegna le tue sottoreti con il seguente formato senza spazi iniziali o finali:
Chiave: kubernetes.io/cluster/your-cluster-name
Valore: condiviso o di proprietà
Se utilizzi AWS Load Balancer Controller versione v2.1.1 o precedente, devi etichettare le sottoreti nel formato precedente. L'etichettatura è opzionale per le versioni 2.1.2 o successive.
È consigliabile etichettare una sottorete nei seguenti scenari:
- Hai più cluster che vengono eseguiti nello stesso cloud privato virtuale (VPC).
- Hai più servizi AWS che condividono sottoreti in un VPC.
- Desideri un maggiore controllo su dove sono allocati i load balancer per ogni cluster.
Errori di rilevamento di più sottoreti
Quando il controller AWS Load Balancer non rileva due o più sottoreti qualificate, viene visualizzato il seguente messaggio di errore:
«{" level» :"error», "ts» :"2024-08-12T 19:01:27 Z», "msg» :"Errore di riconciliazione», "controller» :"ingress», "object»: {"name» :"ingress-2048", "namespace» :"game-2048"}, "namespace» :"game-2048", "nome» :"ingress-2048", "reconcileID» :"1234567", "error» :"impossibile scoprire automaticamente le sottoreti: impossibile risolvere almeno una sottorete (2 corrispondono a VPC e tag:\ [ kubernetes.io/role/internal-elb], 2 hanno meno di 8 IP gratuiti) "}»
Per risolvere questo problema, completa i seguenti passaggi:
- Conferma di avere almeno due sottoreti in due diverse zone di disponibilità. Questo è un requisito per creare un Application Load Balancer.
Nota: È possibile creare un Network Load Balancer con una singola sottorete. - Per ogni sottorete, specifica un blocco CIDR con almeno una maschera di bit /27 (ad esempio: 10.0.0.0/27) e almeno otto indirizzi IP gratuiti.
- Verifica che i tag sulle sottoreti siano formattati correttamente. Ad esempio, i tag non possono avere spazi iniziali o finali.
Video correlati


Contenuto pertinente
- AWS UFFICIALEAggiornata 3 anni fa