Skip to content

Commit 35165d2

Browse files
+++
1 parent afc18f9 commit 35165d2

File tree

6 files changed

+267
-1
lines changed

6 files changed

+267
-1
lines changed

.github/workflows/docker-publish.yml

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
name: Docker
3+
4+
on:
5+
push:
6+
branches: master
7+
paths:
8+
- 'docker/**'
9+
10+
env:
11+
IMAGE_NAME: swarm-keepalived
12+
13+
defaults:
14+
run:
15+
working-directory: docker
16+
17+
jobs:
18+
test:
19+
runs-on: [ ubuntu-latest ]
20+
steps:
21+
- uses: actions/checkout@v3
22+
- name: Build Test
23+
run: docker build -f Dockerfile .
24+
25+
push:
26+
needs: [ test ]
27+
name: Publish to Docker Hub
28+
runs-on: [ ubuntu-latest ]
29+
steps:
30+
- uses: actions/checkout@v3
31+
- name: Build image
32+
run: |
33+
docker build -f Dockerfile -t ${{ secrets.DOCKERHUB_USER }}/${IMAGE_NAME}:${GITHUB_SHA::5} .
34+
docker tag ${{ secrets.DOCKERHUB_USER }}/${IMAGE_NAME}:${GITHUB_SHA::5} ${{ secrets.DOCKERHUB_USER }}/${IMAGE_NAME}:latest
35+
- name: Login to Docker Hub
36+
run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u ${{ secrets.DOCKERHUB_USER }} --password-stdin
37+
- name: Push Image to Docker Hub
38+
run: |
39+
docker push ${{ secrets.DOCKERHUB_USER }}/${IMAGE_NAME}:${GITHUB_SHA::5}
40+
docker push ${{ secrets.DOCKERHUB_USER }}/${IMAGE_NAME}:latest

README.md

+19-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,19 @@
1-
# swarm-keepalived
1+
# swarm keepalived
2+
3+
docker
4+
5+
`echo "modprobe ip_vs" >> /etc/modules`
6+
7+
```bash
8+
docker run -d --restart=always \
9+
--cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW \
10+
--net=host \
11+
-e KEEPALIVED_UNICAST_SRC_IP="172.16.5.4" \
12+
-e KEEPALIVED_UNICAST_PEER="172.16.5.5" \
13+
-e KEEPALIVED_VIRTUAL_IPADDRESS=192.168.100.254/32 \
14+
-e KEEPALIVED_PRIORITY=100 \
15+
-e KEEPALIVED_INTERFACE="eth0" \
16+
rootshellcoder/swarm-keepalived:latest
17+
```
18+
19+
[docker-swarm](./keepalived-service.yml)

docker/Dockerfile

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
FROM alpine:latest AS build
2+
3+
WORKDIR /tmp
4+
ADD https://keepalived.org/software/keepalived-2.2.8.tar.gz .
5+
6+
RUN set eux; \
7+
addgroup -S keepalived_script; \
8+
adduser -D -S -G keepalived_script keepalived_script;
9+
10+
RUN set eux; \
11+
apk add --update --no-cache \
12+
binutils \
13+
file \
14+
file-dev \
15+
gcc \
16+
glib \
17+
glib-dev \
18+
ipset \
19+
ipset-dev \
20+
iptables \
21+
iptables-dev \
22+
libmnl-dev \
23+
libnftnl-dev \
24+
libnl3 \
25+
libnl3-dev \
26+
make \
27+
musl-dev \
28+
net-snmp-dev \
29+
openssl \
30+
openssl-dev \
31+
pcre2 \
32+
pcre2-dev \
33+
autoconf \
34+
automake; \
35+
tar xvzf keepalived-2.2.8.tar.gz; \
36+
cd /tmp/keepalived-2.2.8/; \
37+
./autogen.sh; \
38+
./configure \
39+
--disable-dynamic-linking \
40+
--prefix=/usr \
41+
--exec-prefix=/usr \
42+
--bindir=/usr/bin \
43+
--sbindir=/usr/sbin \
44+
--sysconfdir=/etc \
45+
--datadir=/usr/share \
46+
--localstatedir=/var \
47+
--mandir=/usr/share/man \
48+
--with-dbus-data-dir=/usr/share \
49+
--enable-bfd \
50+
--enable-dbus \
51+
--enable-regex \
52+
--enable-snmp \
53+
--enable-snmp-rfc \
54+
--enable-nftables \
55+
--disable-iptables \
56+
--enable-json; \
57+
make; \
58+
make install; \
59+
strip /usr/sbin/keepalived; \
60+
cd -; \
61+
rm -rf /tmp/keepalived-2.2.8; \
62+
apk --no-cache del \
63+
binutils \
64+
file-dev \
65+
gcc \
66+
glib-dev \
67+
ipset-dev \
68+
iptables-dev \
69+
libmnl-dev \
70+
libnl3-dev \
71+
libnftnl-dev \
72+
make \
73+
musl-dev \
74+
openssl-dev \
75+
pcre2-dev \
76+
autoconf \
77+
automake
78+
79+
FROM alpine:latest
80+
WORKDIR /src/keepalived
81+
COPY keepalived.conf /etc/keepalived/
82+
COPY entrypoint /usr/bin/
83+
RUN set eux; \
84+
apk add --update --no-cache \
85+
sudo \
86+
bash \
87+
file \
88+
glib \
89+
ipset \
90+
iptables \
91+
libnl3 \
92+
net-snmp-dev \
93+
openssl \
94+
pcre2; \
95+
addgroup -S keepalived; \
96+
adduser -S keepalived -G keepalived -h /src/keepalived -s /bin/bash; \
97+
addgroup keepalived sudo; \
98+
chmod a+x /usr/bin/entrypoint; \
99+
sed -i '/# %sudo/c keepalived ALL=(ALL:ALL) NOPASSWD:/usr/sbin/keepalived' /etc/sudoers; \
100+
chown -R keepalived:keepalived /etc/keepalived/ /run;
101+
COPY --from=build /usr/sbin/ /usr/sbin/
102+
USER keepalived
103+
ENTRYPOINT ["entrypoint"]
104+
CMD ["sudo", "/usr/sbin/keepalived", "--dont-fork", "--log-console", "--use-file", "/etc/keepalived/keepalived.conf"]

docker/entrypoint

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/bin/bash
2+
3+
# Default variables
4+
KEEPALIVED_INTERFACE=${KEEPALIVED_INTERFACE:-eth0}
5+
KEEPALIVED_VIRTUAL_ROUTER_ID=${KEEPALIVED_VIRTUAL_ROUTER_ID:-51}
6+
KEEPALIVED_PRIORITY=${KEEPALIVED_PRIORITY:-100}
7+
KEEPALIVED_AUTH_PASS=${KEEPALIVED_AUTH_PASS:-ETlE2RQr}
8+
9+
# required variables
10+
# KEEPALIVED_UNICAST_SRC_IP
11+
# KEEPALIVED_UNICAST_PEER
12+
# KEEPALIVED_VIRTUAL_IPADDRESS
13+
# KEEPLAIVED_AUTH_PASS
14+
15+
KEEPALIVED_CONF=/etc/keepalived/keepalived.conf
16+
17+
sed -i "s!{{KEEPALIVED_INTERFACE}}!${KEEPALIVED_INTERFACE}!g" ${KEEPALIVED_CONF}
18+
sed -i "s!{{KEEPALIVED_VIRTUAL_ROUTER_ID}}!${KEEPALIVED_VIRTUAL_ROUTER_ID}!g" ${KEEPALIVED_CONF}
19+
sed -i "s!{{KEEPALIVED_PRIORITY}}!${KEEPALIVED_PRIORITY}!g" ${KEEPALIVED_CONF}
20+
sed -i "s!{{KEEPALIVED_UNICAST_SRC_IP}}!${KEEPALIVED_UNICAST_SRC_IP}!g" ${KEEPALIVED_CONF}
21+
22+
UNICAST_PEER=$(echo $KEEPALIVED_UNICAST_PEER | sed "s/\s//g" | sed "s/,/ /g")
23+
for up in ${UNICAST_PEER[@]}; do
24+
sed -i "s!{{KEEPALIVED_UNICAST_PEER}}!${up}\n {{KEEPALIVED_UNICAST_PEER}}!" ${KEEPALIVED_CONF}
25+
done
26+
sed -i "/{{KEEPALIVED_UNICAST_PEER}}/d" ${KEEPALIVED_CONF}
27+
28+
VIPs=$(echo $KEEPALIVED_VIRTUAL_IPADDRESS | sed "s/\s//g" | sed "s/,/ /g")
29+
for vip in ${VIPs[@]}; do
30+
sed -i "s!{{KEEPALIVED_VIRTUAL_IPADDRESS}}!${vip} dev ${KEEPALIVED_INTERFACE} label ${KEEPALIVED_INTERFACE}:0\n {{KEEPALIVED_VIRTUAL_IPADDRESS}}!" ${KEEPALIVED_CONF}
31+
done
32+
sed -i "/{{KEEPALIVED_VIRTUAL_IPADDRESS}}/d" ${KEEPALIVED_CONF}
33+
34+
sed -i "s!{{KEEPALIVED_AUTH_PASS}}!${KEEPALIVED_AUTH_PASS}!g" ${KEEPALIVED_CONF}
35+
36+
exec "$@"

docker/keepalived.conf

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
global_defs {
2+
default_interface {{KEEPALIVED_INTERFACE}}
3+
}
4+
vrrp_instance VI_1 {
5+
interface {{KEEPALIVED_INTERFACE}}
6+
state BACKUP
7+
virtual_router_id {{KEEPALIVED_VIRTUAL_ROUTER_ID}}
8+
priority {{KEEPALIVED_PRIORITY}}
9+
nopreempt
10+
unicast_src_ip {{KEEPALIVED_UNICAST_SRC_IP}}
11+
unicast_peer {
12+
{{KEEPALIVED_UNICAST_PEER}}
13+
}
14+
virtual_ipaddress {
15+
{{KEEPALIVED_VIRTUAL_IPADDRESS}} dev agge label agge:0
16+
}
17+
authentication {
18+
auth_type PASS
19+
auth_pass {{KEEPALIVED_AUTH_PASS}}
20+
}
21+
}

keepalived-service.yml

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
version: '3.9'
3+
4+
networks:
5+
outside:
6+
external:
7+
name: "host"
8+
9+
services:
10+
master:
11+
image: rootshellcoder/swarm-keepalived:latest
12+
environment:
13+
KEEPALIVED_UNICAST_SRC_IP: "172.16.5.4"
14+
KEEPALIVED_UNICAST_PEER: "172.16.5.5"
15+
KEEPALIVED_VIRTUAL_IPADDRESS: 192.168.100.254
16+
KEEPALIVED_PRIORITY: 200
17+
KEEPALIVED_INTERFACE: "eth0"
18+
networks:
19+
- outside
20+
cap_add:
21+
- NET_ADMIN
22+
- NET_BROADCAST
23+
- NET_RAW
24+
deploy:
25+
placement:
26+
constraints:
27+
- node.role == manager
28+
- node.labels.keepalived_master == true
29+
backup:
30+
image: rootshellcoder/swarm-keepalived:latest
31+
environment:
32+
KEEPALIVED_UNICAST_SRC_IP: "172.16.5.5"
33+
KEEPALIVED_UNICAST_PEER: "172.16.5.4"
34+
KEEPALIVED_VIRTUAL_IPADDRESS: 192.168.100.254
35+
KEEPALIVED_PRIORITY: 100
36+
KEEPALIVED_INTERFACE: "eth0"
37+
networks:
38+
- outside
39+
cap_add:
40+
- NET_ADMIN
41+
- NET_BROADCAST
42+
- NET_RAW
43+
deploy:
44+
placement:
45+
constraints:
46+
- node.role == manager
47+
- node.labels.keepalived_backup == true

0 commit comments

Comments
 (0)