Netzwerklastenausgleich auf Amazon EKS - Amazon EKS

Netzwerklastenausgleich auf Amazon EKS

Wenn Sie eine KubernetesServicevom TypLoadBalancer, einAWSDer Netzwerklastenausgleich (Network Load Balancer, NLB) wird bereitgestellt, der den Netzwerkverkehr ausgleicht. Weitere Informationen zu NLBs finden Sie unter Was ist eine Netzwerklastenverteilung?. Weitere Informationen über einen Kubernetes-Dienst finden Sie unter-ServiceIn der Kubernetes-Dokumentation. NLBs können mit Pods verwendet werden, die auf Amazon EC2 Knoten bereitgestellt werden oderAWSFargate IP-Ziele. Sie können eineAWSLoad Balancer in ein öffentliches oder privates Subnetz.

Der Netzwerkverkehr ist bei L4 des OSI-Modells Lastenausgleich. Um den Anwendungsdatenverkehr auf L7 auszugleichen, stellen Sie eine KubernetesIngress, die eineAWSALB (Application Load Balancer) Weitere Informationen finden Sie unter Anwendungslastenverteilung auf Amazon EKS. Weitere Informationen über die Unterschiede zwischen den beiden Load Balancing finden Sie unterElastic Load Balancingauf derAWS-Website.

In Amazon EKS können Sie den Netzwerkverkehr mit einem NLB (-InstanceoderIPZiel). Weitere Informationen über NLB-Zieltypen finden Sie unterZieltypSie können im Benutzerhandbuch für Network Load Balancer. Weitere Informationen zum AWSLoad Balancer-Controller finden Sie unter GitHub.

Wichtig

Mit der2.2.0Freigabe desAWSLoad Balancer, dieKubernetes In-Tree Service Load Balancer Controllerwurde abgelaufen und erhält nur kritische Fehlerbehebungen. Beim Bereitstellen neuer Netzwerklastenverteilungen für Dienste vom Typ LoadBalancer empfehlen wird den AWS Lastenverteilungs-Controller Bei den Informationen in diesem Thema wird davon ausgegangen, dass Sie dasAWSLoad Balancer Controller, nicht der Kubernetes-Controller.

Prerequisites

Bevor Sie den Netzwerkverkehr mit einer Anwendung ausgleichen können, müssen folgende Voraussetzungen erfüllt sein.

  • Mindestens ein Subnetz. Wenn mehrere getaggte Subnetze in einer Availability Zone gefunden werden, wählt der Controller das erste Subnetz aus, dessen Subnetz-ID zuerst lexikografisch kommt.

  • Wenn Sie dasAWSVersion des Load Balancerv2.1.1oder früher, müssen Subnetze wie folgt markiert werden. Bei Verwendung der Version 2.1.2 oder höher ist dieses Tag optional. Sie können ein Subnetz mit Tags versehen, wenn mehrere Cluster in derselben VPC ausgeführt werden, oder mehrereAWS-Dienste, die Subnetze in einer VPC gemeinsam nutzen und mehr Kontrolle darüber wünschen, wo Lastausgleichsdienste für jeden Cluster bereitgestellt werden. Wenn Sie Subnetz-IDs explizit als Annotation für ein Service-Objekt angeben, werden Kubernetes und dieAWSLoad Balancer Controller verwendet diese Subnetze direkt, um den Load Balancer zu erstellen. Subnetz-Tagging ist nicht erforderlich, wenn Sie diese Methode für die Bereitstellung von Lastausgleichsdiensten verwenden und Sie die folgenden Anforderungen für private und öffentliche Subnetz-Tagging überspringen können. Ersetzencluster-nameIhren Clusternamen.

    • Schlüsselkubernetes.io/cluster/cluster-name

    • Wert: , , shared oder owned.

  • Ihre öffentlichen und privaten Subnetze müssen die folgenden Anforderungen erfüllen, es sei denn, Sie geben Subnetz-IDs explizit als Anmerkung für ein Service- oder Ingress-Objekt an. Wenn Sie Lastausgleichsdienste bereitstellen, indem Sie Subnetz-IDs explizit als Annotation für ein Service- oder Ingress-Objekt angeben, werden Kubernetes und dieAWSLoad Balancer Controller verwendet diese Subnetze direkt, um den Load Balancer zu erstellen, und die folgenden Tags sind nicht erforderlich.

    • Private SubnetzeMüssen im folgenden Format markiert sein. Dies ist so, dass Kubernetes und dieAWSLoad Balancer Controller wissen, dass die Subnetze für interne Lastausgleichsdienste verwendet werden können. Wenn Sieeksctloder einen Amazon EKSAWS AWS CloudFormationWenn Sie Ihre VPC nach dem 26. März 2020 erstellen, werden die Subnetze entsprechend markiert, wenn sie erstellt werden. Weitere Informationen über die Amazon EKSAWS AWS CloudFormationVPC Vorlagen finden Sie unterErstellen einer VPC für Ihren Amazon-EKS-Clusteraus.

      • Schlüsselkubernetes.io/role/internal-elb

      • Wert1

    • Öffentliche SubnetzeMüssen im folgenden Format markiert sein. Sie müssen öffentliche Subnetze in Ihrer VPC entsprechend kennzeichnen, so dass Kubernetes nur diese Subnetze für externe Load Balancer verwendet und kein öffentliches Subnetz in jeder Availability Zone wählt (in lexikographischer Reihenfolge nach Subnetz-ID): Wenn Sieeksctloder einen Amazon EKSAWS CloudFormationWenn Sie Ihre VPC nach dem 26. März 2020 erstellen, werden die Subnetze entsprechend markiert, wenn sie erstellt werden. Weitere Informationen über die Amazon EKS AWS CloudFormation VPC Vorlagen finden Sie unterErstellen einer VPC für Ihren Amazon-EKS-Clusteraus.

      • Schlüsselkubernetes.io/role/elb

      • Wert1

    Wenn die Subnetzrollen-Tags nicht explizit hinzugefügt werden, prüft der Kubernetes-Dienstcontroller die Routingtabelle der Cluster-VPC -Subnetze, um festzustellen, ob das Subnetz privat oder öffentlich ist. Es wird empfohlen, dass Sie sich nicht auf dieses Verhalten verlassen und stattdessen explizit die privaten oder öffentlichen Rollentags hinzufügen. DieAWSLoad Balancer Controller untersucht keine Routentabellen und erfordert, dass die privaten und öffentlichen Tags für eine erfolgreiche automatische Erkennung vorhanden sind.

Considerations

  • Sie können nur NLBIP-Ziele mit demAmazon EKS VPC CNI-Pluginaus. Sie können NLB-InstanceZiele mit dem Amazon EKS VPC CNI-Plugin oderAlternative kompatible CNI-Pluginsaus.

  • Der Controller stellt NLBs bereit, aber keine klassischen Load Balancers.

  • Die Konfiguration Ihres Load Balancers wird durch Anmerkungen gesteuert, die zu dem Manifest für Ihren Service hinzugefügt werden. Wenn Sie dem Load Balancer Tags hinzufügen möchten, wenn oder nachdem er erstellt wurde, fügen Sie die folgende Anmerkung in Ihre Service-Spezifikation ein. Weitere Informationen finden Sie unter Sonstige ELB-Anmerkungen in der Kubernetes-Dokumentation.

    service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags
  • Sie könnenElastic IP-Adressenzum Network Load Balancer hinzufügen, indem Sie die folgende Anmerkung hinzufügen. Ersetzen Sie dieexample-valuesmit den Zuordnungs-IDs Ihrer Elastic IP-Adressen. Die Anzahl der Zuordnungs-IDs muss mit der Anzahl der Subnetze übereinstimmen, die für den Load Balancer verwendet werden.

    service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-xxxxxxxxxxxxxxxxx,eipalloc-yyyyyyyyyyyyyyyyy
  • Für jeden NLB, den Sie erstellen, fügt Amazon EKS der Sicherheitsgruppe des Knotens für Clientdatenverkehr eine eingehende Regel und für jedes Load Balancer Subnetz in der VPC für Integritätsprüfungen eine Regel hinzu. Bereitstellung eines Dienstes vom TypLoadBalancerkann fehlschlagen, wenn Amazon EKS versucht, Regeln zu erstellen, die das Kontingent für die maximal zulässige Anzahl von Regeln für eine Sicherheitsgruppe überschreiten. Weitere Informationen finden Sie im Abschnitt Sicherheitsgruppe in Amazon VPC-Kontingenten im Amazon VPC-Benutzerhandbuch. Berücksichtigen Sie die folgenden Optionen, um die Wahrscheinlichkeit zu minimieren, dass die maximale Anzahl von Regeln für eine Sicherheitsgruppe überschritten wird.

    • Fordern Sie eine Erhöhung Ihrer Regeln pro Sicherheitsgruppenkontingent an. Weitere Informationen finden Sie unter Beantragen einer Kontingenterhöhung im Service-Kontingente-Benutzerhandbuch.

    • Verwenden vonErstellen eines Network Load Balancers, anstatt Instanzziele. Bei IP-Zielen können Regeln möglicherweise für dieselben Zielports freigegeben werden. Lastausgleichs-Subnetze können manuell mit einer Anmerkung angegeben werden. Weitere Informationen finden Sie unter -Add-Ons auf GitHub.

    • Verwenden Sie einen Ingress anstelle eines Dienstes vom TypLoadBalancer, um Datenverkehr an Ihren Dienst zu senden. Der AWS Application Load Balancer erfordert weniger Regeln als NLBs. Ein ALB kann auch für mehrere Ingressen freigegeben werden. Weitere Informationen finden Sie unter Anwendungslastenverteilung auf Amazon EKS.

    • Stellen Sie Ihre Cluster für mehrere Konten bereit.

  • Wenn Ihre Pods unter Windows ausgeführt werden, kann in einem Amazon EKS-Cluster ein einzelner Dienst mit einem Load Balancer bis zu 64 Backend-Pods unterstützen. Jeder Pod hat seine eigene eindeutige IP-Adresse. Dies ist eine Einschränkung des Windows-Betriebssystems auf den Amazon EC2 Knoten.

  • Es wird empfohlen, nur neue NLBs mit demAWSLoad Balancer Der Versuch, vorhandene NLBs zu ersetzen, die mit dem internen Load-Balancer-Controller von Kubernetes erstellt wurden, kann zu mehreren NLBs führen, die Anwendungsausfallzeiten verursachen können.

Erstellen eines Network Load Balancers

Sie können einen Netzwerklastenausgleich mit IP- oder Instanzzielen erstellen. Wählen Sie die Registerkarte mit dem Namen der Ziele aus, auf die Sie Load Balancing möchten.

IP targets

Sie können IP-Ziele mit Pods verwenden, die auf Amazon EC2 Knoten oder Fargate bereitgestellt werden. Ihr Kubernetes-Service muss als TypLoadBalanceraus. Weitere Informationen finden Sie unter Garbage Collecting Load Balancers in der Kubernetes-Dokumentation.

Um einen Lastausgleichsdienst zu erstellen, der IP-Ziele verwendet, fügen Sie die folgende Anmerkung zu einem Dienstmanifest hinzu und stellen Sie den Dienst bereit. Sie können-Beispiel-Service-ManifestsMit den Anmerkungen.

service.beta.kubernetes.io/aws-load-balancer-type: "external" service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"

Standardmäßig werden NLBs als intern erstellt. Für interne Load Balancer muss Ihr -Cluster so konfiguriert werden, dass er mindestens ein privates Subnetz in Ihrer VPC verwendet. Kubernetes untersucht die Routing-Tabelle auf Ihre Subnetze, um zu identifizieren, ob sie öffentlich oder privat sind. Öffentliche Subnetze verfügen über einen direkten Zugang zum Internet über ein Internet-Gateway, nicht aber private Subnetze.

Wenn Sie einen mit dem Internet verbundenen NLB erstellen möchten, fügen Sie die folgende Anmerkung hinzu:

service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
Anmerkung

Aus Gründen der Abwärtskompatibilität wird service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip" weiterhin unterstützt. Wir empfehlen jedoch die Verwendung der vorherigen Anmerkungen für neue Load Balancer anstelleservice.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"aus.

Wichtig

Bearbeiten Sie die Anmerkungen nicht, nachdem Sie Ihren Service erstellt haben. Wenn Sie es ändern müssen, löschen Sie das Service-Objekt und erstellen es erneut mit dem gewünschten Wert für diese Anmerkung.

Instance targets

In der Vergangenheit hat der interne Kubernetes-Controller NLBs mit Instanzzielen erstellt. Version 2.2.0 oder höherAWSLoad Balancer Controller erstellt NLBs mit Instanzzielen. Es wird empfohlen, ihn anstelle des In-Tree-Controllers von Kubernetes zu verwenden, um neue NLBs zu erstellen. Sie können NLB-Instance-Ziele mit Pods verwenden, die auf Amazon EC2 Knoten bereitgestellt werden, jedoch nicht in Fargate. Um den Netzwerkverkehr über Pods auszugleichen, die in Fargate bereitgestellt werden, müssen Sie IP-Ziele verwenden.

Um einen Lastausgleichsdienst in einem privaten Subnetz bereitzustellen, muss Ihre Dienstspezifikation über die folgenden Anmerkungen verfügen. Sie können-Beispiel-Service-ManifestsMit den Anmerkungen.

service.beta.kubernetes.io/aws-load-balancer-type: "external" service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance"

NLBs werden standardmäßig als intern erstellt. Für interne Load Balancer muss Ihr -Cluster so konfiguriert werden, dass er mindestens ein privates Subnetz in Ihrer VPC verwendet. Kubernetes untersucht die Routing-Tabelle auf Ihre Subnetze, um zu identifizieren, ob sie öffentlich oder privat sind. Öffentliche Subnetze verfügen über einen direkten Zugang zum Internet über ein Internet-Gateway, nicht aber private Subnetze.

Wenn Sie einen mit dem Internet verbundenen NLB erstellen möchten, fügen Sie die folgende Anmerkung hinzu:

service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
Wichtig

Bearbeiten Sie die Anmerkungen nicht, nachdem Sie Ihren Service erstellt haben. Wenn Sie es ändern müssen, löschen Sie das Service-Objekt und erstellen es erneut mit dem gewünschten Wert für diese Anmerkung.

Bereitstellen einer Beispielanwendung

So stellen Sie eine Beispielanwendung bereit

  1. Bereitstellen einer Beispielanwendung

    1. Speichern Sie den folgenden Inhalt in einer Datei mit dem Namen sample-deployment.yaml auf Ihrem Computer.

      apiVersion: apps/v1 kind: Deployment metadata: name: sample-app spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.19.6 ports: - name: http containerPort: 80
    2. Wenden Sie die Manifestdatei auf Ihren Cluster an.

      kubectl apply -f sample-deployment.yaml
  2. Erstellen Sie einen Dienst mit einem internen NLB, der Lastausgleich zu IP-Zielen macht.

    1. Speichern Sie den folgenden Inhalt in einer Datei mit dem Namen sample-service.yaml auf Ihrem Computer.

      apiVersion: v1 kind: Service metadata: name: sample-service annotations: service.beta.kubernetes.io/aws-load-balancer-type: external service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing spec: ports: - port: 80 targetPort: 80 protocol: TCP type: LoadBalancer selector: app: nginx
    2. Wenden Sie die Manifestdatei auf Ihren Cluster an.

      kubectl apply -f sample-service.yaml
  3. Stellen Sie sicher, dass der Service bereitgestellt wurde.

    kubectl get svc sample-service

    Die Ausgabe sieht wie folgt aus.

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sample-service LoadBalancer 10.100.240.137 k8s-default-samplese-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-west-2.amazonaws.com 80:32400/TCP 16h
  4. Öffnen SieAmazon EC2AWS Management Consoleaus. SelectZielgruppen(unterLastausgleichIm linken Bereich. In derNameden Namen der Zielgruppe aus, wobei der Wert in der SpalteLoad Balancerentspricht dem Namen in der SpalteEXTERNAL-IP-Spalte der Ausgabe im vorherigen Schritt. Sie wählen beispielsweise die Zielgruppe rk8s-default-samplese-xxxxxxxxxx, wenn Ihre Ausgabe die gleiche wie die obige Ausgabe war. DieZieltypistIP, da dies im Beispieldienstbereitstellungsmanifest angegeben wurde.

  5. Wählen Sie Ihre Zielgruppe und danach die Registerkarte Ziele aus. Unter Registrierte Ziele, sollten Sie drei IP-Adressen der drei Replikate sehen, die in einem vorherigen Schritt bereitgestellt wurden. Warten Sie, bis der Status aller Zielegesund, bevor Sie fortfahren. Möglicherweise dauert es ein paar Minuten, bis alle Zielehealthyaus. Bei den Zielen kann es sich um einunhealthy-Zustand vor dem Wechsel zu einemhealthyZustand.

  6. Senden von Datenverkehr an den Dienst ersetzenxxxxxxxxxxxxxxxxxxxxxxmit dem Wert, der in einem vorherigen Schritt für dieEXTERNAL-IPundus-west-2Sie können mit der Region, in der sich Ihr Cluster befindet.

    curl k8s-default-samplese-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-west-2.amazonaws.com

    Die Ausgabe sieht wie folgt aus.

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...
  7. Wenn Sie mit der Beispielbereitstellung und dem Dienst fertig sind, entfernen Sie sie.

    kubectl delete service sample-service kubectl delete deployment sample-app