Note that currently this addon does not work under Multipass on macOS, due to filtering that macOS applies to network traffic.
MetalLB Loadbalancer 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.
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
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
For load balancing in a MicroK8s cluster, MetalLB can make use of Ingress. Make sure you have enabled
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.
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