Le Loadbalancer MetalLB doit permettre d'exposer l'adresse IP 192.168.50.250. Cette adresse sera partagée entre les noeuds du cluster et servira à exposer les services.
En cas d'arrêt du noeud portant l'adresse, cette dernière basculera automatiquement sur un des autres noeuds du cluster.
root@kube-01:/opt/k3s_services/test-metalLb# mkdir -p /etc/rancher/k3s
root@kube-01:/opt/k3s_services/test-metalLb# vim /etc/rancher/k3s/config.yaml
disable:
- servicelb
root@kube-01:/opt/k3s_services/test-metalLb# systemctl restart k3s
root@kube-01:/opt# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml
root@kube-01:/opt# kubectl get ns metallb-system
NAME STATUS AGE
metallb-system Active 25s
root@kube-01:/opt# kubectl -n metallb-system get pods
NAME READY STATUS RESTARTS AGE
controller-859c589d76-vnn9c 1/1 Running 0 67s
speaker-8q24k 1/1 Running 0 67s
speaker-k2b8b 1/1 Running 0 67s
speaker-tvvsm 1/1 Running 0 67s
root@kube-01:/opt# mkdir /opt/k3s_services/metallb
root@kube-01:/opt# cd /opt/k3s_services/metallb/
root@kube-01:/opt/k3s_services/metallb# vim metallb-ip-pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: pool-labk3s
namespace: metallb-system
spec:
addresses:
- 192.168.50.250-192.168.50.250
root@kube-01:/opt/k3s_services/metallb# kubectl apply -f metallb-ip-pool.yaml
Mode Layer 2 :root@kube-01:/opt/k3s_services/metallb# vim metallb-l2.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2-labk3s
namespace: metallb-system
spec:
ipAddressPools:
- pool-labk3s
root@kube-01:/opt/k3s_services/metallb# kubectl apply -f metallb-l2.yaml
root@kube-01:/opt/k3s_services/metallb# kubectl -n metallb-system get ipaddresspools
NAME AUTO ASSIGN AVOID BUGGY IPS ADDRESSES
pool-labk3s true false ["192.168.50.230-192.168.50.250"]
root@kube-01:/opt/k3s_services/metallb# kubectl -n metallb-system get l2advertisements
NAME IPADDRESSPOOLS IPADDRESSPOOL SELECTORS INTERFACES
l2-labk3s ["pool-labk3s"]
root@kube-01:/opt/k3s_services/metallb# kubectl -n metallb-system get pods
NAME READY STATUS RESTARTS AGE
controller-859c589d76-vnn9c 1/1 Running 0 9m3s
speaker-8q24k 1/1 Running 0 9m3s
speaker-k2b8b 1/1 Running 0 9m3s
speaker-tvvsm 1/1 Running 0 9m3s
root@kube-01:/opt/k3s_services/metallb# mkdir /opt/k3s_services/test-metalLb
root@kube-01:/opt/k3s_services/metallb# cd /opt/k3s_services/test-metalLb/
root@kube-01:/opt/k3s_services/test-metalLb# vim test-lb.yaml
apiVersion: v1
kind: Service
metadata:
name: test-lb
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- port: 80
targetPort: 80
root@kube-01:/opt/k3s_services/test-metalLb# kubectl create deployment nginx --image=nginx
root@kube-01:/opt/k3s_services/test-metalLb# kubectl apply -f test-lb.yaml
root@kube-01:/opt/k3s_services/test-metalLb# kubectl get svc test-lb
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
test-lb LoadBalancer 10.43.99.42 192.168.50.230 80:30692/TCP 7s
L'adresse IP 192.168.50.230 a été attribuée à notre service.
Si on ouvre un navigateur, on arrive sur la page d'accueil de NGINX :

root@kube-01:/opt/k3s_services/test-metalLb# kubectl describe svc test-lb
Name: test-lb
Namespace: default
Labels: <none>
Annotations: metallb.universe.tf/ip-allocated-from-pool: pool-labk3s
Selector: app=nginx
Type: LoadBalancer
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.43.99.42
IPs: 10.43.99.42
LoadBalancer Ingress: 192.168.50.230 (VIP)
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30692/TCP
Endpoints: 10.42.3.13:80
Session Affinity: None
External Traffic Policy: Cluster
Internal Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal IPAllocated 3m30s (x2 over 3m30s) metallb-controller Assigned IP ["192.168.50.230"]
Normal EnsuringLoadBalancer 3m30s (x2 over 3m30s) service-controller Ensuring load balancer
Normal nodeAssigned 3m30s metallb-speaker announcing from node "kube-03" with protocol "layer2"
Normal AppliedDaemonSet 3m30s (x2 over 3m30s) service-lb-controller Applied LoadBalancer DaemonSet kube-system/svclb-test-lb-d6369e4e