Kubernetes MetalLB External IP not reachable

I can't access to Network IP assigned by MetalLB load Balancer

I created a Kubernetes cluster in k3s. Its 1 master and 1 workers. Each one has its own Private IP.

Master 192.168.0.13

Worker 192.168.0.13

I Installed k3s with INSTALL_K3S_EXEC=" --no-deploy servicelb --no-deploy traefik"

Now I am trying to deploy a app using MetalLB and nginx ingress

 --set configInline.address-pools[0].name=default \ --set configInline.address-pools[0].protocol=layer2 \ --set configInline.address-pools[0].addresses[0]=192.168.0.21-192.168.0.30 
helm install nginx-ingress stable/nginx-ingress --namespace kube-system \ --set controller.image.repository= --set controller.image.tag=0.30.0 \ --set controller.image.runAsUser=33 \ --set defaultBackend.enabled=false 

I Can see every pod up and running

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-d798c9dd-lsdnp 1/1 Running 5 37h 10.42.0.25 c271-k3s-ocrh <none> <none> local-path-provisioner-58fb86bdfd-bcpl7 1/1 Running 5 37h 10.42.0.22 c271-k3s-ocrh <none> <none> metrics-server-6d684c7b5-v9tmh 1/1 Running 5 37h 10.42.0.24 c271-k3s-ocrh <none> <none> metallb-speaker-4kbmw 1/1 Running 0 4m7s 192.168.0.14 c271-k3s-agent <none> <none> metallb-controller-75bf779d4f-nb47l 1/1 Running 0 4m7s 10.42.1.45 c271-k3s-agent <none> <none> metallb-speaker-776p9 1/1 Running 0 4m7s 192.168.0.13 c271-k3s-ocrh <none> <none> nginx-ingress-default-backend-5b967cf596-554bq 1/1 Running 0 98s 10.42.1.46 c271-k3s-agent <none> <none> nginx-ingress-controller-674675d5b6-blndp 1/1 Running 0 98s 10.42.1.47 c271-k3s-agent <none> <none> 

App getting IP 192.168.0.21

❯ kubectl get services -n kube-system -l app=nginx-ingress -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR nginx-ingress-default-backend ClusterIP 10.43.170.195 <none> 80/TCP 112s app=nginx-ingress,component=default-backend,release=nginx-ingress nginx-ingress-controller LoadBalancer 10.43.220.166 192.168.0.21 80:31735/TCP,443:31566/TCP 111s app=nginx-ingress,component=controller,release=nginx-ingress 

I Can access the app from master and worker by curl to nginx controller pod

HTTP/1.1 200 OK Server: nginx/1.17.8 Date: Sat, 21 Mar 2020 10:43:34 GMT Content-Type: text/html Content-Length: 153 Connection: keep-alive 

But the IP is not accessible from local 192.168.0.21

Diagnosis : DHCP is on, and 192.168.0.21-192.168.0.30 is absolutely free., When i try to allocate 192.168.0.21 to master or agent by netplan config they get the IP.

Please Guide me, What i am missing.

2

3 Answers

You need to make sure that the source IP address (external-ip assigned by metallb) is preserved. To achieve this, set the value of the externalTrafficPolicy field of the ingress-controller Service spec to Local. For example

apiVersion: v1 kind: Service metadata: name: my-app labels: webapp-0.1.0 webapp my-app "1.16.0" Helm spec: type: ClusterIP ports: - port: 80 targetPort: http protocol: TCP name: http selector: webapp my-app externalTrafficPolicy: Local 

The default value for externalTrafficPolicy field is 'Cluster'. So change it to Local

1

from two years I've been using metalLb in my home-lab, and I didn't get the error (although I got other errors for example ., MetalLB fails to assign an IP address from the pool)

I want to share my current setup with folks who are still struggling on the internet.

helm install --create-namespace metallb metallb/metallb -n metallb-system -f values.yaml

configInline: address-pools: - name: default protocol: layer2 addresses: - 192.168.0.21/30 # can use series like 192.168.0.21-24 too. 

Debugging - try to get logs from all the pod in namespace metallb.

kail -n metallb

K8S installed with calico using

Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.1", GitCommit:"3ddd0f45aa91e2f30c70734b175631bec5b5825a", GitTreeState:"clean", BuildDate:"2022-05-24T12:17:11Z", GoVersion:"go1.18.2", Compiler:"gc", Platform:"darwin/amd64"} Kustomize Version: v4.5.4 Server Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.3", GitCommit:"aef86a93758dc3cb2c658dd9657ab4ad4afc21cb", GitTreeState:"clean", BuildDate:"2022-07-13T14:23:26Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"} 

Maybe switching externalTrafficPolicy to local/cluster may help however, I didn't try. my setup works out of the box.

Good Luck.

1

In my setup with Cilium and HAProxy ingress controller I'd to change externalTrafficPolicy from Local to Cluster

kubectl --namespace ingress-controller patch svc haproxy-ingress \ -p '{"spec":{"externalTrafficPolicy":"Cluster"}}' 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like