[Updated] How to install MetalLB in your Self hosted K8s cluster.

[Updated] How to install MetalLB in your Self hosted K8s cluster.

What is MetalLB?

MetalLB is a load-balancer that can be implemented in your self-hosted(bare metal) Kubernetes cluster two support service type Loadbalancer.

Kubernetes does not offer an implementation of network load balancers (Services of type LoadBalancer) for bare-metal clusters. The implementations of network load balancers that Kubernetes does ship with are all glue code that calls out to various IaaS platforms (GCP, AWS, Azure…). If you’re not running on a supported IaaS platform (GCP, AWS, Azure…), LoadBalancers will remain in the “pending” state indefinitely when created. Credit: Metallb documentation


  • Working Kubernetes cluster

  • Cluster Network configuration that will be compatible with Metallb (Calico, Flannel, etc)

  • IPv4 addresses to assign in pools.


MetalLB connects with our Kubernetes cluster and provides a Network load-balancer implementation, that allows us to create service type LoadBalancer. That is not possible in bare metal clusters without using MetalLB.

It has two features that work together to provide this service: address allocation, and external announcement.

Address Allocation:

When you use Kubernetes on a cloud service and ask for a load balancer, the cloud service gives you an IP address. But if you're using your own hardware (called a "bare-metal cluster"), MetalLB gives you that IP address.

MetalLB can't just make up IP addresses. You have to give it a list of IPs it can use. MetalLB will then choose from this list to give out IPs as needed. But it only uses the IPs you've given it.

External Announcement:

Once MetalLB gives an External IP to a service, it has to let the wider network know that this IP address is being used inside the cluster. To do this MetalLB uses common network methods. Depending on the chosen setting, it can use ARP, NDP and BGP.


You can install MetalLB in your cluster using the following command -

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml

This will deploy the MetalLB in your cluster under metallb-system namespace. After installation, you will able to see two types of resources -

  1. MetalLB controller

  2. MetalLB speaker

These resources will be created along with their service accounts and RBAC permissions.

Now installation is done let's create the IP address pool using the following manifest-

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
  name: first-pool
  namespace: metallb-system

Apply the above manifest using the following command-

kubectl apply -f ippool.yaml -n metallb-system

Now create a dummy service with the type of LoadBalancer and see if external IP is getting assigned.

apiVersion: v1
kind: Service
  name: my-app-service
    app: my-app
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

apply the above manifest and check if the External IP is assigned -

kuberctl get service my-app-service

Output -

NAME            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
my-app-service  LoadBalancer   80:32000/TCP   3s

If External-IP status is pending then please recheck your Metallb pods if they running properly or not.

By default, it uses Layer2 mode for communication, but in case it is not communicating with your service, please consider applying the following manifest-

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
  name: l2-firstpool
  namespace: metallb-system
  - first-pool

Your basic MetalLB installation and configuration done. Now you can create a network load-balancer in your cluster.

Soon I will be uploading a few more advanced article about MetalLB and cluster networking. Till then if you have any questions feel free to drop a comment or send me directly over my discord server.


Did you find this article valuable?

Support Abhishek Singh by becoming a sponsor. Any amount is appreciated!