1
0
Fork 0

keepalived: Initial commit

Running `keepalived` as a DaemonSet will allow managing floating
"virtual" IP addresses for Kubernetes services with configured external
IP addresses.  The main services we want to expose outside the cluster
are _ingress-nginx_, Mosquitto, and RabbitMQ.  The `keepalived` cluster
will negotiate using the VRRF protocol to determine which node should
have each external address.  Using the process tracking feature of
`keepalived`, we can steer traffic directly to the node where the target
service is running.
pull/37/head
Dustin 2024-11-22 22:26:48 -06:00
parent 5c78bb89b5
commit e7ea2b0659
4 changed files with 144 additions and 0 deletions

View File

@ -0,0 +1,60 @@
# vim: set sw=4 ts=4 sts=4 et:
includea /run/keepalived.interface
global_defs {
max_auto_priority 79
}
vrrp_track_process ingress-nginx {
process nginx-ingress-c
weight 90
}
vrrp_track_process mosquitto {
process mosquitto
weight 90
}
vrrp_track_process rabbitmq {
process rabbitmq-server
weight 90
}
vrrp_instance ingress-nginx {
state BACKUP
priority 100
interface ${INTERFACE}
virtual_router_id 51
virtual_ipaddress {
172.30.0.147/28
}
track_process {
ingress-nginx
}
}
vrrp_instance mosquitto {
state BACKUP
priority 100
interface ${INTERFACE}
virtual_router_id 52
virtual_ipaddress {
172.30.0.148/28
}
track_process {
mosquitto
}
}
vrrp_instance rabbitmq {
state BACKUP
priority 100
interface ${INTERFACE}
virtual_router_id 53
virtual_ipaddress {
172.30.0.149/28
}
track_process {
rabbitmq
}
}

View File

@ -0,0 +1,54 @@
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: keepalived
labels: &labels
app.kubernetes.io/name: keepalived
spec:
selector:
matchLabels: *labels
minReadySeconds: 10
template:
metadata:
labels: *labels
spec:
initContainers:
- name: init
image: docker.io/library/busybox
command:
- sh
- -c
- |
printf '$INTERFACE=%s\n' \
$(ip route | awk '/^default via/{print $5}') \
> /run/keepalived.interface
volumeMounts:
- mountPath: /run
name: tmp
subPath: run
containers:
- name: keepalived
image: git.pyrocufflink.net/containerimages/keepalived:dev
imagePullPolicy: Always
command:
- keepalived
- -nGlD
securityContext:
privileged: true
readOnlyRootFilesystem: true
volumeMounts:
- mountPath: /etc/keepalived
name: config
readOnly: true
- mountPath: /run
name: tmp
subPath: run
hostNetwork: true
hostPID: true
volumes:
- name: config
configMap:
name: keepalived
- name: tmp
emptyDir:
medium: Memory

View File

@ -0,0 +1,24 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- pairs:
app.kubernetes.io/component: keepalived
app.kubernetes.io/instance: keepalived
includeSelectors: true
includeTemplates: true
- pairs:
app.kubernetes.io/part-of: keepalived
namespace: keepalived
resources:
- keepalived.yaml
configMapGenerator:
- name: keepalived
files:
- keepalived.conf
options:
labels:
app.kubernetes.io/name: keepalived

View File

@ -0,0 +1,6 @@
apiVersion: v1
kind: Namespace
metadata:
name: keepalived
labels:
app.kubernetes.io/name: keepalived