Contribuisci a migliorare questa pagina
Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Per contribuire a questa guida per l'utente, scegli il GitHub link Modifica questa pagina nel riquadro destro di ogni pagina.
Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Configurazione dei servizi di tipo LoadBalancer per nodi ibridi
Questo argomento descrive come configurare il bilanciamento del carico di livello 4 (L4) per le applicazioni in esecuzione su Amazon EKS Hybrid Nodes. I servizi Kubernetes di tipo LoadBalancer vengono utilizzati per esporre le applicazioni Kubernetes esterne al cluster. I servizi di tipo LoadBalancer vengono comunemente utilizzati con un’infrastruttura di bilanciamento del carico fisico in ambiente cloud oppure on-premises per servire il traffico del carico di lavoro. Questa infrastruttura di bilanciamento del carico viene in genere fornita con un controller specifico per l’ambiente.
AWS supporta AWS Network Load Balancer (NLB) e Cilium per i servizi di tipo LoadBalancer in esecuzione su nodi ibridi EKS. La decisione di utilizzare NLB o Cilium si basa sulla fonte del traffico dell’applicazione. Se il traffico dell’applicazione proviene da una Regione AWS, AWS consiglia di utilizzare NLB di AWS e il controller del bilanciatore del carico di AWS. Se il traffico delle applicazioni proviene dall’ambiente locale on-premises o edge, AWS consiglia di utilizzare le funzionalità di bilanciamento del carico integrate di Cilium, che possono essere utilizzate con o senza l’infrastruttura di bilanciamento del carico nell’ambiente.
Per il bilanciamento del carico del traffico delle applicazioni di livello 7 (L7), consulta Configurazione dell’ingresso Kubernetes per nodi ibridi. Per informazioni generali sul bilanciamento del carico con EKS, consulta Best Practices for Load Balancing.
Network Load Balancer di AWS
Puoi utilizzare il Controller di bilanciatore del carico di AWS e NLB con il tipo di destinazione ip per i carichi di lavoro in esecuzione su nodi ibridi. Quando utilizzi il tipo di destinazione ip, NLB inoltra il traffico direttamente ai pod, aggirando il percorso di rete del livello di servizio. Affinché NLB raggiunga le destinazioni IP dei pod sui nodi ibridi, i pod CIDR on-premises devono essere instradabili sulla rete on-premises. Inoltre, il Controller del bilanciatore del carico di AWS utilizza webhook e richiede una comunicazione diretta dal piano di controllo EKS. Per ulteriori informazioni, consulta Configurazione di webhook per nodi ibridi.
-
Consulta Esecuzione del routing del traffico TCP e UDP con Network Load Balancer per i requisiti di configurazione delle sottoreti, consulta Installa il AWS Load Balancer Controller con Helm e Best Practices for Load Balancing per ulteriori informazioni sul Network Load Balancer di AWS e il Controller del bilanciatore del carico di AWS.
-
Consulta le AWS Load Balancer Controller NLB configurations
per le configurazioni che possono essere applicate ai servizi di tipo LoadBalancercon il Network Load Balancer di AWS.
Prerequisiti
-
Cilium è installato seguendo le istruzioni contenute in Configurazione della CNI per nodi ibridi.
-
Il piano di controllo BGP di Cilium è abilitato seguendo le istruzioni contenute in Configurazione di Cilium BGP per nodi ibridi. Se non desideri utilizzare BGP, devi utilizzare un metodo alternativo per rendere i pod CIDR on-premises instradabili sulla rete on-premises; consulta CIDR dei pod remoti instradabili per ulteriori informazioni.
-
Helm è installato nell’ambiente a riga di comando, consulta Setup Helm instructions.
-
eksctl è installato nell’ambiente a riga di comando, consulta Setup eksctl instructions.
Procedura
-
Scaricare una policy IAM per il Controller del bilanciatore del carico AWS che consente di effettuare chiamate alle API AWS per conto dell’utente.
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json -
Creare una policy IAM utilizzando le policy scaricate nel passaggio precedente.
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json -
Sostituisci i valori per il nome del cluster (
CLUSTER_NAME), la Regione AWS (AWS_REGION) e l’ID dell’account AWS (AWS_ACCOUNT_ID) con le tue impostazioni ed esegui il comando seguente.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 -
Aggiungi il repository di grafici Helm eks-charts. AWS conserva questo repository su GitHub.
helm repo add eks https://aws.github.io/eks-charts -
Aggiorna il repository locale per assicurarti di avere i grafici più recenti.
helm repo update eks -
Installazione del Controller del bilanciatore del carico AWS. Sostituisci i valori per il nome del cluster (
CLUSTER_NAME), la Regione AWS (AWS_REGION), l’ID del VPC (VPC_ID) e la versione del Controller del bilanciatore del carico di AWS del grafico Helm (AWS_LBC_HELM_VERSION) con le tue impostazioni. Puoi trovare la versione più recente del grafico Helm eseguendohelm search repo eks/aws-load-balancer-controller --versions. Se stai eseguendo un cluster in modalità mista con nodi ibridi e nodi nel Cloud di AWS, puoi eseguire il Controller del bilanciatore del carico di AWS sui nodi cloud seguendo le istruzioni riportate in Controller del bilanciatore del carico AWS.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 -
Verifica che il Controller del bilanciatore del carico di AWS sia stato installato correttamente.
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 -
Definisci un’applicazione di esempio in un file denominato
tcp-sample-app.yaml. L’esempio seguente utilizza una semplice implementazione NGINX con una porta TCP.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 -
Applica l’implementazione al cluster.
kubectl apply -f tcp-sample-app.yaml -
Definisci un servizio di tipo LoadBalancer per l’implementazione in un file denominato
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 -
Applica la mappa di configurazione al cluster.
kubectl apply -f tcp-sample-service.yaml -
Il provisioning dell’NLB per il Servizio può richiedere alcuni minuti. Una volta effettuato il provisioning dell’NLB, al Servizio verrà assegnato un indirizzo che corrisponde al nome DNS dell’implementazione dell’NLB.
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 -
Accedi al Servizio utilizzando l’indirizzo dell’NLB.
curl k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com.rproxy.govskope.caDi seguito viene riportato un output di esempio.
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...] -
Eliminare tutte le risorse create.
kubectl delete -f tcp-sample-service.yaml kubectl delete -f tcp-sample-app.yaml
Bilanciamento del carico Cilium all’interno del cluster
Cilium può essere utilizzato come bilanciatore del carico all’interno del cluster per i carichi di lavoro in esecuzione su nodi ibridi EKS, il che può essere utile per ambienti che non dispongono di un’infrastruttura di bilanciamento del carico. Le funzionalità di bilanciamento del carico di Cilium si basano su una combinazione di funzionalità di Cilium, tra cui la sostituzione del kube-proxy, la gestione indirizzi IP (IPAM) del bilanciatore del carico e il piano di controllo BGP. Le responsabilità di queste funzionalità sono descritte di seguito:
-
Sostituzione del Cilium proxy-kube: gestisce il traffico del servizio di routing verso i pod di backend.
-
IPAM del bilanciatore del carico Cilium: gestisce gli indirizzi IP che possono essere assegnati a servizi di tipo
LoadBalancer. -
Piano di controllo BGP Cilium: pubblicizza gli indirizzi IP assegnati dalla IPAM del bilanciatore del carico alla rete on-premises.
Se non utilizzi la sostituzione del kube-proxy Cilium, puoi comunque utilizzare l’IPAM del bilanciatore del carico e il Piano di controllo BGP Cilium per allocare e assegnare indirizzi IP per i servizi di tipo LoadBalancer. Se non utilizzi la sostituzione del kube-proxy Cilium, il bilanciamento del carico dei servizi sui pod di backend viene gestito per impostazione predefinita dalle regole kube-proxy e iptables in EKS.
Prerequisiti
-
Cilium è stato installato seguendo le istruzioni contenute in Configurazione della CNI per nodi ibridi con o senza la sostituzione di kube-proxy abilitata. La sostituzione del kube-proxy Cilium richiede l’esecuzione di un sistema operativo con un kernel Linux recente come v4.19.57, v5.1.16 o v5.2.0. Tutte le versioni recenti dei sistemi operativi supportati per l’uso con nodi ibridi soddisfano questi criteri, ad eccezione di Red Hat Enterprise Linux (RHEL) 8.x.
-
Il piano di controllo BGP di Cilium è abilitato seguendo le istruzioni contenute in Configurazione di Cilium BGP per nodi ibridi. Se non desideri utilizzare BGP, devi utilizzare un metodo alternativo per rendere i pod CIDR on-premises instradabili sulla rete on-premises; consulta CIDR dei pod remoti instradabili per ulteriori informazioni.
-
Helm è installato nell’ambiente a riga di comando, consulta Setup Helm instructions.
Procedura
-
Crea un file denominato
cilium-lbip-pool-loadbalancer.yamlcon una risorsaCiliumLoadBalancerIPPoolper configurare l’intervallo di indirizzi IP del bilanciatore del carico per i tuoi servizi di tipo LoadBalancer.-
Sostituisci
LB_IP_CIDRcon l’intervallo di indirizzi IP da utilizzare per quelli del bilanciatore del carico. Per selezionare un singolo indirizzo IP, utilizza un CIDR/32. Per ulteriori informazioni, consulta LoadBalancer IP Address Managementnella documentazione di Cilium. -
Il campo
serviceSelectorè configurato in modo che corrisponda al nome del servizio che creerai in un passaggio successivo. Con questa configurazione, gli IP di questo pool verranno assegnati solo ai servizi con lo stesso nometcp-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
-
-
Applica la risorsa
CiliumLoadBalancerIPPoolal cluster.kubectl apply -f cilium-lbip-pool-loadbalancer.yaml -
Verifica che nel pool sia disponibile almeno un indirizzo IP.
kubectl get ciliumloadbalancerippools.cilium.ioNAME DISABLED CONFLICTING IPS AVAILABLE AGE tcp-service-pool false False 1 24m -
Crea un file denominato
cilium-bgp-advertisement-loadbalancer.yamlcon una risorsaCiliumBGPAdvertisementper pubblicizzare l’indirizzo IP del bilanciatore del carico per il servizio che creerai nel passaggio successivo. Se non utilizzi un BGP di Cilium, puoi ignorare questo passaggio. L’indirizzo IP del bilanciatore del carico utilizzato per il servizio deve essere instradabile sulla rete on-premises per consentire all’utente di interrogare il servizio nella Passaggio finale.-
Il campo
advertisementTypeè impostato suServiceeservice.addressesè impostato suLoadBalancerIPper pubblicizzare solo l’LoadBalancerIPper i servizi di tipoLoadBalancer. -
Il campo
selectorè configurato in modo che corrisponda al nome del servizio che creerai in un passaggio successivo. Con questa configurazione, verrà pubblicizzato solo l’LoadBalancerIPper i servizi con lo stesso nometcp-sample-service.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
-
-
Applica la risorsa
CiliumBGPAdvertisemental cluster. Se non utilizzi un BGP di Cilium, puoi ignorare questo passaggio.kubectl apply -f cilium-bgp-advertisement-loadbalancer.yaml -
Definisci un’applicazione di esempio in un file denominato
tcp-sample-app.yaml. L’esempio seguente utilizza una semplice implementazione NGINX con una porta TCP.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 -
Applica l’implementazione al cluster.
kubectl apply -f tcp-sample-app.yaml -
Definisci un servizio di tipo LoadBalancer per l’implementazione in un file denominato
tcp-sample-service.yaml.-
Puoi richiedere un indirizzo IP specifico dal pool di IP del bilanciatore del carico con l’annotazione
lbipam.cilium.io/ipssull’oggetto del servizio. Puoi rimuovere questa annotazione se non desideri richiedere un indirizzo IP specifico per il servizio. -
Il campo della specifica
loadBalancerClassè obbligatorio per impedire al provider cloud di AWS precedente di creare un Classic Load Balancer per il servizio. Nell’esempio seguente, questo è configurato suio.cilium/bgp-control-planeper utilizzare il piano di controllo BGP di Cilium come classe di bilanciatore del carico. In alternativa, questo campo può essere configurato suio.cilium/l2-announcerper utilizzare la Funzionalità L2 Announcementsdi Cilium (attualmente in versione beta e non supportata ufficialmente da 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
-
-
Applica il servizio al cluster. Il servizio verrà creato con un indirizzo IP esterno che puoi utilizzare per accedere all’applicazione.
kubectl apply -f tcp-sample-service.yaml -
Verifica che il servizio sia stato creato correttamente e che gli sia stato assegnato un IP dal
CiliumLoadBalancerIPPoolcreato nel passaggio precedente.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 -
Se utilizzi Cilium in modalità kube-proxy sostitutivo, puoi confermare che Cilium sta gestendo il bilanciamento del carico per il servizio eseguendo il comando seguente. Nell’output seguente, gli indirizzi
10.86.2.xsono gli indirizzi IP dei pod di backend per il servizio.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) -
Conferma che Cilium stia pubblicizzando l’indirizzo IP sulla rete on-premises tramite BGP. Nell’esempio seguente ci sono cinque nodi ibridi, ciascuno dei quali pubblicizza
LB_IP_ADDRESSper il serviziotcp-sample-servicesulla rete on-premises.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}] -
Accedi al servizio utilizzando l’indirizzo IP del bilanciatore del carico assegnato.
curlLB_IP_ADDRESSDi seguito viene riportato un output di esempio.
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...] -
Eliminare tutte le risorse create.
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