MetalLB viene utilizzato nei cluster Kubernetes bare metal (on premise) per poter esporre i servizi in modalità LoadBalancer.
La modalità LoadBalancer viene utilizzata dai provider clouds (Azure, AWS, Tanzu…) per permettere agli utenti di esporre i servizi su degli IP pubblici raggiungibili da internet.
Su un cluster bare metal senza Matallb i servizi esposti con questa modalità rimangono in stato pending e non è possibile procedere.
MetalLB è in grado di allocare gli IP VIP da un set di IP dedicato e pubblicare dei servizi dietro di essi, gestendo autonomamente il bilanciamento di carico sui vari Pods che erogano il servizio.
PREREQUISITI
Un cluster Kubernetes con Calico CNI e kubectl installato.
Si consiglia la visione dell’articolo precedente relativo a Kubernetes (Installazione e configurazione di base di un cluster Kubernetes con Calico CNI su Debian 12).
CONFIGURAZIONE DI CALICO
Aggiungere nella configurazione di Calico relativa al BGP (nella scorsa guida bgp.yaml) le reti che verranno utilizzate dai servizi di tipo LoadBalancer:
0
1
2
3
4
5
6
7
8
9
10
11
12
|
---
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Info
nodeToNodeMeshEnabled: true
asNumber: 65000
listenPort: 178
bindMode: NodeIP
serviceLoadBalancerIPs:
- cidr: 10.170.80.0/21
|
Per aggiungere una rete, inserirla nell’array serviceLoadBalancerIPs, come è stato fatto per la subnet 10.170.80.0/21.
Le reti indicate devono essere esclusive per MetalLB, non utilizzare subnets del Pod Network o del Service Network indicati durante la creazione del cluster K8s.
Applicare la configurazione (sostituire bgp.yaml con il nome del file con la configurazione):
0 |
kubectl apply -f bgp.yaml
|
CONFIGURAZIONE DELLA MODALITÁ STRICT ARP
Modificare il parametro stricARP da false a true nella config map di kuke-proxy:
0 |
kubectl edit configmap -n kube-system kube-proxy
|
0
1
2
3
4
|
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
|
INSTALL HELM
Helm
è un package manager per Kubernetes che può essere utilizzato per installare diversi applicativi, tra cui MetalLB.
Aggiungere le repositories di Helm per Debian:
0
1
2
3
|
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | tee /usr/share/keyrings/helm.gpg > /dev/null
apt install apt-transport-https -y
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | tee /etc/apt/sources.list.d/helm-stable-debian.list
apt update
|
Installare Helm:
0 |
apt install helm -y
|
INSTALLARE METALLB TRAMITE HELM
Aggiungere le repositories Helm di MetalLB:
0 |
helm repo add metallb https://metallb.github.io/metallb
|
Copiare la configurazione di default in un file:
0 |
helm show values metallb/metallb > values.yaml
|
Disabilitare il deamon set speaker nel file appena creato (values.yaml):
0
1
|
speaker:
enabled: false
|
Non è necessario l’utilizzo degli speaker poiché Calico si occupa di diffondere le rotte tramite BGP.
Creare il namespace per MetalLB ed opzionalmente assegnargli la rete desiderata (modificare default-ipv4-ippool con il nome della rete):
0
1
|
kubectl create namespace metallb-system
kubectl annotate namespace metallb-system "cni.projectcalico.org/ipv4pools"='["default-ipv4-ippool"]'
|
Installare MetalLB:
0 |
helm install metallb metallb/metallb -f values.yaml --namespace metallb-system
|
CONFIGURARE IP ADDRESS POOL
Creare il file lbnet.yaml:
0
1
2
3
4
5
6
7
|
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: lbnet
namespace: metallb-system
spec:
addresses:
- 10.170.80.0/21
|
Nell’array addresses indicare le stesse reti configurate nell’array serviceLoadBalancerIPs nel file di configurzione di Calico per il BGP.
È possibile specificare gli indirizzi da utilizzare in diversi formati, in seguito alcuni esempi:
0
1
2
3
4
|
spec:
addresses:
- 192.168.10.0/24
- 192.168.9.1-192.168.9.5
- fc00:f853:0ccd:e799::/124
|
Applicare la configurazione:
0 |
kubectl apply -f lbnet.yaml
|
VERIFICARE LA CONFIGURAZIONE
Esporre il deployment nginx-test creato durante la procedura dell’articolo precedente:
0 |
kubectl expose deployment nginx-test --type=LoadBalancer --name=nginx-test-srv --port 80
|
Verificare che IP sia stato assegnato al servizio:
0 |
kubectl get service nginx-test-srv
|
Provare a navigare tramite il browser sull’IP assegnato e verificare che sia possibile connettersi.
0 commenti