In questa pagina viene descritto come configurare il bilanciamento del carico in bundle per i cluster Anthos su Bare Metal. I cluster Anthos su Bare Metal eseguono il deployment dei bilanciatori del carico di livello 4 che vengono eseguiti su un pool dedicato di nodi worker o sugli stessi nodi del piano di controllo.
Consulta la Panoramica dei bilanciatori del carico per esempi di topologie di bilanciamento del carico disponibili nei cluster Anthos su Bare Metal.
Requisiti
- Tutti i nodi del bilanciatore del carico devono trovarsi nella stessa subnet di livello 2.
- Tutti i VIP devono trovarsi nella subnet dei nodi del bilanciatore del carico ed essere instradabili tramite il gateway della subnet.
- Il gateway della subnet del bilanciatore del carico deve ascoltare i messaggi ARP gratuiti e inoltrare i pacchetti ARP ai nodi del bilanciatore del carico.
Campi di configurazione
Modifica la sezione cluster.spec.loadBalancer
del file di configurazione del cluster per configurare il bilanciamento del carico in bundle. Per informazioni sui file di configurazione del cluster ed esempi di configurazioni valide, consulta una delle seguenti pagine:
loadBalancer.mode
Questo valore deve essere bundled
per abilitare il bilanciamento del carico in bundle.
loadBalancer.ports.controlPlaneLBPort
Questo valore specifica la porta di destinazione da utilizzare per il traffico inviato al piano di controllo Kubernetes (server API Kubernetes).
loadBalancer.vips.controlPlaneVIP
Questo valore specifica l'indirizzo IP di destinazione da utilizzare per il traffico inviato al piano di controllo
Kubernetes (server API Kubernetes). Questo indirizzo IP deve trovarsi nella stessa subnet di livello 2 dei nodi che eseguono bilanciatori del carico. Non elencare
questo indirizzo nella sezione [address pools](#address-pools)
del
file di configurazione.
loadBalancer.vip.ingressVIP
Questo valore specifica l'indirizzo IP da utilizzare per i servizi dietro il bilanciatore del carico per il traffico in entrata. Questo campo non è consentito nei file di configurazione del cluster di amministrazione. Questo indirizzo deve essere elencato nella sezione dei pool di indirizzi della configurazione.
loadBalancer.addressPools
Questa sezione della configurazione contiene uno o più pool di indirizzi specificati in questo formato:
- name: pool-name
avoidBuggyIPs: boolean
manualAssign: boolean
addresses:
- ip-range
- ip-range
- name: il nome del pool di indirizzi, pool-name, a scopo organizzativo.
- avoidBuggyIPs (facoltativo):
true
ofalse
. Setrue
, il pool omette gli indirizzi IP che terminano con.0
e.255
. Alcuni componenti hardware di rete bloccano il traffico verso questi indirizzi speciali. Puoi omettere questo campo, il suo valore predefinito èfalse
. - manualAssign: (facoltativo)
true
ofalse
. Setrue
, gli indirizzi in questo pool non vengono assegnati automaticamente ai servizi Kubernetes. Setrue
, un indirizzo IP in questo pool viene utilizzato solo quando è specificato esplicitamente da un servizio. Puoi omettere questo campo, il suo valore predefinito è false. - addresss un elenco di uno o più intervalli di indirizzi IP non sovrapposti.
ip-range può essere specificato in notazione CIDR (ad esempio
198.51.100.0/24
) o notazione di intervallo (ad esempio198.51.100.0-198.51.100.10
, senza spazi attorno al trattino).
Gli intervalli di indirizzi IP nell'elenco addresses
non devono sovrapporsi e devono trovarsi nella stessa subnet dei nodi che eseguono bilanciatori del carico.
loadBalancer.nodePoolSpec
Questa sezione della configurazione specifica un elenco di nodi su cui eseguire i bilanciatori del carico. Per impostazione predefinita, i nodi del bilanciatore del carico possono eseguire carichi di lavoro normali; non esiste un'incompatibilità speciale su questi nodi. L'esempio seguente mostra un pool di nodi con due nodi. Il primo nodo, 1.2.3.4
, utilizza il campo k8sIP
per specificare l'indirizzo IP del nodo nel cluster. L'indirizzo 1.2.3.4
viene utilizzato solo per l'accesso SSH.
nodePoolSpec:
nodes:
- address: 1.2.3.4
k8sIP: 10.0.0.32
- address: 10.0.0.33
Tutti i nodi nel pool di nodi del bilanciatore del carico devono trovarsi nella stessa subnet di livello 2 dei
VIP del bilanciatore del carico configurati nella sezione
loadBalancer.addressPools
del file di configurazione.
Se un nodo ha un k8sIP
configurato, solo quell'indirizzo deve trovarsi nella stessa subnet del
livello 2 degli altri VIP del bilanciatore del carico.
Se il nodePoolSpec
non è impostato, i bilanciatori del carico in bundle vengono eseguiti sui nodi del piano di controllo. Ti consigliamo di eseguire i bilanciatori del carico su pool di nodi separati, se possibile.
Bilanciamento del carico del piano di controllo
Il bilanciatore del carico del piano di controllo gestisce l'indirizzo IP virtuale del piano di controllo. I cluster Anthos su Bare Metal eseguono Keepalive e HAProxy come pod statici di Kubernetes sui nodi del bilanciatore del carico per annunciare il VIP del piano di controllo. Keepalive utilizza il virtual router Redundancy Protocol (VRRP) sui nodi del bilanciatore del carico per l'alta disponibilità.
Bilanciamento del carico del piano dati
Il bilanciatore del carico del piano dati è per tutti i servizi Kubernetes di tipo LoadBalancer
.
I cluster Anthos su Bare Metal utilizzano MetalLB in esecuzione in modalità Livello 2 per il bilanciamento del carico del piano dati. Il bilanciamento del carico del piano dati può essere configurato solo tramite cluster Anthos su Bare Metal, non modificare direttamente ConfigMap di MetalLBB. Puoi utilizzare tutte le funzionalità MetalLB, tra cui la condivisione degli indirizzi IP nei servizi.
Consulta la documentazione di MetalLB per informazioni sulle funzionalità.
MetalLB esegue un pod di altoparlanti su ciascun nodo utilizzando un daemonset, utilizzando memberlist per l'alta disponibilità. Esiste un nodo bilanciatore del carico dedicato MetalLB per ogni servizio Kubernetes, anziché uno per l'intero cluster. In questo modo il traffico viene distribuito tra i nodi del bilanciatore del carico se sono presenti più servizi.
I bilanciatori del carico del piano dati possono essere eseguiti sui nodi del piano di controllo o su un sottoinsieme di nodi worker. Raggruppare i bilanciatori del carico del piano dati sui nodi del piano di controllo aumenta l'utilizzo dei nodi del piano di controllo. Tuttavia, il raggruppamento sui nodi del piano di controllo aumenta anche il rischio di sovraccarico del piano di controllo e aumenta il profilo di rischio delle informazioni riservate sul piano di controllo, ad esempio le chiavi SSH.
Preservazione dell'indirizzo IP dell'origine client
Il servizio LoadBalancer
creato con la soluzione di bilanciamento del carico di livello 2 in bundle utilizza l'impostazione Cluster
predefinita per il criterio del traffico esterno.
Questa impostazione, spec.externalTrafficPolicy: Cluster
, instrada il traffico esterno agli endpoint a livello di cluster, ma nasconde anche l'indirizzo IP dell'origine client.
Le sezioni seguenti descrivono come configurare il cluster in modo da conservare l'indirizzo IP dell'origine client.
NodePort
servizi
Kubernetes esegue il NAT (Network Address Translation) per i servizi NodePort
. Per conservare gli indirizzi IP dell'origine client, imposta service.spec.externalTrafficPolicy
su Local
. Kubernetes non eseguirà più il NAT di origine, ma devi assicurarti che siano presenti pod in esecuzione esattamente sull'IP del nodo che hai scelto.
LoadBalancer
servizi
Quando utilizzi externalTrafficPolicy: Local
nei servizi LoadBalancer
, imposta i pod delle applicazioni in modo che vengano eseguiti esattamente sui nodi del bilanciatore del carico. Aggiungi il seguente nodeSelector
ai pod dell'applicazione per apportare questa modifica:
apiVersion: v1
kind: Pod
...
spec:
nodeSelector:
baremetal.cluster.gke.io/lbnode: "true"
...
Ingress
Se le tue applicazioni sono servizi HTTP, puoi ottenere la visibilità dell'IP client configurando i componenti in entrata:
Apri il servizio
istio-ingress
per la modifica:kubectl edit service -n gke-system istio-ingress
Aggiungi
externalTrafficPolicy: Local
aspec
, salva ed esci dall'editor.apiVersion: v1 kind: Service ... spec: ... externalTrafficPolicy: Local
Apri il deployment di
istio-ingress
per la modifica:kubectl edit deployment -n gke-system istio-ingress
Aggiungi il codice
nodeSelector
seguente al deployment, salvalo ed esci dall'editor.apiVersion: apps/v1 kind: Deployment ... spec: ... template: ... spec: ... nodeSelector: baremetal.cluster.gke.io/lbnode: "true" ...
Ora tutti i servizi dietro Ingress visualizzano un'intestazione X-Forwarded-For
con l'IP client, come nell'esempio seguente:
X-Forwarded-For: 21.0.104.4