MetalLB hooks into your Kubernetes cluster, and provides a network load-balancer implementation. In short, it allows you to create Kubernetes services of typeLoadBalancerin clusters that don’t run on a cloud provider, and thus cannot simply hook into paid products to provide load balancers.

Installation

There are multiple ways to install MetalLB, for example

Through manifest

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

or Helm

helm repo add metallb https://metallb.github.io/metallbhelm install metallb metallb/metallb

The related service, deployment, and pods are in the newly created namespace ‘metallb-system’

‘IPAddressPool’ defines the IP address range that will be allocated to ‘LoadBalancer’ type service. The pool of IPs must be dedicated to MetalLB’s use. You can’t reuse for example the Kubernetes node IPs or IPs controlled by other services.

MetalLB supports two types of traffic policies, Layer2 and BGP.In summary,Layer 2focuses on local network communication, whileBGPhandles routing between different networks and plays a critical role in global Internet connectivity.

apiVersion: metallb.io/v1beta1kind: IPAddressPoolmetadata:  name: first-pool  namespace: metallb-systemspec:  addresses:  - 192.168.9.10-192.168.9.20---apiVersion: metallb.io/v1beta1kind: L2Advertisementmetadata:  name: example  namespace: metallb-systemspec:  ipAddressPools:  - first-pool

Example

apiVersion: v1kind: Podmetadata: name: nginx labels: app: nginxspec: containers: – name: nginx image: nginx:1.18.0—apiVersion: v1kind: Servicemetadata: name: nginxspec: type: LoadBalancer ports: – port: 80 targetPort: 80 selector: app: nginx

Service ‘nginx’ will be allocated with an external-ip in192.168.9.10-192.168.9.20 defined inIPAddressPool first-pool above, check the assigned external-ip with the command below

kubectl get service/nginx

MetalLB supportsmetallb.universe.tf/loadBalancerIPsannotation to set up service with a specific address.

apiVersion: v1kind: Servicemetadata:  name: nginx  annotations:    metallb.universe.tf/loadBalancerIPs: 192.168.9.35spec:  type: LoadBalancer  ports:    - port: 80      targetPort: 80  selector:    app: nginx

MetalLB also supports requesting a specific address pool, when you have multiple pools, for example, one for production public IPs, and one for development private IPs.

apiVersion: v1kind: Servicemetadata:  name: nginx  annotations:    metallb.universe.tf/address-pool: second-poolspec:  type: LoadBalancer  ports:    - port: 80      targetPort: 80  selector:    app: nginx