---
title: 'Addon: MetalLB'
description: Canonical makes open source secure, reliable and easy to use, providing
  support for Ubuntu and a portfolio of enterprise-grade technologies. Founded in
  2004, Canonical operates globally with team members in over 80 countries.
url: https://canonical.com/microk8s/docs/addon-metallb?format=md
---

*Submit*

# Addon: MetalLB

**Compatibility**:
**Source**: [MetalLB](https://metallb.universe.tf/)

Note that currently this addon does not work under Multipass on macOS, due to filtering that macOS applies to network traffic.

[MetalLB Loadbalancer](https://metallb.universe.tf/) is a network LB implementation that tries to “just work” on bare metal clusters.

When you enable this add on you will be asked for an IP address pool that MetalLB will hand out IPs from:

```
microk8s enable metallb
```

Alternatively you can provide the IP address pool in the enable command:

```
microk8s enable metallb:10.64.140.43-10.64.140.49
```

Multiple comma-separated ranges as well as CIDR notation metallb:10.64.140.43-10.64.140.49,10.64.141.53-10.64.141.59,10.12.13.0/24`) are supported from 1.19.

## [Configure IPAddressPool resources (from 1.25+)](https://canonical.com/microk8s/docs/addon-metallb?format=md#p-20882-configure-ipaddresspool-resources-from-125)

It is possible to configure IP address pools that MetalLB will use to allocate IP addresses using custom resources.

For example, create the following custom address pool:

```
# addresspool.yaml
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: custom-addresspool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.1-192.168.1.100
```

And apply it with:

```
microk8s kubectl apply -f addresspool.yaml
```

You can then configure which address pool MetalLB will use for each LoadBalancer service by setting the `metallb.universe.tf/address-pool` annotation:

```
apiVersion: v1
kind: Service
metadata:
  name: test-service
  annotations:
    metallb.universe.tf/address-pool: custom-addresspool
spec:
  selector:
    name: nginx
  type: LoadBalancer
  # loadBalancerIP is optional. MetalLB will automatically allocate an IP
  # from its pool if not specified. You can also specify one manually.
  # loadBalancerIP: x.y.z.a
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
```

## [Setting up a MetalLB/Ingress service](https://canonical.com/microk8s/docs/addon-metallb?format=md#p-20882-setting-up-a-metallbingress-service)

For load balancing in a MicroK8s cluster, MetalLB can make use of Ingress. Make sure you have enabled `ingress`, with `microk8s enable ingress` and create a suitable ingress service, for example:

```
apiVersion: v1
kind: Service
metadata:
  name: ingress
  namespace: ingress
spec:
  selector:
    name: nginx-ingress-microk8s
  type: LoadBalancer
  # loadBalancerIP is optional. MetalLB will automatically allocate an IP
  # from its pool if not specified. You can also specify one manually.
  # loadBalancerIP: x.y.z.a
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
    - name: https
      protocol: TCP
      port: 443
      targetPort: 443
```

You can save this file as `ingress-service.yaml` and then apply it with:

```
microk8s kubectl apply -f ingress-service.yaml
```

Now there is a load-balancer which listens on an arbitrary IP and directs traffic towards one of the listening ingress controllers.

## [Advertise LoadBalancer IPs](https://canonical.com/microk8s/docs/addon-metallb?format=md#p-20882-advertise-loadbalancer-ips)

By default, MicroK8s advertises all LoadBalancer IPs by responding to ARP requests on the local network. For more complex setups, like limiting the address pools for which ARP responses are sent, or for more complex BGP configurations, refer to the [MetalLB documentation](https://metallb.org/configuration/#announce-the-service-ips)

Last updated 3 years ago. [Help improve this document in the forum](https://discuss.kubernetes.io/t/addon-metallb/11790).
