Questo documento mostra come configurare Google Distributed Cloud per utilizzare il bilanciamento del carico incluso con il bilanciatore del carico MetalLB. Questa pagina è rivolta agli specialisti di networking che progettano e progettano la rete per la propria organizzazione, nonché installano, configurano e supportano le apparecchiature di rete. Per scoprire di più sui ruoli comuni e sugli esempi di attività a cui facciamo riferimento nei contenuti di Google Cloud, consulta Ruoli e attività comuni per gli utenti di GKE Enterprise.
In Google Distributed Cloud, MetalLB viene eseguito in modalità di livello 2.
Esempio di configurazione di MetalLB
Ecco un esempio di configurazione per i cluster che eseguono il 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 distinte 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 disponibilità
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 tra cui il controller MetalLB può scegliere e assegnare ai servizi di tipo
LoadBalancer
. Il VIP in entrata si trova in questo pool.Il 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à dispiegato sui nodi in 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. È incluso 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 Go memberlist
per 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.
Attivare 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 cluster di amministrazione come descritto in Creare un cluster di amministrazione.
Specifica i pool di indirizzi
Il controller MetalLB gestisce gli indirizzi IP per i servizi. Pertanto, quando un sviluppatore di applicazioni crea un servizio di tipo LoadBalancer in un cluster di utenti, non deve specificare manualmente un indirizzo IP per il servizio. Il controller MetalLB sceglie invece un indirizzo IP da un pool di indirizzi specificato al momento della creazione del cluster.
Valuta quanti servizi di tipo LoadBalancer potrebbero essere attivi nel tuo cluster di utenti in un determinato momento. Poi, nella sezione loadBalancer.metalLB.addressPools
del file di configurazione del cluster utente, specifica indirizzi IP sufficienti per ospitare questi servizi.
Il VIP in entrata per il tuo cluster utente deve essere tra gli indirizzi che specifichi in un pool di indirizzi. Questo perché il proxy di ingresso viene esposto da un servizio di tipo LoadBalancer.
Se gli sviluppatori di applicazioni non hanno bisogno di creare servizi di tipo LoadBalancer, non devi specificare altri indirizzi oltre all'ingresso VIP.
Gli indirizzi devono essere in formato CIDR o intervallo. Se vuoi 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
Se devi modificare gli indirizzi in un pool dopo la creazione del cluster, puoi utilizzare gkectl update cluster
. Per ulteriori informazioni, consulta
Aggiornare MetalLB.
Attivare 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
sutrue
per almeno un pool di nodi nel cluster. Se impostato sutrue
, questo campo consente allo speaker MetalLB di funzionare sui nodi del pool.Se crei il cluster con
enableAdvancedCluster
impostato sutrue
, questo campo non ha alcun effetto perché lo speaker MetalLB viene eseguito sempre sui nodi del control plane del cluster utente.
Compila il resto del file di configurazione del cluster utente e crea il cluster utente come descritto in Creare un cluster utente.
Assegnazione manuale degli indirizzi di servizio
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
. Lo 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 con 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 con bug che eliminano per errore 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
Crea un servizio di tipo LoadBalancer
Ecco 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 file 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 provenga dal pool di indirizzi specificato nel file di configurazione del cluster utente. Ad esempio, 192.0.2.2 fa parte di 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
Aggiorna MetalLB
Dopo aver creato il cluster, puoi aggiornare i pool di indirizzi MetalLB e il campo enableLoadBalancer
nei pool di nodi. Apporta le modifiche necessarie nel
file di configurazione del cluster utente, quindi chiama gkectl update cluster
:
gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONIFG --config USER_CLUSTER_CONFIG
Pod e ConfigMap MetalLB
Il controller MetalLB viene eseguito come deployment e lo speaker MetalLB viene eseguito come
daemon sui nodi dei pool in cui enableLoadBalancer
è impostato su true
. Il controller MetalLB gestisce gli indirizzi IP assegnati ai servizi. Lo speaker MetalLB esegue l'elezione del leader e annuncia i VIP di servizio.
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 da MetalLB.
Non modificare direttamente il ConfigMap. Utilizza invece gkectl update cluster
come описано ранее. 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 gestisce gli 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 diversi servizi.
MetalLB rispetto a F5 BIG-IP e Seesaw
I VIP devono trovarsi nella stessa subnet dei nodi del cluster. Questo è anche un requisito per Seesaw, ma non per F5 BIG-IP.
Non sono presenti metriche per il traffico.
Non è previsto il failover senza hit; le connessioni esistenti vengono reimpostate durante il failover.
Il traffico esterno verso i pod di un determinato servizio passa attraverso un singolo node che esegue lo speaker MetalLB. Ciò significa che l'indirizzo IP del client solitamente non è visibile ai container in esecuzione nel pod.