Dienste des Typs LoadBalancer für Hybridknoten konfigurieren - Amazon EKS

Hilf mit, diese Seite zu verbessern

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Wenn Sie zu diesem Benutzerhandbuch beitragen möchten, wählen Sie den GitHub Link Diese Seite bearbeiten auf, der sich im rechten Bereich jeder Seite befindet.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Dienste des Typs LoadBalancer für Hybridknoten konfigurieren

In diesem Thema wird beschrieben, wie der Layer-4-Lastenausgleich (L4) für Anwendungen konfiguriert wird, die auf Amazon EKS-Hybridknoten ausgeführt werden. Kubernetes-Services des Typs LoadBalancer werden verwendet, um Kubernetes-Anwendungen außerhalb des Clusters verfügbar zu machen. Dienste dieses Typs LoadBalancer werden üblicherweise mit einer physischen Load-Balancer-Infrastruktur in der Cloud oder in einer lokalen Umgebung verwendet, um den Workload-Datenverkehr zu bedienen. Diese Load Balancer-Infrastruktur wird üblicherweise mit einem umgebungsspezifischen Controller bereitgestellt.

AWS unterstützt AWS Network Load Balancer (NLB) und Cilium for Services vom Typ, die auf LoadBalancer EKS-Hybridknoten ausgeführt werden. Die Entscheidung, NLB oder Cilium zu verwenden, basiert auf der Quelle des Anwendungsdatenverkehrs. Wenn der Anwendungsdatenverkehr aus einer AWS Region stammt, AWS empfiehlt die Verwendung von AWS NLB und dem AWS Load Balancer Controller. Wenn der Anwendungsdatenverkehr aus der lokalen lokalen Umgebung oder der Edge-Umgebung stammt, AWS empfiehlt es sich, die integrierten Lastausgleichsfunktionen von Cilium zu verwenden, die mit oder ohne Load Balancer-Infrastruktur in Ihrer Umgebung verwendet werden können.

Informationen zum Lastenausgleich für den Anwendungsdatenverkehr auf Layer 7 (L7) finden Sie unter. Kubernetes Ingress für Hybridknoten konfigurieren Allgemeine Informationen zum Lastenausgleich mit EKS finden Sie unter Bewährte Methoden für den Lastenausgleich.

AWS Network Load Balancer

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

Voraussetzungen

Verfahren

  1. Laden Sie eine IAM-Richtlinie für den Load AWS Balancer Controller herunter, mit der er in AWS APIs Ihrem Namen Anrufe tätigen kann.

    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 Clustername (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 eks-charts Helm Chart-Repository hinzu. AWS unterhält 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 neuesten Charts verfügen.

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

    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. Stellen Sie sicher, dass 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 Namentcp-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 Namentcp-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 Dienstkonfiguration 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 Dienst 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 der NLB auf den Service zu.

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

    Ein Beispiel für eine Ausgabe finden Sie unten.

    <!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

Clusterinterner Lastenausgleich mit Cilium

Cilium kann als clusterinterner Load Balancer für Workloads verwendet werden, die auf 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-Funktionen, darunter Kube-Proxy-Ersatz, Load Balancer IP Address Management (IPAM) und BGP Control Plane. Die Verantwortlichkeiten dieser Funktionen werden im Folgenden detailliert beschrieben:

  • Ersatz für Cilium Kube-Proxy: Verwaltet die Weiterleitung des Dienstverkehrs an Backend-Pods.

  • Cilium Load Balancer IPAM: Verwaltet IP-Adressen, die Diensten des Typs zugewiesen werden können. LoadBalancer

  • Cilium BGP Control Plane: Kündigt IP-Adressen an, die vom Load Balancer IPAM dem lokalen Netzwerk zugewiesen wurden.

Wenn Sie den Kube-Proxy-Ersatz von Cilium nicht verwenden, können Sie dennoch Cilium Load Balancer IPAM und BGP Control Plane verwenden, um IP-Adressen für Dienste des Typs zuzuweisen und zuzuweisen. LoadBalancer Wenn Sie den Kube-Proxy-Ersatz von Cilium nicht verwenden, wird der Lastenausgleich zwischen Diensten und Backend-Pods standardmäßig durch die Regeln kube-proxy und iptables in EKS abgewickelt.

Voraussetzungen

Verfahren

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

    • LB_IP_CIDRErsetzen Sie durch den IP-Adressbereich, der für die Load Balancer-IP-Adressen verwendet werden soll. Verwenden Sie einen /32 CIDR, um eine einzelne IP-Adresse auszuwählen. Weitere Informationen finden Sie unter LoadBalancer IP-Adressverwaltung in der Cilium-Dokumentation.

    • Das serviceSelector Feld ist so konfiguriert, dass es mit dem Namen des Dienstes übereinstimmt, den Sie in einem nachfolgenden Schritt erstellen werden. Bei dieser Konfiguration werden IPs aus diesem Pool nur Dienste mit dem Namen zugewiesentcp-sample-service.

      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. Vergewissern Sie sich, dass mindestens eine IP-Adresse im Pool 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 cilium-bgp-advertisement-loadbalancer.yaml mit dem Namen einer CiliumBGPAdvertisement Ressource, um die Load Balancer-IP-Adresse für den Service bekannt zu geben, den Sie im nächsten Schritt erstellen werden. Wenn Sie Cilium BGP nicht verwenden, können Sie diesen Schritt überspringen. Die für Ihren Dienst verwendete Load Balancer-IP-Adresse muss in Ihrem lokalen Netzwerk routingfähig sein, damit Sie den Dienst im letzten Schritt abfragen können.

    • Das advertisementType Feld ist auf Service und service.addresses ist so eingestellt, dass LoadBalancerIP nur der Typ LoadBalancerIP für Dienste angekündigt wird. LoadBalancer

    • Das selector Feld ist so konfiguriert, dass es mit dem Namen des Dienstes übereinstimmt, den Sie in einem nachfolgenden Schritt erstellen werden. Bei dieser Konfiguration tcp-sample-service werden nur LoadBalancerIP Dienste mit diesem Namen beworben.

      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 Namentcp-sample-service.yaml.

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

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

      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 Dienst 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. Stellen Sie sicher, dass der Dienst erfolgreich erstellt wurde und ihm eine IP-Adresse aus der im vorherigen Schritt CiliumLoadBalancerIPPool erstellten 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 überprüfen, ob Cilium den Lastenausgleich für den Dienst übernimmt, indem Sie den folgenden Befehl ausführen. 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. Bestätigen Sie, dass Cilium die IP-Adresse über BGP an das lokale Netzwerk weitergibt. Im folgenden Beispiel gibt es fünf Hybridknoten, von denen jeder den tcp-sample-service Dienst im LB_IP_ADDRESS lokalen Netzwerk ankündigt.

    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 Load Balancer-IP-Adresse auf den Dienst zu.

    curl LB_IP_ADDRESS

    Ein Beispiel für eine Ausgabe finden Sie unten.

    <!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