Skip to content

Load Balancer allocator

What does it do

The load balancer allocator controller looks for services with the type LoadBalancer and tries to allocate addresses for it if needed. The controller doesn't enable any announcement of the addresses by default, so --advertise-loadbalancer-ip should be set to true and BGP peers configured.

Load balancer classes

By default the controller allocates addresses for all LoadBalancer services with the where loadBalancerClass is empty or set to one of "default" or "kube-router". If --loadbalancer-default-class is set to false, the controller will only handle services with the class set to "kube-router".

RBAC permissions

The controller needs some extra permissions to get, create and update leases for leader election and to update services with allocated addresses.

Example permissions:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kube-router
  namespace: kube-system
rules:
  - apiGroups:
      - "coordination.k8s.io"
    resources:
      - leases
    verbs:
      - get
      - create
      - update
  - apiGroups:
      - ""
    resources:
      - services/status
    verbs:
      - update

Environment variables

The controller uses the environment variable POD_NAME as the identify for the lease used for leader election. Using the kubernetes downward api to set POD_NAME to the pod name the lease identify will match the current leader.

---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    k8s-app: kube-router
    tier: node
  name: kube-router
  namespace: kube-system
spec:
  ...
  template:
    metadata:
      ....
    spec:
        ...
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
...

The environment variable POD_NAMESPACE can also be specified to set the namespace used for the lease. By default the namespace is looked up from within the pod using /var/run/secrets/kubernetes.io/serviceaccount/namespace.

Running outside kubernetes

When running the controller outside a pod, both POD_NAME and POD_NAMESPACE must set for the controller to work. POD_NAME should be unique per instance, so using for example the hostname of the machine might be a good idea. POD_NAMESPACE must be the same across all instances running in the same cluster.

Notes

It's not possible to specify the addresses for the load balancer services. A externalIP service can be used instead.