Warum kann mein AWS Load Balancer Controller mein Subnetz in Amazon EKS nicht finden?

Letzte Aktualisierung: 12.01.2023

Mein AWS Load Balancer Controller kann mein Subnetz nicht im Amazon Elastic Kubernetes Service (Amazon EKS) finden.

Kurzbeschreibung

Wenn Ihr AWS Load Balancer Controller Ihr Subnetz in Amazon EKS nicht finden kann, erhalten Sie eine Fehlermeldung. Um Ihren Fehler zu beheben, führen Sie die entsprechenden Schritte für die Fehlermeldung aus, die Sie erhalten.

Der folgende Fehler tritt auf, wenn die AWS Identity and Access Management (IAM) -Rolle Ihres Kontos für den AWS Load Balancer Controller nicht über die erforderlichen Berechtigungen verfügt:

{"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"}

Um den vorherigen Fehler zu beheben, führen Sie die Schritte im Abschnitt Beheben des Fehlers mit der verweigerten Berechtigung aus.

-oder-

Der folgende Fehler tritt auf, wenn Ihr AWS Load Balancer Controller nicht mindestens ein Subnetz erkennen kann:

{"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"}

Um den vorherigen Fehler zu beheben, führen Sie die Schritte im Abschnitt Behebung des Einzelsubnetzerkennungsfehlers aus.

-oder-

Die folgenden Fehler treten auf, wenn Ihr AWS Load Balancer Controller zwei oder mehr qualifizierte Subnetze nicht erkennen kann:

"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"}

Um die vorherigen Fehler zu beheben, führen Sie die Schritte im Abschnitt Erkennungsfehler mehrerer Subnetze beheben aus.

Lösung

Beheben des Fehlers Berechtigung verweigert

1.    Geben Sie den folgenden Befehl ein, um sicherzustellen, dass Ihr Servicekonto dem AWS Load Balancer Controller zugeordnet ist:

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

Sie erhalten eine Ausgabe ähnlich der folgenden:

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

Hinweis: Wenn Ihre Bereitstellung in einem anderen Namespace bereitgestellt wird, ersetzen Sie -n kube-system durch den entsprechenden Namespace.

2.    Überprüfen Sie, welche IAM-Rolle dem Servicekonto zugeordnet ist, das dem AWS Load Balancer Controller zugeordnet ist:

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

Sie erhalten eine Ausgabe ähnlich der folgenden:

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

3.    Erteilen Sie ec2:DescribeAvailabilityZones-Berechtigungen für die IAM-Rolle, die Sie in Schritt 2 identifizieren.

Beheben Sie den Erkennungsfehler eines einzelnen Subnetz

1.    Fügen Sie Ihren Subnetzen die entsprechenden Tags hinzu, damit der AWS Load Balancer Ingress Controller mithilfe von Autodiscovery einen Load Balancer erstellen kann.

Im Folgenden finden Sie ein Beispiel für private Subnetz-Tags:

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

Im Folgenden finden Sie ein Beispiel für private Subnetz-Tags:

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

Hinweis: Sie können Ihrem Load Balancer mithilfe der Annotation alb.ingress.kubernetes.io/subnets manuell Subnetze zuweisen. Weitere Informationen finden Sie unter Ingress-Anmerkungen auf der AWS Load Balancer Controller-Website.

Im Folgenden finden Sie ein Beispiel für ein Subnetz mit den richtigen Tags für einen Cluster mit einem internen Load Balancer (privates Subnetz):

kubernetes.io/role/internal-elb          1

Im Folgenden finden Sie ein Beispiel für ein Subnetz mit den richtigen Tags für einen Cluster mit einem öffentlichen Load Balancer (öffentliches Subnetz):

kubernetes.io/role/elb

2.    Markieren Sie Ihre Subnetze mit dem entsprechenden Format.

Schlüssel: kubernetes.io/cluster/your-cluster-name

Wert: shared (geteilt) oder owned (eigen)

Wichtig: Wenn Sie vom AWS Load Balancer Controller die Version v2.1.1 oder früher verwenden, müssen Sie Ihre Subnetze im vorherigen Format kennzeichnen. Markieren ist für Versionen 2.1.2 oder höher optional. Es ist eine bewährte Methode, ein Subnetz zu markieren, wenn eine der folgenden Bedingungen zutrifft:

  • Sie haben mehrere Cluster, die in derselben VPC ausgeführt werden.
  • Sie haben mehrere AWS-Services, die Subnetze in einer VPC gemeinsam nutzen.
  • Sie möchten mehr Kontrolle darüber haben, wo Load Balancer für jeden Cluster bereitgestellt werden.

Beheben mehrerer Subnetz-Erkennungsfehler

1.    Stellen Sie sicher, dass Sie mindestens zwei Subnetze in zwei verschiedenen Availability Zones haben. Dies ist eine Voraussetzung für die Erstellung eines Application Load Balancers.

Hinweis: Sie können einen Network Load Balancer mit einem einzelnen Subnetz erstellen.

2.    Geben Sie für jedes Subnetz einen CIDR-Block mit mindestens einer /27-Bitmaske an (zum Beispiel: 10.0.0.0/27) und mindestens acht freie IP-Adressen.

3.    Vergewissern Sie sich, dass die Tags in den Subnetzen korrekt formatiert sind. Beispielsweise dürfen die Tags keine Leerzeichen am Anfang oder Ende haben.


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?