Bilanciamento del carico in bundle con MetalLB

Questo documento mostra come configurare Google Distributed Cloud per utilizzare il bilanciamento del carico in bundle con il bilanciatore del carico MetalLB. Questo documento è destinato agli specialisti di Networking che progettano e realizzano l'architettura di rete per la loro organizzazione e installano, configurano e supportano le apparecchiature di rete. Per saperne di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Google Cloud contenuti, consulta Ruoli e attività comuni degli utenti GKE.

In Google Distributed Cloud, MetalLB viene eseguito in modalità di livello 2.

Esempio di configurazione di MetalLB

Di seguito è riportato un esempio di configurazione per i cluster che eseguono il bilanciatore del carico MetalLB:

Configurazione del bilanciatore del carico MetalLB.
Configurazione del bilanciatore del carico MetalLB

Il diagramma precedente mostra un deployment di MetalLB. MetalLB viene eseguito direttamente sui nodi del cluster. In questo esempio, il cluster di amministrazione e il cluster utente si trovano su due VLAN separate e ogni cluster si trova in una subnet separata:

Cluster Subnet
Cluster di amministrazione 172.16.20.0/24
Cluster utente 172.16.40.0/24

admin-cluster.yaml

La seguente parte di un file di configurazione del cluster di amministrazione mostra la configurazione visualizzata nel diagramma precedente di:

  • Control plane per l'alta affidabilità

  • Bilanciatore del carico MetalLB

  • VIP su MetalLB per il server API Kubernetes del cluster di amministrazione

network:
  ...
  controlPlaneIPBlock:
    netmask: "255.255.255.0"
    gateway: "172.16.20.1"
    ips:
    - ip: "172.16.20.50"
      hostname: "admin-cp-1"
    - ip: "172.16.20.51"
      hostname: "admin-cp-2"
    - ip: "172.16.20.52"
      hostname: "admin-cp-3"
loadBalancer:
  kind: "MetalLB"
  ...
  vips:
    controlPlaneVIP: "172.16.20.100"
...
adminMaster:
  cpus: 4
  memoryMB: 16384
  replicas: 3

user-cluster.yaml

La seguente parte di un file di configurazione del cluster utente mostra la configurazione di:

  • Pool di indirizzi da cui il controller MetalLB può scegliere e assegnare ai servizi di tipo LoadBalancer. Il VIP in entrata si trova in questo pool.

  • VIP designato per il server API Kubernetes del cluster utente e il VIP in entrata che hai scelto di configurare per il proxy in entrata.

  • Un pool di nodi abilitato all'utilizzo di MetalLB. MetalLB verrà eseguito il deployment sui nodi di questo pool di nodi.

enableControlplaneV2: true
...
network:
  hostConfig:
  ...

  ipMode:
    type: "static"
    ipBlockFilePath: "config-folder/user-cluster-ipblock.yaml"
...
  controlPlaneIPBlock:
    netmask: "255.255.255.0"
    gateway: "172.16.40.1"
    ips:
    - ip: "172.16.40.21"
      hostname: "user-cp"
loadBalancer:
  kind: MetalLB
  metalLB:
    addressPools:
    - name: "address-pool-1"
      addresses:
      - "172.16.40.101-172.16.40.112
      avoidBuggyIPs: true
  ...

  vips:
    controlPlaneVIP: "172.16.20.100"
    ingressVIP: "172.16.40.101"
...
nodePools:
- name: "node-pool-1"
  cpus: 4
  memoryMB: 8192
  replicas: 3
  enableLoadBalancer: true

La configurazione nell'esempio precedente specifica un insieme di indirizzi disponibili per i servizi. Quando uno sviluppatore di applicazioni crea un servizio di tipo LoadBalancer nel cluster utente, il controller MetalLB sceglie un indirizzo IP da questo pool.

user-cluster-ipblock.yaml

Il seguente esempio di file di blocco IP mostra la designazione degli indirizzi IP per i nodi worker nel cluster utente. Include un indirizzo IP aggiuntivo da utilizzare durante gli upgrade, gli aggiornamenti e la riparazione automatica del cluster.

blocks:
- netmask: "255.255.255.0"
  gateway: "17.16.40.1"
  ips:
  - ip: 172.16.40.22
    hostname: user-vm-1
  - ip: 172.16.40.23
    hostname: user-vm-2
  - ip: 172.16.40.24
    hostname: user-vm-3
  - ip: 172.16.40.25
    hostname: user-vm-4
  - ip: 172.16.40.26
    hostname: user-vm-5
  - ip: 172.16.40.27
    hostname: user-vm-6

Configurare MetalLB

Aprire le porte del firewall

MetalLB utilizza la libreria memberlist di Go per eseguire l'elezione del leader. La libreria memberlist utilizza la porta TCP 7946 e la porta UDP 7946 per scambiare informazioni. Assicurati che queste porte siano accessibili per il traffico in entrata e in uscita su tutti i nodi del bilanciatore del carico.

Abilitare MetalLB per un nuovo cluster di amministrazione

Nel file di configurazione del cluster di amministrazione, imposta loadBalancer.kind su "MetalLB".

loadBalancer:
  kind: "MetalLB"

Compila il resto del file di configurazione del cluster di amministrazione e crea il tuo cluster di amministrazione come descritto in Creare un cluster di amministrazione.

Specificare i pool di indirizzi

Il controller MetalLB assegna gli indirizzi IP per i servizi. Quando uno sviluppatore di applicazioni crea un servizio di tipo LoadBalancer in un cluster utente, il controller MetalLB assegna automaticamente un indirizzo IP per il servizio. Il controller MetalLB seleziona un indirizzo IP da un pool di indirizzi che specifichi.

Per assicurarti che il cluster utente abbia indirizzi IP sufficienti, considera il numero massimo di servizi LoadBalancer che potrebbero essere attivi. Quindi, specifica un numero sufficiente di indirizzi IP nella loadBalancer.metalLB.addressPools sezione del file di configurazione del cluster utente.

Gli indirizzi nel pool devono essere in formato CIDR o in formato di intervallo. Per specificare un singolo indirizzo, utilizza un CIDR /32. Ad esempio:

addresses:
  -   "192.0.2.0/26"
  -   "192.0.2.64-192.0.2.72"
  -   "192.0.2.75/32"

Escludere gli indirizzi IP utilizzati per altri scopi

Non includere i seguenti indirizzi IP in alcun pool di indirizzi:

Se devi modificare gli indirizzi in un pool dopo la creazione del cluster, puoi utilizzare gkectl update cluster. Per ulteriori informazioni, consulta Aggiornare MetalLB.

Abilitare MetalLB per un nuovo cluster utente

Nel file di configurazione del cluster utente:

  • Imposta loadBalancer.kind su "MetalLB".
  • Specifica uno o più pool di indirizzi per i servizi. Il VIP in entrata deve trovarsi in uno di questi pool.
  • Imposta enableLoadBalancer su true per almeno un pool di nodi nel cluster. Se impostato su true, questo campo consente all'elemento MetalLB di essere eseguito sui nodi del pool. Tieni presente che la versione pool di nodi del bilanciatore del carico deve corrispondere alla versione del cluster durante gli upgrade; il disallineamento delle versioni non è supportato per i node pool del bilanciatore del carico.

    Tieni presente le seguenti differenze nel comportamento del campo enableLoadBalancer quando enableAdvancedCluster è impostato su true (cluster avanzato abilitato): nella versione 1.31, quando il cluster avanzato è abilitato, questo campo non ha alcun effetto perché l'elemento MetalLB viene sempre eseguito sui nodi del control plane del cluster utente. Nella versione 1.32, quando il cluster avanzato è abilitato, questa limitazione è stata rimossa e devi specificare almeno un pool di nodi su cui viene eseguito l'elemento MetalLB.

Compila il resto del file di configurazione del cluster utente e crea il tuo cluster utente come descritto in Creare un cluster utente.

Assegnazione manuale degli indirizzi dei servizi

Se non vuoi che il controller MetalLB assegni automaticamente gli indirizzi IP di un determinato pool ai servizi, imposta il campo manualAssign del pool su true. Uno sviluppatore può quindi creare un servizio di tipo LoadBalancer e specificare manualmente uno degli indirizzi del pool. Ad esempio:

loadBalancer:
  metalLB:
    addressPools:
    - name: "my-address-pool-2"
      addresses:
      - "192.0.2.73-192.0.2.80"
      manualAssign: true

Evitare indirizzi IP che presentano bug

Se imposti il campo avoidBuggyIPs di un pool di indirizzi su true, il controller MetalLB non utilizzerà gli indirizzi del pool che terminano con .0 o .255. In questo modo si evita il problema dei dispositivi consumer che presentano bug e che eliminano erroneamente il traffico inviato a questi indirizzi IP speciali. Ad esempio:

loadBalancer:
  metalLB:
    addressPools:
    - name: "my-address-pool-1"
      addresses:
      - "192.0.2.0/24"
      avoidBuggyIPs: true

Creare un servizio di tipo LoadBalancer

Di seguito sono riportati due manifest: uno per un deployment e uno per un servizio:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      greeting: hello
  replicas: 3
  template:
    metadata:
      labels:
        greeting: hello
    spec:
      containers:
      - name: hello
        image: gcr.io/google-samples/hello-app:2.0
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  selector:
    greeting: hello
  ports:
  - name: metal-lb-example-port
    protocol: TCP
    port: 60000
    targetPort: 8080

Tieni presente che il manifest del servizio non specifica un indirizzo IP esterno. Il controller MetalLB sceglierà un indirizzo IP esterno dal pool di indirizzi specificato nel file di configurazione del cluster utente.

Salva i manifest in un file denominato my-dep-svc.yaml. Quindi crea gli oggetti Deployment e Service:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-dep-svc.yaml

Visualizza il servizio:

kubectl --kubeconfig USER_CLUSTER_KUBECONIFG get service my-service --output wide

L'output mostra l'indirizzo IP esterno assegnato automaticamente al servizio. Ad esempio:

NAME         TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)           AGE   SELECTOR
my-service   LoadBalancer   10.96.2.166   192.0.2.2   60000:31914/TCP   28s

Verifica che l'indirizzo IP esterno assegnato sia stato prelevato dal pool di indirizzi specificato nel file di configurazione del cluster utente. Ad esempio, 192.0.2.2 si trova in questo pool di indirizzi:

metalLB:
  addressPools:
  - name: "address-pool-1"
    addresses:
     - "192.0.2.0/24"
     - "198.51.100.1-198.51.100.3"

Chiama il servizio:

curl EXTERNAL_IP_ADDRESS:60000

L'output mostra un messaggio Hello, world!:

Hello, world!
Version: 2.0.0

Aggiornare MetalLB

Dopo aver creato il cluster, puoi aggiornare i pool di indirizzi MetalLB e il campo enableLoadBalancer nei node pool. Apporta le modifiche desiderate nel file di configurazione del cluster utente, quindi chiama gkectl update cluster:

gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

Pod e ConfigMap di MetalLB

Il controller MetalLB viene eseguito come deployment e l'elemento MetalLB viene eseguito come DaemonSet sui nodi dei pool in cui enableLoadBalancer è impostato su true. Il controller MetalLB gestisce gli indirizzi IP assegnati ai servizi. L'elemento MetalLB esegue l'elezione del leader e annuncia i VIP dei servizi.

Visualizza tutti i pod MetalLB:

kubectl --kubeconfig USER_CLUSTER_KUBECONIFG get pods --namespace kube-system --selector app=metallb

Puoi utilizzare i log dei pod MetalLB per la risoluzione dei problemi.

La configurazione di MetalLB viene memorizzata in un ConfigMap in un formato noto a MetalLB. Non modificare direttamente il ConfigMap. Utilizza invece gkectl update cluster come descritto in precedenza. Per visualizzare il ConfigMap per la risoluzione dei problemi:

kubectl --kubeconfig USER_CLUSTER_KUBECONIFG get configmap metallb-config --namespace kube-system

Vantaggi dell'utilizzo di MetalLB

  • MetalLB viene eseguito direttamente sui nodi del cluster, quindi non richiede VM aggiuntive.

  • Il controller MetalLB esegue la gestione degli indirizzi IP per i servizi, quindi non devi scegliere manualmente un indirizzo IP per ogni servizio.

  • Le istanze attive di MetalLB per servizi diversi possono essere eseguite su nodi diversi.

  • Puoi condividere un indirizzo IP tra servizi diversi.

Confronto tra MetalLB, F5 BIG-IP e Seesaw

  • I VIP devono trovarsi nella stessa subnet dei nodi del cluster. Questo è un requisito anche per Seesaw, ma non per F5 BIG-IP.

  • Non esistono metriche per il traffico.

  • Non è presente alcun failover senza interruzioni; le connessioni esistenti vengono reimpostate durante il failover.

  • Il traffico esterno verso i pod di un determinato servizio passa attraverso un singolo nodo che esegue l'elemento MetalLB. Ciò significa che l'indirizzo IP del client di solito non è visibile ai container in esecuzione nel pod.

  • Cisco Application Centric Infrastructure (ACI) con Dataplane IP Learning non è compatibile con i bilanciatori del carico Seesaw e MetalLB. Ti consigliamo di utilizzare il bilanciamento del carico manuale o di disattivare Dataplane IP Learning quando utilizzi Seesaw o MetalLB come bilanciatore del carico. Inoltre, Seesaw è in modalità di manutenzione. A partire dalla versione 1.32 di Google Distributed Cloud, gli upgrade sono bloccati per i cluster che utilizzano Seesaw. Prima di eseguire l'upgrade alla versione 1.32, devi eseguire la migrazione dei cluster alle funzionalità consigliate.