<p>I created a k3s cluster and disabled the service loadbalancer &amp; traefik.  I installed metallb via a manifest file.  Also, I created a ConfigMap for Metallb below named &quot;config&quot; with an address pool so I don't know why the metallb-controller is saying &quot;no available ips&quot;.</p>
<pre><code>ubuntu@mark:~$ k describe svc nginx
Name:                     nginx
Namespace:                default
Labels:                   app=nginx
Annotations:              &lt;none&gt;
Selector:                 app=nginx
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.43.29.17
IPs:                      10.43.29.17
Port:                     &lt;unset&gt;  80/TCP
TargetPort:               80/TCP
NodePort:                 &lt;unset&gt;  30584/TCP
Endpoints:                10.42.4.4:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason            Age   From                Message
  ----     ------            ----  ----                -------
  Warning  AllocationFailed  34s   metallb-controller  Failed to allocate IP for &quot;default/nginx&quot;: no available IPs
</code></pre>
<pre><code>apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
      - name: default
    protocol: layer2
      addresses:
      - 192.168.136.206-192.168.136.209
</code></pre>

Mark Matlock
<p>You are using the ConfigMap while in the <a href="https://metallb.universe.tf/#backward-compatibility" rel="nofollow noreferrer">documentation</a> it says that in newer versions you should not use it:</p>
<blockquote>
<p>Previous versions of MetalLB are configurable via a configmap.
However, starting from the version v0.13.0, it will be possible to
configure it only via CRs. A tool to convert old configmaps to CRs is
provided as a container image under quay.io/metallb/configmaptocrs.</p>
</blockquote>
<p>I was doing the same thing, I had an old repo, where I used the ConfigMap, so I decided to reuse it, but than I read the documentation and followed the instructions from the MetalLB <a href="https://metallb.universe.tf/" rel="nofollow noreferrer">website</a>.</p>
<p>From <a href="https://metallb.universe.tf/installation/" rel="nofollow noreferrer">installation</a> I executed the following commands:</p>
<pre><code>kubectl edit configmap -n kube-system kube-proxy

# see what changes would be made, returns nonzero returncode if different
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e &quot;s/strictARP: false/strictARP: true/&quot; | \
kubectl diff -f - -n kube-system

# actually apply the changes, returns nonzero returncode on errors only
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e &quot;s/strictARP: false/strictARP: true/&quot; | \
kubectl apply -f - -n kube-system

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.9/config/manifests/metallb-native.yaml
</code></pre>
<p>, and then from the <a href="https://metallb.universe.tf/configuration/" rel="nofollow noreferrer">configuration</a> I choose the <a href="https://metallb.universe.tf/configuration/#layer-2-configuration" rel="nofollow noreferrer">Layer 2 Configuration</a> setup. Add the code bellow in a file.yaml:</p>
<pre><code>apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.240-192.168.1.250
</code></pre>
<p>, and then apply it using kubectl</p>
<pre><code>kubectl apply -f file.yaml
</code></pre>
<p>After that every thing works well. I hope this answer would be helpful for those who used the old approach, correct me if I have misunderstood.</p>
