In my last posting i wrote, how to configure and use metallb on a microk8s kubernetes cluster. This worked fine - but on the next day i was only able to reach the loadbalancer ip from clients outside the kubernetes cluster.
So what happened?
Just two things in advance:
- metallb does not create interfaces on the node
That means, the loadbalancer ip does not use the OS to announce the ip inside the network
- metallb has to use its own arp mechanism
If a client (on the same network as the kubernetes cluster) can not reach the loadbalancer ip, you have to check the arp table.
On all kubernetes nodes (except the master) you will find the loadbalancer:
Address HWtype HWaddress Flags Mask Iface
192.168.178.230 ether dc:a6:32:65:c4:ee C eth0
On the metallb controller you will find nothing:
(The controller can be found with this command:
and on this node:kubectl get all -o wide -n metallb-system
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/speaker-hgf7l 1/1 Running 1 21h 192.168.178.53 ubuntu <none> <none>
pod/controller-559b68bfd8-tgmv7 1/1 Running 1 21h 10.1.243.224 ubuntu <none> <none>
pod/speaker-d9d7z 1/1 Running 1 21h 192.168.178.57 zigbee <none> <none>
192.168.178.230 (192.168.178.230) -- no entry
On the client you are using, you get the same result: no arp entry for this ip.
Option 1: the quick fix
run arp -s 192.168.178.230 dc:a6:32:65:c4:ee on your client and after that you can reach 192.168.178.230, because your client knows, which NIC (MAC) it has to reach.
Option 2: switch the interface on the controller to promiscuous mode.
without running the interface in promicuous, metallb can not announce the ip via arp. So run ifconfig wlan0 promisc. (https://github.com/metallb/metallb/issues/284)