Wie behebe ich Probleme mit Load Balancern, die vom Kubernetes-Servicecontroller in Amazon EKS erstellt wurden?

Lesedauer: 7 Minute
0

Ich kann keinen Kubernetes-Service erstellen, der von einem Load Balancer in Amazon Elastic Kubernetes Service (Amazon EKS) unterstützt wird.

Kurzbeschreibung

Amazon EKS verwendet einen von zwei Controllern zur Verwaltung eines Load Balancers: AWS Load Balancer Controller oder den Kubernetes-Servicecontroller. Die folgenden Schritte zur Fehlerbehebung gelten nur für Load Balancer, die vom Kubernetes-Servicecontroller verwaltet werden. Weitere Informationen finden Sie unter The Service Controller (Der Servicecontroller) auf der Website von Kubenetes AWS Cloud Provider und unter Type LoadBalancer (Typ „LoadBalancer“) auf der Kubernetes-Website.

Stellen Sie bei der Fehlerbehebung für Ihren Service-Load-Balancer sicher, dass Sie die über die folgenden Konfigurationen verfügen:

  • Die richtigen Tags für Ihre Amazon Virtual Private Cloud (Amazon VPC)-Subnetze
  • Die erforderlichen AWS Identity and Access Management (IAM)-Berechtigungen für die IAM-Rolle Ihres Clusters
  • Eine gültige Kubernetes-Servicedefinition
  • Load Balancer, die innerhalb Ihres Kontolimits bleiben
  • Genügend freie IP-Adressen in Ihren Subnetzen
  • Einen richtig konfigurierten Load Balancer zur Vermeidung von Problemen durch Verbindungtimeouts
  • Fehlerfreie Load-Balancer-Ziele

Wenn das Problem nach der Überprüfung aller vorangegangenen Punkte weiterhin besteht, befolgen Sie die Schritte im Abschnitt Weitere Schritte zur Fehlerbehebung versuchen.

Lösung

Die folgenden Schritte gelten für den Classic Load Balancer und den Network Load Balancer. Informationen zum Application Load Balancer finden Sie unter Application Load Balancing auf Amazon EKS.

Hinweis: Wenn beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, stellen Sie sicher, dass Sie die aktuelle Version der AWS CLI verwenden.

Verwenden die richtigen Tags für Ihre Amazon-VPC-Subnetze

1.    Öffnen Sie die Amazon-VPC-Konsole.

2.    Wählen Sie im Navigationsbereich die Option Subnetze aus.

3.    Wählen Sie die Registerkarte Tags für jedes Subnetz aus, und überprüfen Sie dann, ob ein Tag vorhanden ist. Beispiel:

Key: kubernetes.io/cluster/yourEKSClusterName  
Value: shared

Hinweis: In diesem Fall kann der Wert entweder freigegeben oder im Besitz sein.

Standardmäßig erkennt der Controller die Subnetze automatisch. Wenn es mehrere Subnetze pro Availability Zone gibt, dann priorisiert der Controller die Subnetze in der folgenden Reihenfolge:

  • Subnetze mit dem richtigen Rollen-Tag: kubernetes.io/role/elb für öffentliche Subnetze und kubernetes.io/role/internal-elb für private Subnetze
  • Subnetze mit dem Cluster-Tag: kubernetes.io/cluster/CLUSTER_NAME
  • Das Subnetz, das in lexikografischer Reihenfolge an erster Stelle steht

4.    Vergewissern Sie sich, dass für Ihre öffentlichen Subnetze das folgendes Tag vorhanden ist:

Key: kubernetes.io/role/elb  
Value: 1

Hinweis: Um festzustellen, ob ein Subnetz öffentlich ist, überprüfen Sie die Routing-Tabelle, die dem Subnetz zugeordnet ist. Ein öffentliches Subnetz hat eine Route zu einem Internet-Gateway (igw-xxxxxxxxxxx). Ein privates Subnetz hat eine Route zum Internet über ein NAT-Gateway oder eine NAT-Instance oder überhaupt keine Route zum Internet.

Wichtig: Sie benötigen das Tag in Schritt 4, um einen mit dem Internet verbundenen Load-Balancer-Service zu erstellen. Ein mit dem Internet verbundener Load Balancer leitet Anforderungen von Clients über das Internet an Ziele weiter.

5.    Vergewissern Sie sich, dass für Ihre privaten Subnetze das folgendes Tag vorhanden ist:

Key: kubernetes.io/role/internal-elb  
Value: 1

Wichtig: Sie benötigen das Tag in Schritt 5, um einen internen Load-Balancer-Service zu erstellen. Ein interner Load Balancer verwendet private IP-Adressen, um Anforderungen an Ziele weiterzuleiten.

Festlegen der erforderlichen AWS Identity and Access Management (IAM)-Berechtigungen für die IAM-Rolle Ihres Clusters

1.    Öffnen Sie die Amazon-EKS-Konsole.

2.    Wählen Sie im Navigationsbereich die Option Cluster aus.

3.    Wählen Sie Ihren Cluster aus und notieren Sie sich dann den IAM-Rollen-ARN des Clusters.

  1.    Öffnen Sie die IAM-Konsole.

5.    Wählen Sie im Navigationsbereich die Option Rollen aus.

6.    Wählen Sie die Rolle aus, die dem in Schritt 3 identifizierten IAM-Rollen-ARN des Clusters entspricht.

7.    Vergewissern Sie sich, dass die von AWS verwaltete Richtlinie AmazonEKSClusterPolicy mit Ihrer Rolle verknüpft ist.

Hinweis: Die Amazon-EKS-Steuerebene übernimmt die vorherige IAM-Rolle, um einen Load Balancer für Ihren Service zu erstellen.

Verwenden einer gültigen Kubernetes-Servicedefinition

Stellen Sie in der YAML-Datei für Ihren Kubernetes-Service sicher, dass spec.type auf LoadBalancer festgelegt ist.

Sehen Sie sich das folgende Beispiel für einen Kubernetes-Service an, der von einem Load Balancer unterstützt wird:

apiVersion: v1  
kind: Service  
metadata:  
  annotations:  
    # This annotation is only required if you are creating an internal facing ELB. Remove this annotation to create public facing ELB.  
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"  
  name: nginx-elb  
  labels:  
    app: nginx  
spec:  
  type: LoadBalancer  
  ports:  
  - name: "http"  
    port: 80  
    targetPort: 80  
  selector:  
    app: nginx

Hinweis: Informationen zum Anpassen Ihres Service mit einer anderen Anmerkung finden Sie auf der Kubernetes-Website unter Internal load balancer (Interner Load Balancer) und TLS support on AWS (TLS-Unterstützung in AWS).

Der in Kubernetes integrierte Servicecontroller erstellt standardmäßig einen Classic Load Balancer. Für die Bereitstellung von Network Load Balancer muss der Service die Anmerkung service.beta.kubernetes.io/aws-load-balancer-type: "nlb" aufweisen. Weitere Einzelheiten finden Sie auf der Kubernetes-Website unter Network Load Balancer support on AWS (Unterstützung von Network Load Balancer in AWS).

Sicherstellen, dass Ihre Load Balancer innerhalb Ihres Kontolimits liegen

Ein AWS-Konto verfügt standardmäßig über maximal 20 Load Balancer pro AWS-Region.

Um die Anzahl Ihrer Load Balancer zu überprüfen, öffnen Sie die Amazon Elastic Compute Cloud (Amazon EC2)-Konsole. Wählen Sie dann im Navigationsbereich die Option Load Balancer aus.

Wenn Sie die maximale Anzahl an Load Balancern erreicht haben, können Sie bei Service Quotas eine Erhöhung beantragen.

Sicherstellen, dass in Ihren Subnetzen genügend freie IP-Adressen vorhanden sind

Zum Erstellen eines Load Balancers muss jedes Subnetz dieses Load Balancers über mindestens acht freie IP-Adressen verfügen. Dies gilt sowohl für den Classic Load Balancer als auch für den Network Load Balancer.

Probleme durch Verbindungtimeouts

Wenn bei Ihrem Load Balancer zeitweise oder dauerhaft Timeoutprobleme auftreten, liegt möglicherweise ein Problem mit der Konfiguration des Load Balancers vor. Dies kann passieren, wenn der Back-End-Service den eingehenden Datenverkehr nicht verarbeiten kann oder zu viele Anforderungen an den Load Balancer gesendet werden. Weitere Informationen finden Sie unter Wie behebe ich die Fehler „Connection timed out“ bei Elastic Load Balancing?

Überprüfen der Zustandsprüfungen des Load Balancers

Wenn Sie den Endpunkt nicht richtig konfigurieren oder der Back-End-Service nicht auf Zustandsprüfungsanforderungen reagiert, treten Probleme bei der Load-Balancer-Zustandsprüfung auf.

Führen Sie den AWS-CLI-Befehl describe-target-health aus, um zu überprüfen, ob der Load Balancer auf den richtigen Endpunkt verweist:

aws elbv2 describe-target-health --target-group-arn arn:aws:elasticloadbalancing:us-west-2:1234567890:targetgroup/my-targets/6d0ecf831eec9f09

Führen Sie den AWS-CLI-Befehl describe-target-groups aus, um die Konfiguration der Zustandsprüfung der Zielgruppe zu überprüfen:

aws elbv2 describe-target-groups --target-group-arns arn:aws:elasticloadbalancing:us-west-2:1234567890:targetgroup/my-targets/6d0ecf831eec9f09

Weitere Informationen finden Sie unter Zustandsprüfungen für Ihre Zielgruppen.

Weitere Schritte zur Fehlerbehebung versuchen

Führen Sie den folgenden describe-service-Befehl aus, um im Kubernetes-Service nach einer Fehlermeldung zu suchen, die Ihnen bei der Behebung des Problems helfen kann:

$ kubectl describe service my-elb-service

Wenn der Service erfolgreich erstellt wurde, erhalten Sie eine ähnliche Ausgabe wie im folgenden Beispiel:

...  
...  
Events:  
  Type    Reason                Age   From                Message  
  ----    ------                ----  ----                -------  
  Normal  EnsuringLoadBalancer  47s   service-controller  Ensuring load balancer  
  Normal  EnsuredLoadBalancer   44s   service-controller  Ensured load balancer

Wenn der Service nicht erfolgreich erstellt wurde, erhalten Sie eine Fehlermeldung.

Weitere Informationen zu Fehlermeldungen finden Sie in den folgenden Ressourcen:

Relevante Informationen

Warum hat ein Subnetz, das von Load Balancern in meiner VPC verwendet wird, nicht genügend IP-Adressen?

Amazon-EKS-Fehlerbehebung

Troubleshoot your Application Load Balancers (Fehlerbehebung bei Ihren Application Load Balancern)

Troubleshoot your Classic Load Balancer (Fehlerbehebung bei Ihrem Classic Load Balancer)

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr