<p>I'm fiddling around with my RPI cluster that I've setup using <code>Kubeadm</code> and I want to make LoadBalancers able to work on the cluster.
The IPs for the nodes are static and set to the range of <code>192.168.1.100-192.168.1.103</code> for the master and worker nodes.</p>

<p>I've installed the Metallb using the offical site docs.</p>

<p>This is my configmap for Metallb:</p>

<pre><code>apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.2.240-192.168.2.250

</code></pre>

<p>From what I've understood you're supposed to give the loadbalancers a range outside of the DHCP range of the router? But even changing the addresses range to something like <code>192.168.1.200-192.168.1.240</code> doesn't change the results I'm getting.</p>

<p>The DHCP settings for my router.</p>

<p><a href="https://i.stack.imgur.com/mQCUg.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/mQCUg.png" alt="DHCP settings"></a></p>

<p><strong>K8s node info</strong> </p>

<pre><code>NAME            STATUS   ROLES    AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION   CONTAINER-RUNTIME
k8s-master      Ready    master   5d15h   v1.17.4   192.168.1.100   &lt;none&gt;        Raspbian GNU/Linux 10 (buster)   4.19.97-v7l+     docker://19.3.8
k8s-worker-01   Ready    worker   5d15h   v1.17.4   192.168.1.101   &lt;none&gt;        Raspbian GNU/Linux 10 (buster)   4.19.97-v7+      docker://19.3.8
k8s-worker-02   Ready    worker   4d14h   v1.17.4   192.168.1.102   &lt;none&gt;        Raspbian GNU/Linux 10 (buster)   4.19.97-v7+      docker://19.3.8
k8s-worker-03   Ready    worker   4d14h   v1.17.4   192.168.1.103   &lt;none&gt;        Raspbian GNU/Linux 10 (buster)   4.19.97-v7+      docker://19.3.8
</code></pre>

<p>Then I try to setup a small nginx deployment</p>

<pre><code>kubectl run nginx --image=nginx 
kubectl expose deploy nginx --port=80 --type=LoadBalancer
</code></pre>

<p>Running <code>kubectl get svc</code> returns:</p>

<pre><code>NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP      10.96.0.1        &lt;none&gt;        443/TCP          5d15h
nginx        LoadBalancer   10.96.53.50      &lt;pending&gt;     80:31253/TCP     4s
</code></pre>

<p>This is where I'm stuck now. I don't seem to be able to get a LoadBalancer to work with this setup and I'm not really sure where I'm going wrong.</p>

<p><strong>Metallb output</strong></p>

<pre><code>NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-65895b47d4-q25b8   1/1     Running   0          68m
pod/speaker-bnkpq                 1/1     Running   0          68m
pod/speaker-d56zg                 1/1     Running   0          68m
pod/speaker-h9vpr                 1/1     Running   0          68m
pod/speaker-qsl6f                 1/1     Running   0          68m

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
daemonset.apps/speaker   4         4         4       4            4           beta.kubernetes.io/os=linux   68m

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           68m

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-65895b47d4   1         1         1       68m
</code></pre>

<p>MetalLB layer2 mode doesn't receive broadcast packets unless promiscuous mode is enabled.</p>
<p>Try below</p>
<pre><code>sudo ifconfig wlan0 promisc
</code></pre>
<p>Add a Crontab to run each start up so you will not lose this change on restart.</p>
<pre><code>    1. sudo crontab -e
    2. Add this line at the end of the file 
         @reboot sudo ifconfig wlan0 promisc
</code></pre>
