Kubertnetes with metallb - Loadbalancer service in pending state

I have followed the steps of installation from metallb website.

And the metallb containers are also running.

After that I deployed an nginx service for testing with service as LoadBalancer. The LoadBalancer is not getting IP from metallb.

Any suggestions on how to fix this?


Solution 1:

Since I'm not able to write comments, will add all details and path here.

I used following page for setting up a Metal loadbalancer.

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.6/manifests/namespace.yaml
kubectl apply -f
https://raw.githubusercontent.com/metallb/metallb/v0.9.6/manifests/metallb.yaml
# On first install only
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

You can verify an installation by running:

kubectl get all -n metallb-system

NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-64f86798cc-cfb5t   1/1     Running   0          8m35s
pod/speaker-8vwhc                 1/1     Running   0          8m35s
pod/speaker-zs8zk                 1/1     Running   0          8m35s

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   2         2         2       2            2           kubernetes.io/os=linux   8m35s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           8m35s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-64f86798cc   1         1         1       8m35s

Documentation says:

The installation manifest does not include a configuration file. MetalLB’s components will still start, but will remain idle until you define and deploy a configmap

So we go to the page related to setting up the configmap, I used a simple layer 2 configuration and created a metallb-configmap.yaml file:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.240-192.168.1.250

Once you've done it, you'll need to apply this configmap:

kubectl apply -f metallb-configmap.yaml

Then simple example with nginx deployment:

kubectl create deploy nginx --image=nginx --replicas=1

And service:

kubectl expose deploy nginx --port=80 --type=LoadBalancer

And check if received an external IP address:

kubectl get svc

NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
nginx                                LoadBalancer   10.101.83.208   192.168.1.241   80:31836/TCP                 8m44s

Check this works:

curl -L 192.168.1.241

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

Let me know if you have different results.