La pagina ufficiale dell'installazione: https://metallb.universe.tf/installation/
Ho eseguito l'operazione preliminare “If you’re using kube-proxy in IPVS mode, since Kubernetes v1.14.2 you have to enable strict ARP mode.”
Edito la configMap di kube-proxy:
ubuntu@kubectl:~$ kubectl edit configmap -n kube-system kube-proxy apiVersion: v1 data: config.conf: |- apiVersion: kubeproxy.config.k8s.io/v1alpha1 ... ... #mode: "iptables" mode: "ipvs" ipvs: strictARP: true kind: KubeProxyConfiguration
A questo punto è tutto abbastanza semplice, usando il deploy tramite manifest
:
https://metallb.universe.tf/installation/#installation-by-manifest
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
Adesso che è installato nel suo namespace:
ubuntu@kubectl:~$ kubectl get all -n metallb-system NAME READY STATUS RESTARTS AGE pod/controller-8694df9d9b-8b9zc 1/1 Running 0 145m pod/speaker-9wxnp 1/1 Running 0 145m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/metallb-webhook-service ClusterIP 10.105.26.211 <none> 443/TCP 145m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/speaker 1 1 1 1 1 kubernetes.io/os=linux 145m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/controller 1/1 1 1 145m NAME DESIRED CURRENT READY AGE replicaset.apps/controller-8694df9d9b 1 1 1 145m
creiamo un pool di IP (in questo caso 2, per test)
ubuntu@kubectl:~$ cat metalLB/metallb-pool.yaml apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: public-pool namespace: metallb-system spec: addresses: - 185.91.188.40-185.91.188.41
Ci sono due modi di utilizzo di questo Load Balancer: Layer 2 e BGP. Il Layer 2 funziona con il protocollo arp
ed è di gestione più semplice.
ubuntu@kubectl:~$ cat metalLB/metallb-L2.yaml apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: ingress namespace: metallb-system spec: ipAddressPools: - public-pool
a questo punto è immediato un test:
ubuntu@kubectl:~$ kubectl create deploy nginx1 --image nginx:latest ubuntu@kubectl:~$ kubectl expose deploy nginx1 --port 80 --type LoadBalancer ubuntu@kubectl:~$ kubectl create deploy nginx2 --image nginx:latest ubuntu@kubectl:~$ kubectl expose deploy nginx2 --port 80 --type LoadBalancer ubuntu@kubectl:~$ kubectl get all NAME READY STATUS RESTARTS AGE pod/nginx1-c95765fd4-wxkds 1/1 Running 0 1m pod/nginx2-774db4988c-m2vh5 1/1 Running 0 1m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/nginx1 LoadBalancer 10.109.150.219 185.91.188.40 80:31721/TCP 3m ^^^^^^^^^^^^ ^^^^^^^^^^^^^ service/nginx2 LoadBalancer 10.109.150.219 185.91.188.41 80:31721/TCP 3m
ATTENZIONE: Il ping non risponde perché metalLB non gestisce le risposte ICMP.