Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Wie kann ich die von meinem Application Load Balancer in Amazon EKS verwendeten Subnetze automatisch ermitteln?
Ich möchte automatisch die von meinem Application Load Balancer (ALB) in Amazon Elastic Kubernetes Service (Amazon EKS) verwendeten Subnetze ermitteln.
Kurzbeschreibung
Um das Subnetz zu identifizieren, das dein Application Load Balancer verwendet, fragt der AWS Load Balancer Controller aws-load-balancer-controller die Subnetze des Clusters ab. Diese Abfrage verwendet die folgenden Tags als Filter:
kubernetes.io/cluster/cluster-name shared kubernetes.io/role/elb 1 OR kubernetes.io/role/internal-elb 1
Hinweis: Ersetzen Sie cluster-name durch den Namen Ihres Amazon-EKS-Clusters.
Damit der AWS Load Balancer Controller automatisch die Subnetze erkennt, die dein Application Load Balancer verwendet, kennzeichne deine Subnetze.
Lösung
Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.
Tags zu Subnetzen hinzufügen
Führe die folgenden Schritte aus:
- Stelle den AWS Load Balancer Controller auf deinem Amazon EKS-Cluster bereit.
- Führe den folgenden Befehl aus, um zu überprüfen, ob du den AWS Load Balancer Controller korrekt installiert hast:
Hinweis: Wenn du den AWS Load Balancer Controller in einem anderen Namespace bereitgestellt hast, ersetze -n kube-system durch den richtigen Namespace.kubectl get deployment -n kube-system aws-load-balancer-controller - Erstelle eine Kubernetes-Eingangsressource in deinem Cluster mit der folgenden Anmerkung:
Hinweis: Der AWS Load Balancer Controller hilft bei der Erstellung von Load Balancern. Die Eingangsressource konfiguriert den Application Load Balancer für die Weiterleitung von HTTP- und HTTPS-Verkehr an verschiedene Pods in deinem Cluster.annotations: kubernetes.io/ingress.class: alb - Gib unter den Anmerkungen zum Eingangsobjekt internal ein, um einen internen Load Balancer zu erstellen, oder internet-facing, um einen öffentlichen Load Balancer zu erstellen:
-oder-alb.ingress.kubernetes.io/scheme: internal
Hinweis: Du kannst Tags für die automatische Erkennung von Subnetzen anstelle der manuellen Anmerkung alb.ingress.kubernetes.io/subnets verwenden.alb.ingress.kubernetes.io/scheme: internet-facing
Für Cluster-Versionen 1.18 und früher fügt Amazon EKS allen Subnetzen, die Amazon EKS bei der Cluster-Erstellung übergibt, das folgende Tag hinzu:
Hinweis: Ersetze CLUSTER_NAME durch deinen Cluster-Namen.kubernetes.io/cluster/CLUSTER_NAME
Das Tag kubernetes.io/cluster/CLUSTER_NAME ist nur erforderlich, wenn du AWS Load Balancer Controller Version 2.1.1 oder früher verwendest. Amazon EKS fügt dieses Tag nicht automatisch hinzu oder entfernt es. Obwohl das Tag für Cluster vor Version 1.19 erforderlich war, verbleibt es auch nach Cluster-Upgrades in Subnetzen. - Um zu überprüfen, ob deine Subnetze die richtigen Tags haben, führe den folgenden describe-subnets-AWS-CLI-Befehl aus:
Hinweis: Ersetze your-subnet-abcdefghxyz durch deine Subnetz-ID.aws ec2 describe-subnets --subnet-ids your-subnet-abcdefghxyz - Führe den folgenden Befehl aus, um eine Beispielanwendung bereitzustellen:
Hinweis: Der vorhergehende Befehl erstellt aufgrund des Eingangsobjekts einen Application Load Balancer.kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml - Um zu überprüfen, ob Amazon EKS die Eingangsressource und einen zugehörigen Application Load Balancer erstellt hat, führe den folgenden Befehl aus:
kubectl get ingress/2048-ingress -n game-2048
Tag-Fehler beheben
Führe die folgenden Aktionen auf der Grundlage des Fehlers aus, der angezeigt wird, wenn du Tags zur automatischen Erkennung von Subnetzen verwendest.
Probleme mit verweigerten Berechtigungen
Die AWS Identity and Access Management (IAM)-Rolle deines AWS-Kontos für den AWS Load Balancer Controller muss über die erforderlichen Berechtigungen verfügen. Ist dies nicht der Fall, erhältst du die folgende Fehlermeldung:
"{"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"}"
Gehe wie folgt vor, um dieses Problem zu beheben:
-
Führe den folgenden Befehl aus, um zu überprüfen, ob dein Dienstkonto mit dem AWS Load Balancer Controller verknüpft ist:
kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccountHinweis: Wenn du den AWS Load Balancer Controller in einem anderen Namespace bereitgestellt hast, ersetze -n kube-system durch den richtigen Namespace.
Beispielausgabe:serviceAccount: aws-load-balancer-controller serviceAccountName: aws-load-balancer-controller -
Führe den folgenden Befehl aus, um die IAM-Rolle zu identifizieren, die dem Dienstkonto zugeordnet ist, das du dem AWS Load Balancer Controller zugeordnet hast:
kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arnBeispielausgabe:
annotations: eks.amazonaws.com/role-arn: arn:aws:iam::abcdefxyz:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-abcdefxyz
Hinweis: Wenn du keine IAM-Rollen für Dienstkonten (IRSA) verwendest, stelle sicher, dass die Amazon EKS-Worker-Knoten-IAM-Rolle über die erforderlichen Berechtigungen verfügt. Die erforderlichen Berechtigungen findest du unter iam_policy.json auf der GitHub-Website.
Problem bei der Erkennung eines einzelnen Subnetzes
Du erhältst eine der folgenden Fehlermeldungen, wenn dein AWS Load Balancer Controller nicht mindestens ein Subnetz erkennt:
"{"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"}"
-oder-
"kubebuilder/controller "msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to
retrieval of subnets failed to resolve 2 qualified subnets. Subnetze müssen das Tag kubernetes.io/cluster/\ u003ccluster name\u003e mit dem Wert shared oder owned und das Tag kubernetes.io/role/elb enthalten, das bedeutet, dass es für ALBs verwendet werden sollte. Außerdem müssen mindestens 2 Subnetze mit eindeutigen Availability Zones vorhanden sein, wie für ALBs notwendig. Markiere entweder Subnetze, um diese Anforderung zu erfüllen, oder verwende die Subnetz-Anmerkung auf der Eingangsressource, um explizit anzugeben, welche Subnetze für die ALB-Erstellung verwendet werden sollen. Die Subnetze, die aufgelöst wurden, waren []" "controller"="alb-ingress-controller" "request"={"Namespace":"default","Name":"2048-ingress"}"
Um dieses Problem zu beheben, füge Tags zu deinen Subnetzen hinzu, damit der AWS Load Balancer Controller die automatische Erkennung verwenden kann, um einen Load Balancer zu erstellen.
Füge für private Subnetze das folgende Tag hinzu:
kubernetes.io/role/internal-elb 1
Füge für öffentliche Subnetze das folgende Tag hinzu:
kubernetes.io/role/elb 1
Hinweis: Mit der Anmerkung alb.ingress.kubernetes.io/subnets kannst du deinem Load Balancer manuell Subnetze zuweisen. Die erforderlichen Berechtigungen findest du unter iam_policy.json auf der GitHub-Website.
Kennzeichne deine Subnetze mit dem folgenden Format ohne führende oder nachfolgende Leerzeichen:
- Gib als Schlüssel kubernetes.io/cluster/your-cluster-name ein.
- Gib für Wert shared oder owned ein.
Wenn du den AWS Load Balancer Controller Version 2.1.1 oder früher verwendest, musst du deine Subnetze im vorstehenden Format kennzeichnen. Tagging ist für Versionen 2.1.2 oder höher optional.
In den folgenden Szenarien empfiehlt es sich, ein Subnetz zu kennzeichnen:
- Sie haben mehrere Cluster, die in derselben Virtual Private Cloud (VPC) ausgeführt werden.
- Sie haben mehrere AWS Services, die sich Subnetze in einer VPC teilen.
- Sie möchten mehr Kontrolle darüber haben, wo Load Balancer für jeden Cluster zugewiesen werden.
Fehler bei der Erkennung mehrerer Subnetze
Du erhältst die folgende Fehlermeldung, wenn dein AWS Load Balancer Controller nicht zwei oder mehr qualifizierte Subnetze erkennt:
"{"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)"}"
Gehe wie folgt vor, um dieses Problem zu beheben:
- Vergewissere dich, dass du mindestens zwei Subnetze in zwei verschiedenen Availability Zones hast.
Hinweis: Dies ist eine Voraussetzung, um einen Application Load Balancer zu erstellen. Du kannst einen Network Load Balancer mit einem einzigen Subnetz erstellen. - Gib für jedes Subnetz einen CIDR-Block mit mindestens einer /27-Bitmaske an, z. B. 10.0.0.0/27, und mindestens acht freien IP-Adressen.
- Vergewissere dich, dass du die Tags in den Subnetzen richtig formatiert hast. Beispielsweise dürfen Tags keine führenden oder nachfolgenden Leerzeichen haben.
- Themen
- Containers
- Sprache
- Deutsch
Ähnliche Videos

