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.
-
Weitere Informationen zu den Anforderungen für die Subnetzkonfiguration finden Sie unter Weiterleitung von TCP- und UDP-Datenverkehr mit Network Load Balancers. Weitere Informationen zum AWS Network Load Balancer und AWS Load Balancer Controller finden Sie unter AWS Load Balancer Controller mit Helm installieren und Bewährte Methoden für Load Balancing.
-
Informationen zu Konfigurationen, die auf Services vom Typ
LoadBalancermit AWS Network Load Balancer angewendet werden können, finden Sie unter Konfigurationen für AWS Load Balancer Controller NLB.
Voraussetzungen
-
Cilium wurde gemäß den Anweisungen in CNI für Hybridknoten konfigurieren installiert.
-
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.
-
eksctl in Ihrer Befehlszeilenumgebung installiert ist. Lesen Sie die Anweisungen zur Einrichtung von eksctl.
Verfahren
-
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 -
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 -
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 -
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 -
Aktualisieren Sie Ihr lokales Helm-Repository, um sicherzustellen, dass Sie über die aktuellsten Diagramme verfügen.
helm repo update eks -
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 Siehelm search repo eks/aws-load-balancer-controller --versionsausfü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 \ --versionAWS_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 -
Überprüfen Sie, ob der AWS Load Balancer Controller erfolgreich installiert wurde.
kubectl get -n kube-system deployment aws-load-balancer-controllerNAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s -
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 -
Wenden Sie die Bereitstellung auf Ihren Cluster an.
kubectl apply -f tcp-sample-app.yaml -
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 -
Wenden Sie die Servicekonfiguration auf Ihren Cluster an.
kubectl apply -f tcp-sample-service.yaml -
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-serviceNAME 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 -
Greifen Sie über die Adresse des NLB auf den Service zu.
curl k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com.rproxy.govskope.caUnten sehen Sie eine Beispielausgabe.
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...] -
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
LoadBalancerzugewiesen 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
-
Erstellen Sie eine Datei mit dem Namen
cilium-lbip-pool-loadbalancer.yamlmit einerCiliumLoadBalancerIPPool-Ressource, um den Load Balancer-IP-Adressbereich für Ihre Service vom Typ LoadBalancer zu konfigurieren.-
Ersetzen Sie
LB_IP_CIDRdurch 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/32CIDR. Weitere Informationen finden Sie unter LoadBalancer-IP-Adressverwaltungin 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 Namentcp-sample-servicezugewiesen.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
-
-
Wenden Sie die
CiliumLoadBalancerIPPool-Ressource auf Ihren Cluster an.kubectl apply -f cilium-lbip-pool-loadbalancer.yaml -
Stellen Sie sicher, dass im Pool mindestens eine IP-Adresse verfügbar ist.
kubectl get ciliumloadbalancerippools.cilium.ioNAME DISABLED CONFLICTING IPS AVAILABLE AGE tcp-service-pool false False 1 24m -
Erstellen Sie eine Datei mit dem Namen
cilium-bgp-advertisement-loadbalancer.yamlmit einerCiliumBGPAdvertisement-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 aufServicegesetzt undservice.addressesist aufLoadBalancerIPgesetzt, um denLoadBalancerIPfür Services vom TypLoadBalancerbekannt 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 nurLoadBalancerIPfür Services mit dem Namentcp-sample-servicebekannt 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
-
-
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 -
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 -
Wenden Sie die Bereitstellung auf Ihren Cluster an.
kubectl apply -f tcp-sample-app.yaml -
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
loadBalancerClassist erforderlich, um zu verhindern, dass der alte AWS-Cloud-Anbieter einen Classic Load Balancer für den Service erstellt. Im nachfolgenden Beispiel ist dies aufio.cilium/bgp-control-planekonfiguriert, um die BGP-Steuerebene von Cilium als Load-Balancer-Klasse zu verwenden. Dieses Feld kann alternativ aufio.cilium/l2-announcerkonfiguriert werden, um das L2-Ankündigungsfeaturevon 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
-
-
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 -
Überprüfen Sie, ob der Service erfolgreich erstellt wurde und ihm eine IP aus dem im vorherigen Schritt erstellten
CiliumLoadBalancerIPPoolzugewiesen wurde.kubectl get svc tcp-sample-serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tcp-sample-service LoadBalancer 172.16.117.76LB_IP_ADDRESS80:31129/TCP 14m -
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 listID Frontend Service Type Backend ... 41LB_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) -
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_ADDRESSfür dentcp-sample-service-Service im On-Premises-Netzwerk bekannt geben.Node VRouter Prefix NextHop Age Attrs mi-026d6a261e355fba7NODES_ASNLB_IP_ADDRESS/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-082f73826a163626eNODES_ASNLB_IP_ADDRESS/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-09183e8a3d755abf6NODES_ASNLB_IP_ADDRESS/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-0d78d815980ed202dNODES_ASNLB_IP_ADDRESS/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-0daa253999fe92daaNODES_ASNLB_IP_ADDRESS/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] -
Greifen Sie über die zugewiesene IP-Adresse des Load Balancers auf den Service zu.
curlLB_IP_ADDRESSUnten sehen Sie eine Beispielausgabe.
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...] -
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