MetalLB come loadBalancer

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.