Ich wollte mir schon länger einen Raspberry Pi Cluster aufsetzen. Dazu gibt es natürlich mehrere Möglichkeiten, da ich aber sehr mit Docker bzw. Docker-Compose vertraut bin nutze ich für dieses Projekt Docker Swarm. Dazu beginnen ich mit zwei Raspberry Pi´s, beide werden mit Raspberry Pi OS light bestückt und auf beiden Docker & Docker Compose installiert. Mein “Cluster Manager” hört auf den Namen cluster-manager1 und mein “Cluster Worker” cluster-worker1.
Um dann den Docker Swarm zu aktivieren bzw. den Manager dieses Clusters festzulegen gebt Ihr folgenden Befehl ein:
docker swarm init --advertise-addr <MANAGER-IP>
#IP Adresse des Managers einsetzen
In meinem Fall:
docker swarm init --advertise-addr 192.168.2.38
Dann werden euch diese Infos ausgegeben:
Diese docker swarm join \ –token……… Zeile solltet Ihr euch aufschreiben/kopieren, um diese dann in eure Cluster Worker einzusetzten, um so dem Swarm beizutreten.
Als nächstes geben wir dann diese Zeile “docker swarm join \ –toke SWMTKN…“ von der obrigen Ausgabe im Terminal des z.b. cluster-worker1 ein. Dann bekommt Ihr die Info “This node joined a swarm as a worker“. Somit habt Ihr schon einen kleinen Swarm 😉
Mit diesem Befehl könnt Ihr die Nodes überprüfen:
sudo docker node ls
Als nächstes werden wir eine übersichtliche WebUI installieren bzw. deployen.
Dazu erstellt Ihr wie auch bei anderen Docker Projekten einen Verzeichnis in dem der Container bzw. die .yml Datei liegt alles auf dem “Cluster Worker”, mein Pfad -> /home/pi/docker-compose/
sudo mkdir /home/pi/docker-compose
In diesem Verzeichnis erstellt Ihr nocheinmal ein Verzeichnis mit dem Namen swarmpit in das Ihr dann diese docker-compose.yml Datei einfügt/erstellt. Der komplette Pfad sieht dann bei mir so aus -> /home/pi/docker-compose/swarmpit/docker-compose.yml
sudo mkdir /home/pi/docker-compose/swarmpit
sudo nano /home/pi/docker-compose/swarmpit/docker-compose.yml
version: '3.3'
services:
app:
image: swarmpit/swarmpit:latest
environment:
- SWARMPIT_DB=http://db:5984
- SWARMPIT_INFLUXDB=http://influxdb:8086
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 888:8080 #WebUI Port 888
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 60s
timeout: 10s
retries: 3
networks:
- net
deploy:
resources:
limits:
memory: 1024M
reservations:
memory: 512M
placement:
constraints:
- node.role == manager #wird nur im cluster-manager1 deployed
db:
image: treehouses/couchdb:2.3.1
volumes:
- db-data:/opt/couchdb/data
networks:
- net
deploy:
resources:
limits:
memory: 256M
reservations:
memory: 128M
influxdb:
image: influxdb:1.7
volumes:
- influx-data:/var/lib/influxdb
networks:
- net
deploy:
resources:
limits:
memory: 256M
reservations:
memory: 128M
agent:
image: swarmpit/agent:latest
environment:
- DOCKER_API_VERSION=1.35
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- net
deploy:
mode: global #wird bei allen Raspberry Pi´s bzw. Nodes deployed
labels:
swarmpit.agent: 'true'
resources:
limits:
memory: 64M
reservations:
memory: 32M
networks:
net:
driver: overlay
volumes:
db-data:
driver: local
influx-data:
driver: local
Anders wie bei Docker-Compose erstellt/startet Ihr einen Container mit diesem Befehl:
sudo docker stack deploy -c /home/pi/docker-compose/swarmpit/docker-compose.yml swarmpit
Mit diesem Befehl könnt Ihr überprüfen ob der Service gestartet wurde bzw. läuft.
sudo docker service ls
Mit diesem Swarmpit Container bekommt Ihr eine übersichtliche WebUI mit der Ihr einene Überblick über die bestehenden Nodes bekommt und weitere Funktionen bekommt.
Diese WebUI könnt Ihr dann mit http://IPAdressedesClusterManagers:888 aufrufen.
Nun da wir den Swarm aufgesetzt haben, im Moment bestehend aus einem Manager, einem Worker und der Swarmpit WebUI will ich noch einen weiteren Container starten und zwar PiHole.
Dazu lege ich wieder ein Verzeichnis an /home/pi/docker-compose/Pi-hole und lege dort diese docker-compose.yml Datei hinein.
version: "3"
services:
pihole:
image: pihole/pihole:latest
deploy:
placement:
constraints: [node.hostname == cluster-worker1] #der Container wird nur auf dem cluster-worker1 ausgerollt
replicas: 1 #wird 1mal deployed
restart_policy:
condition: on-failure
max_attempts: 3
volumes:
- "./etc-pihole/:/etc/pihole/"
- "./etc-dnsmasq.d/:/etc/dnsmasq.d/"
ports:
- "53:53/tcp"
- "53:53/udp"
- "67:67/udp"
- "80:80/tcp"
- "443:443/tcp"
environment:
- TZ='Germany/Berlin'
- WEBPASSWORD='sicheresPasswort'
- FTL_CMD=debug
- DNSMASQ_LISTENING=all
dns:
- 127.0.0.1
- 1.1.1.1
Diesen Container will ich nur auf dem Worker laufen lassen deswegen hab ich bei replicas: 1 gesetzt und bei placement: constraints: [node.hostname == cluster-worker1]
Bevor wir den Container starten können müsst Ihr auf dem cluster-worker1 einige Volumes erstellen, natürlich könnt Ihr hier auch bestehende z.b. NAS Volumes mounten:
sudo mkdir /home/pi/docker-compose/Pi-hole
sudo mkdir /home/pi/docker-compose/Pi-hole/etc-pihole
sudo mkdir /home/pi/docker-compose/Pi-hole/etc-dnsmasq.d
Dann wird der Container deployed mit:
sudo docker stack deploy -c /home/pi/docker-compose/Pi-hole/docker-compose.yml pihole
Nachdem der Service läuft könnt Ihr auf das WebUI zugreifen. Dazu gebt Ihr diese Adresse in den Browser ein: http://cluster-manager1odercluster-worker1IPAdresse/admin
Um jetzt z.b. das Passwort für den Login zu ändern müsst Ihr euch mit dem cluster-worker1 verbinden und geht in den Container mit: (um den Container Namen zu bekommen gebt Ihr sudo docker ps ein und kopiert den Namen des Containers)
sudo docker exec -it pihole_pihole.1.u2eb4f0439lzcjfg2zzv948mk bash
Dann wird mit diesem Befehl ein neues Passwort vergeben:
pihole -a -p
Dann vergebt Ihr ein neues Passwort und könnt mit exit den Container verlassen.
Jetzt könnt Ihr euch mit dem neuen Passwort einloggen und Pi-hole konfigurieren.
Nützliche Befehle:
# Stack löschen bzw. Container löschen
docker stack rm pihole
# Services anzeigen
docker service ls
# Swarm bzw. Nodes anzeigen
docker node ls
# Service Details anzeigen
docker service inspect --pretty <ServiceID> z.b. docker service inspect --pretty rd4terol5u9k
# Nodes inspezieren
docker node inspect <NodeID> --pretty z.b. docker node inspect cluster-manager1 --pretty
# Worker Join Token anzeigen
docker swarm join-token worker
# Swarm verlassen
docker swarm leave