Configurare il bilanciamento del carico in bundle con MetalLB

Questa pagina descrive come configurare il bilanciamento del carico in bundle con MetalLB per Google Distributed Cloud. I bilanciatori del carico MetalLB 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 in Google Distributed Cloud.

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 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 cluster di configurazione ed esempi di configurazioni valide, consulta uno dei pagine seguenti:

loadBalancer.mode

Questo valore deve essere bundled per attivare 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 a il piano di controllo Kubernetes (i server API Kubernetes). Questo indirizzo IP deve devono trovarsi nella stessa subnet di livello 2 dei nodi nel cluster. Non elencare nella sezione address pools della .

loadBalancer.vips.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 in admin cluster di configurazione dei deployment. Questo indirizzo deve essere indicato nella pool della configurazione.

loadBalancer.addressPools

Questa sezione della configurazione contiene uno o più pool di indirizzi. Ogni pool di indirizzi specifica un elenco di intervalli di indirizzi IP. Quando crei un Servizio di tipo LoadBalancer, gli indirizzi IP esterni per il servizio vengono scelti da questi intervalli.

I pool di indirizzi sono specificati nel seguente formato:

- name: POOL_NAME
  avoidBuggyIPs: BOOLEAN
  manualAssign: BOOLEAN
  addresses:
  - IP_RANGE
  - IP_RANGE2
  • name: il nome del pool di indirizzi, pool-name, del tuo per scopi organizzativi. Questo campo è immutabile.
  • avoidBuggyIPs: (facoltativo) true o false. Se true, il pool omette gli indirizzi IP che terminano con .0 e .255. Alcuni cali dell'hardware di rete il traffico verso questi indirizzi speciali. Puoi omettere questo campo, il relativo valore predefinito è false. Questo campo è modificabile.
  • manualAssign: (facoltativo) true o false. Se true, gli indirizzi in questo pool non vengono assegnati automaticamente ai servizi Kubernetes. Se true, un indirizzo IP in questo pool viene utilizzato solo se specificato esplicitamente da un servizio. Puoi omettere questo campo, il cui valore predefinito è false. Questo campo è mutabile.
  • addresses Un elenco di uno o più intervalli di indirizzi IP non sovrapposti. ip-range può essere specificato in notazione CIDR (come 198.51.100.0/24) o la notazione di intervallo (ad es. 198.51.100.0-198.51.100.10, con senza spazi attorno al trattino). Questo campo è immutabile.

Gli intervalli di indirizzi IP nell'elenco addresses non devono sovrapporsi e devono trovarsi nella stessa subnet dei nodi su cui sono in esecuzione i bilanciatori del carico.

loadBalancer.nodePoolSpec

Questa sezione della configurazione specifica un elenco di nodi su cui eseguire il carico bilanciatori del carico. I nodi dei bilanciatori del carico possono eseguire carichi di lavoro regolari per impostazione predefinita; c'è nessuna incompatibilità speciale sui nodi. Anche se i nodi nel pool di nodi del bilanciatore del carico di carichi di lavoro, sono separati dai nodi nei pool di nodi worker. Tu non può includere un determinato nodo cluster in più di un pool di nodi. Gli indirizzi IP dei nodi sovrapposti tra i pool di nodi bloccano la creazione del cluster e altre operazioni del cluster.

Se vuoi impedire l'esecuzione dei carichi di lavoro su un nodo nel bilanciatore del carico di pool di nodi, aggiungi la seguente incompatibilità al nodo:

node-role.kubernetes.io/load-balancer:NoSchedule

Google Distributed Cloud aggiunge tolleranze per questo stato ai pod necessari per il bilanciamento del carico.

L'esempio seguente mostra un pool di nodi di bilanciamento del carico con due nodi. Il primo ha un indirizzo IP standard nodePoolSpec.nodes.address ("1.2.3.4") e un Indirizzo IP Kubernetes nodePoolSpec.nodes.k8sIP (10.0.0.32). Se specifichi l'indirizzo facoltativo k8sIP per un nodo, è dedicato alla gestione del traffico di dati per il nodo, come richieste e risposte per l'API Kubernetes, kubelet e carichi di lavoro. In questo caso, l'indirizzo IP standard nodePoolSpec.nodes.address viene utilizzato per le connessioni SSH al nodo per le operazioni del cluster amministrativo. Se non specifichi un indirizzo k8sIP, l'indirizzo IP del nodo standard gestisce tutto il traffico per il nodo.

nodePoolSpec:
  nodes:
  - address: 1.2.3.4
    k8sIP: 10.0.0.32
  - address: 10.0.0.33

Per impostazione predefinita, tutti i nodi nel pool di nodi del bilanciatore del carico devono trovarsi nello stesso livello 2 come i VIP del bilanciatore del carico configurati loadBalancer.addressPools del file di configurazione. Tuttavia, se specifichi un indirizzo IP Kubernetes k8sIP per un nodo, solo questo deve trovarsi nella stessa subnet di livello 2 degli altri VIP del bilanciatore del carico.

Se nodePoolSpec non è impostato, i bilanciatori del carico in bundle vengono eseguiti sul controllo nodi del piano. Ti consigliamo di eseguire i bilanciatori del carico su pool di nodi separati se possibile.

Bilanciamento del carico del control plane

Il bilanciatore del carico del piano di controllo gestisce l'indirizzo IP virtuale del piano di controllo (VIP). Google Distributed Cloud esegue Keepalived e HAProxy come pod statici Kubernetes sui nodi del bilanciatore del carico per annunciare il VIP del piano di controllo. KeepaLive utilizza lo standard Virtual Router Redundancy Protocol (VRRP) sui nodi del bilanciatore del carico per la disponibilità del servizio.

Bilanciamento del carico del piano dati

Il bilanciatore del carico del piano dati è per tutti i servizi Kubernetes di tipo LoadBalancer Google Distributed Cloud utilizza MetalLB in esecuzione in modalità di livello 2 per il bilanciamento del carico del piano dati. Il bilanciamento del carico del piano dati puoi essere configurato solo tramite Google Distributed Cloud, non modificare direttamente il ConfigMap MetalLB. Puoi utilizzare tutte le funzionalità di MetalLB, tra cui la condivisione degli indirizzi IP tra i servizi. Per informazioni sulle funzionalità, consulta la documentazione MetalLB.

MetalLB esegue un pod speaker su ogni nodo utilizzando un daemonset, utilizzando memberlist per l'alta disponibilità. Esiste un nodo bilanciatore del carico MetalLB dedicato per ogni servizio Kubernetes, anziché uno per l'intero cluster. In questo modo il traffico viene distribuiti nei nodi dei bilanciatori 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. Il raggruppamento dei bilanciatori del carico del piano dati sui nodi del piano di controllo aumenta l'utilizzo dei nodi del piano di controllo. Inoltre, il raggruppamento sui nodi del piano di controllo aumenta anche il rischio di sovraccaricare il piano di controllo e il profilo di rischio delle informazioni riservate sul piano di controllo, come le chiavi SSH.

Conservazione dell'indirizzo IP di origine del client

Il servizio LoadBalancer creato con la soluzione di bilanciamento del carico di livello 2 in dotazione utilizza l'impostazione predefinita Cluster per il criterio del traffico esterno. Questa impostazione, spec.externalTrafficPolicy: Cluster, instrada il traffico esterno agli endpoint a livello di cluster, ma oscura anche l'indirizzo IP di origine del client.

Le sezioni seguenti descrivono come configurare il cluster per preservare l'indirizzo IP di origine del client.

Servizi NodePort

Kubernetes esegue la Network Address Translation dell'origine (SNAT) per i NodePort servizi. Per conservare gli indirizzi IP di origine client, imposta Da service.spec.externalTrafficPolicy a Local. Kubernetes non eseguirà la SNAT ma devi assicurarti che ci siano pod in esecuzione esattamente sull'IP del nodo che hai scelto.

Servizi LoadBalancer

Quando utilizzi externalTrafficPolicy: Local nei tuoi servizi LoadBalancer, imposta i pod delle applicazioni in modo che vengano eseguiti esattamente sui nodi del bilanciatore del carico. Aggiungi il nodeSelector seguente ai pod dell'applicazione per apportare questa modifica:

apiVersion: v1
kind: Pod
...
spec:
  nodeSelector:
      baremetal.cluster.gke.io/lbnode: "true"
...

In entrata

Se le tue applicazioni sono servizi HTTP, puoi ottenere la visibilità dell'indirizzo IP del client configurando i componenti di ingresso:

  1. Apri il servizio istio-ingress per la modifica:

    kubectl edit service -n gke-system istio-ingress
  2. Aggiungi externalTrafficPolicy: Local a spec, salva ed esci dall'editor.

    apiVersion: v1
    kind: Service
    ...
    spec:
    ...
      externalTrafficPolicy: Local
    
  3. Apri il deployment istio-ingress da modificare:

    kubectl edit deployment -n gke-system istio-ingress
  4. Aggiungi il seguente nodeSelector al deployment, salva 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 vedono un'intestazione X-Forwarded-For con l'IP del cliente, come nell'esempio seguente:

X-Forwarded-For: 21.0.104.4