Konfiguration von Services vom Typ LoadBalancer für Hybridknoten - Amazon EKS

Unterstützung für die Verbesserung dieser Seite beitragen

Um zu diesem Benutzerhandbuch beizutragen, klicken Sie auf den Link Diese Seite auf GitHub bearbeiten, der sich im rechten Bereich jeder Seite befindet.

Konfiguration von Services vom Typ LoadBalancer für Hybridknoten

In diesem Thema wird beschrieben, wie Sie den Layer 4 (L4)-Lastenausgleich für Anwendungen konfigurieren, die auf Amazon EKS Hybrid Nodes ausgeführt werden. Kubernetes-Services vom Typ LoadBalancer werden verwendet, um Kubernetes-Anwendungen außerhalb des Clusters verfügbar zu machen. Services vom Typ LoadBalancer werden oft mit einer physischen Load-Balancer-Infrastruktur in der Cloud oder in einer On-Premises-Umgebung verwendet, um den Datenverkehr der Workload zu bedienen. Diese Load-Balancer-Infrastruktur wird in der Regel mit einem umgebungsspezifischen Controller bereitgestellt.

AWS unterstützt AWS Network Load Balancer (NLB) und Cilium für Services vom Typ LoadBalancer, die in EKS-Hybridknoten ausgeführt werden. Die Entscheidung, ob NLB oder Cilium verwendet wird, hängt von der Quelle des Anwendungs-Datenverkehrs ab. Wenn der Anwendungsverkehr aus einer AWS-Region stammt, empfiehlt AWS die Verwendung von AWS NLB und dem AWS Load Balancer Controller. Wenn der Anwendungs-Datenverkehr aus der lokalen On-Premises- oder Edge-Umgebung stammt, empfiehlt AWS die Verwendung der integrierten Load-Balancing-Funktionen von Cilium, die mit oder ohne Load Balancer-Infrastruktur in Ihrer Umgebung verwendet werden können.

Informationen zum Load Balancing für den Anwendungs-Datenverkehr der Layer 7 (L7) finden Sie unter Konfiguration von Kubernetes Ingress für Hybridknoten. Allgemeine Informationen zum Load Balancing mit EKS finden Sie unter Bewährte Methoden für den Load Balancing.

AWS Network Load Balancer

Sie können den AWS Load Balancer Controller und NLB mit dem Zieltyp ip für Workloads verwenden, die in Hybridknoten ausgeführt werden. Bei Verwendung des Zieltyps ip leitet NLB den Datenverkehr direkt an die Pods weiter und umgeht dabei den Netzwerkpfad der Service-Ebene. Damit NLB die Pod-IP-Ziele auf Hybridknoten erreichen kann, müssen Ihre lokalen Pod-CIDRs in Ihrem On-Premises-Netzwerk routingfähig sein. Darüber hinaus verwendet der AWS Load Balancer Controller Webhooks und erfordert eine direkte Kommunikation von der EKS-Steuerebene. Weitere Informationen finden Sie unter Konfiguration von Webhooks für Hybridknoten.

Voraussetzungen

Verfahren

  1. Laden Sie eine IAM-Richtlinie für den AWS-Lastenverteilungs-Controller herunter, die es ihm ermöglicht, in Ihrem Namen Aufrufe an AWS-APIs zu tätigen.

    curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
  2. Erstellen Sie eine IAM-Richtlinie mit der im vorherigen Schritt heruntergeladenen Richtlinie.

    aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
  3. Ersetzen Sie die Werte für Cluster-Name (CLUSTER_NAME), AWS-Region (AWS_REGION) und AWS-Konto-ID (AWS_ACCOUNT_ID) durch Ihre Einstellungen und führen Sie den folgenden Befehl aus.

    eksctl create iamserviceaccount \ --cluster=CLUSTER_NAME \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --region AWS_REGION \ --approve
  4. Fügen Sie das Helm-Chart-Repository eks-charts hinzu. AWS verwaltet dieses Repository auf GitHub.

    helm repo add eks https://aws.github.io/eks-charts
  5. Aktualisieren Sie Ihr lokales Helm-Repository, um sicherzustellen, dass Sie über die aktuellsten Diagramme verfügen.

    helm repo update eks
  6. Installieren Sie den AWS-Lastenverteilungs-Controller. Ersetzen Sie die Werte für Cluster-Name (CLUSTER_NAME), AWS-Region (AWS_REGION), VPC-ID (VPC_ID), und die Helm-Chart-Version des AWS Load Balancer Controller (AWS_LBC_HELM_VERSION) durch Ihre Einstellungen. Die neueste Version des Helm-Charts finden Sie, indem Sie helm search repo eks/aws-load-balancer-controller --versions ausführen. Wenn Sie einen Cluster im kombinierten Modus mit Hybridknoten und Knoten in der AWS Cloud betreiben, können Sie AWS Load Balancer Controller auf Cloud-Knoten ausführen, indem Sie die Anweisungen unter AWS-Lastenverteilungs-Controller befolgen.

    helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --version AWS_LBC_HELM_VERSION \ --set clusterName=CLUSTER_NAME \ --set region=AWS_REGION \ --set vpcId=VPC_ID \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
  7. Überprüfen Sie, ob der AWS Load Balancer Controller erfolgreich installiert wurde.

    kubectl get -n kube-system deployment aws-load-balancer-controller
    NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s
  8. Definieren Sie eine Beispielanwendung in einer Datei mit dem Namen tcp-sample-app.yaml. Das folgende Beispiel verwendet eine einfache NGINX-Bereitstellung mit einem TCP-Port.

    apiVersion: apps/v1 kind: Deployment metadata: name: tcp-sample-app namespace: default spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.23 ports: - name: tcp containerPort: 80
  9. Wenden Sie die Bereitstellung auf Ihren Cluster an.

    kubectl apply -f tcp-sample-app.yaml
  10. Definieren Sie einen Service vom Typ LoadBalancer für die Bereitstellung in einer Datei mit dem Namen tcp-sample-service.yaml.

    apiVersion: v1 kind: Service metadata: name: tcp-sample-service namespace: default 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
  11. Wenden Sie die Servicekonfiguration auf Ihren Cluster an.

    kubectl apply -f tcp-sample-service.yaml
  12. Die Bereitstellung des NLB für den Service kann einige Minuten dauern. Sobald der NLB bereitgestellt ist, wird dem Service eine Adresse zugewiesen, die dem DNS-Namen der NLB-Bereitstellung entspricht.

    kubectl get svc tcp-sample-service
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tcp-sample-service LoadBalancer 172.16.115.212 k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com 80:30396/TCP 8s
  13. Greifen Sie über die Adresse des NLB auf den Service zu.

    curl k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com

    Unten sehen Sie eine Beispielausgabe.

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
  14. Bereinigen Sie die -Ressourcen, die Sie erstellt haben.

    kubectl delete -f tcp-sample-service.yaml kubectl delete -f tcp-sample-app.yaml

Cilium-Load-Balancing im Cluster

Cilium kann als Cluster-interner Load Balancer für Workloads verwendet werden, die in EKS-Hybridknoten ausgeführt werden. Dies kann für Umgebungen nützlich sein, die nicht über eine Load-Balancer-Infrastruktur verfügen. Die Load-Balancing-Funktionen von Cilium basieren auf einer Kombination von Cilium-Features, darunter kube-proxy-Ersatz, Load Balancer IP Address Management (IPAM) und BGP-Steuerebene. Die Aufgaben dieser Feature werden nachfolgend näher erläutert:

  • Cilium-kube-proxy-Ersatz: Verarbeitet die Weiterleitung des Service-Datenverkehrs an Backend-Pods.

  • Cilium Load Balancer IPAM: Verwaltet IP-Adressen, die Services vom Typ LoadBalancer zugewiesen werden können.

  • Cilium-BGP-Steuerebene: Gibt vom Load Balancer IPAM dem On-Premises-Netzwerk zugewiesene IP-Adressen bekannt.

Wenn Sie den kube-proxy-Ersatz von Cilium nicht verwenden, können Sie dennoch Cilium Load Balancer IPAM und BGP-Steuerebene nutzen, um IP-Adressen für Services vom Typ LoadBalancer zuzuweisen und zuzuordnen. Wenn Sie den kube-proxy-Ersatz von Cilium nicht verwenden, wird der Lastenausgleich für Services zu Backend-Pods in EKS standardmäßig durch kube-proxy- und iptables-Regeln übernommen.

Voraussetzungen

  • Cilium wurde gemäß den Anweisungen in CNI für Hybridknoten konfigurieren mit oder ohne aktiviertem kube-proxy-Ersatz installiert. Der kube-proxy-Ersatz von Cilium erfordert ein Betriebssystem mit einem Linux-Kernel mindestens der aktuellen Version v4.19.57, v5.1.16 oder v5.2.0. Alle aktuellen Versionen der für die Verwendung mit Hybridknoten unterstützten Betriebssysteme erfüllen dieses Kriterium, mit Ausnahme von Red Hat Enterprise Linux (RHEL) 8.x.

  • Cilium-BGP-Steuerebene gemäß den Anweisungen in Konfiguration von Cilium BGP für Hybridknoten aktiviert. Wenn Sie BGP nicht verwenden möchten, müssen Sie eine alternative Methode verwenden, um die CIDRs Ihres On-Premises-Pods in Ihrem On-Premises-Netzwerk routingfähig zu machen. Weitere Informationen finden Sie unter Routingfähige Fern-Pod-CIDRs.

  • Helm ist in Ihrer Befehlszeilenumgebung installiert. Weitere Informationen finden Sie unter Anweisungen zur Einrichtung von Helm.

Verfahren

  1. Erstellen Sie eine Datei mit dem Namen cilium-lbip-pool-loadbalancer.yaml mit einer CiliumLoadBalancerIPPool-Ressource, um den Load Balancer-IP-Adressbereich für Ihre Service vom Typ LoadBalancer zu konfigurieren.

    • Ersetzen Sie LB_IP_CIDR durch den IP-Adressbereich, der für die IP-Adressen des Load Balancers verwendet werden soll. Um eine einzelne IP-Adresse auszuwählen, verwenden Sie ein /32 CIDR. Weitere Informationen finden Sie unter LoadBalancer-IP-Adressverwaltung in der Cilium-Dokumentation.

    • Das serviceSelector-Feld wird so konfiguriert, dass es mit dem Namen des Service übereinstimmt, den Sie in einem späteren Schritt erstellen. Mit dieser Konfiguration werden IPs aus diesem Pool nur Services mit dem Namen tcp-sample-service zugewiesen.

      apiVersion: cilium.io/v2alpha1 kind: CiliumLoadBalancerIPPool metadata: name: tcp-service-pool spec: blocks: - cidr: "LB_IP_CIDR" serviceSelector: matchLabels: io.kubernetes.service.name: tcp-sample-service
  2. Wenden Sie die CiliumLoadBalancerIPPool-Ressource auf Ihren Cluster an.

    kubectl apply -f cilium-lbip-pool-loadbalancer.yaml
  3. Stellen Sie sicher, dass im Pool mindestens eine IP-Adresse verfügbar ist.

    kubectl get ciliumloadbalancerippools.cilium.io
    NAME DISABLED CONFLICTING IPS AVAILABLE AGE tcp-service-pool false False 1 24m
  4. Erstellen Sie eine Datei mit dem Namen cilium-bgp-advertisement-loadbalancer.yaml mit einer CiliumBGPAdvertisement-Ressource, um die IP-Adresse des Load Balancers für den Service bekannt zu geben, den Sie im nächsten Schritt erstellen. Wenn Sie Cilium BGP nicht verwenden, können Sie diesen Schritt überspringen. Die für Ihren Service verwendete IP-Adresse des Load Balancers muss in Ihrem On-Premises-Netzwerk routingfähig sein, damit Sie den Service im letzten Schritt abfragen können.

    • Das advertisementType-Feld ist auf Service gesetzt und service.addresses ist auf LoadBalancerIP gesetzt, um den LoadBalancerIP für Services vom Typ LoadBalancer bekannt zu geben.

    • Das selector-Feld wird so konfiguriert, dass es mit dem Namen des Service übereinstimmt, den Sie in einem späteren Schritt erstellen. Mit dieser Konfiguration werden nur LoadBalancerIP für Services mit dem Namen tcp-sample-service bekannt gegeben.

      apiVersion: cilium.io/v2alpha1 kind: CiliumBGPAdvertisement metadata: name: bgp-advertisement-tcp-service labels: advertise: bgp spec: advertisements: - advertisementType: "Service" service: addresses: - LoadBalancerIP selector: matchLabels: io.kubernetes.service.name: tcp-sample-service
  5. Wenden Sie die CiliumBGPAdvertisement-Ressource auf Ihren Cluster an. Wenn Sie Cilium BGP nicht verwenden, können Sie diesen Schritt überspringen.

    kubectl apply -f cilium-bgp-advertisement-loadbalancer.yaml
  6. Definieren Sie eine Beispielanwendung in einer Datei mit dem Namen tcp-sample-app.yaml. Das folgende Beispiel verwendet eine einfache NGINX-Bereitstellung mit einem TCP-Port.

    apiVersion: apps/v1 kind: Deployment metadata: name: tcp-sample-app namespace: default spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.23 ports: - name: tcp containerPort: 80
  7. Wenden Sie die Bereitstellung auf Ihren Cluster an.

    kubectl apply -f tcp-sample-app.yaml
  8. Definieren Sie einen Service vom Typ LoadBalancer für die Bereitstellung in einer Datei mit dem Namen tcp-sample-service.yaml.

    • Mit der lbipam.cilium.io/ips-Annotation zum Serviceobjekt können Sie eine bestimmte IP-Adresse aus dem IP-Pool des Load Balancers anfordern. Sie können diese Annotation entfernen, wenn Sie keine bestimmte IP-Adresse für den Service anfordern möchten.

    • Das Spezifikationsfeld loadBalancerClass ist erforderlich, um zu verhindern, dass der alte AWS-Cloud-Anbieter einen Classic Load Balancer für den Service erstellt. Im nachfolgenden Beispiel ist dies auf io.cilium/bgp-control-plane konfiguriert, um die BGP-Steuerebene von Cilium als Load-Balancer-Klasse zu verwenden. Dieses Feld kann alternativ auf io.cilium/l2-announcer konfiguriert werden, um das L2-Ankündigungsfeature von Cilium zu verwenden (derzeit in der Betaphase und nicht offiziell von AWS unterstützt).

      apiVersion: v1 kind: Service metadata: name: tcp-sample-service namespace: default annotations: lbipam.cilium.io/ips: "LB_IP_ADDRESS" spec: loadBalancerClass: io.cilium/bgp-control-plane ports: - port: 80 targetPort: 80 protocol: TCP type: LoadBalancer selector: app: nginx
  9. Wenden Sie den Service auf Ihren Cluster an. Der Service wird mit einer externen IP-Adresse erstellt, die Sie für den Zugriff auf die Anwendung verwenden können.

    kubectl apply -f tcp-sample-service.yaml
  10. Überprüfen Sie, ob der Service erfolgreich erstellt wurde und ihm eine IP aus dem im vorherigen Schritt erstellten CiliumLoadBalancerIPPool zugewiesen wurde.

    kubectl get svc tcp-sample-service
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tcp-sample-service LoadBalancer 172.16.117.76 LB_IP_ADDRESS 80:31129/TCP 14m
  11. Wenn Sie Cilium im kube-proxy-Ersatzmodus verwenden, können Sie mit dem folgenden Befehl bestätigen, dass Cilium das Load Balancing für den Service übernimmt. In der folgenden Ausgabe sind die 10.86.2.x-Adressen die Pod-IP-Adressen der Backend-Pods für den Service.

    kubectl -n kube-system exec ds/cilium -- cilium-dbg service list
    ID Frontend Service Type Backend ... 41 LB_IP_ADDRESS:80/TCP LoadBalancer 1 => 10.86.2.76:80/TCP (active) 2 => 10.86.2.130:80/TCP (active) 3 => 10.86.2.141:80/TCP (active)
  12. Stellen Sie sicher, dass Cilium die IP-Adresse über BGP an das On-Premises-Netzwerk bekannt gibt. Im folgenden Beispiel gibt es fünf Hybridknoten, die jeweils die LB_IP_ADDRESS für den tcp-sample-service-Service im On-Premises-Netzwerk bekannt geben.

    Node VRouter Prefix NextHop Age Attrs mi-026d6a261e355fba7 NODES_ASN LB_IP_ADDRESS/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-082f73826a163626e NODES_ASN LB_IP_ADDRESS/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-09183e8a3d755abf6 NODES_ASN LB_IP_ADDRESS/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-0d78d815980ed202d NODES_ASN LB_IP_ADDRESS/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-0daa253999fe92daa NODES_ASN LB_IP_ADDRESS/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}]
  13. Greifen Sie über die zugewiesene IP-Adresse des Load Balancers auf den Service zu.

    curl LB_IP_ADDRESS

    Unten sehen Sie eine Beispielausgabe.

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
  14. Bereinigen Sie die -Ressourcen, die Sie erstellt haben.

    kubectl delete -f tcp-sample-service.yaml kubectl delete -f tcp-sample-app.yaml kubectl delete -f cilium-lb-ip-pool.yaml kubectl delete -f cilium-bgp-advertisement.yaml