kube-router/docs/load-balancer-allocator.md
2023-10-19 18:22:35 -05:00

87 lines
2.5 KiB
Markdown

# 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:
```yaml
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.
```yaml
---
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.