Docker Swarm aufsetzten/ Raspberry Pi Cluster

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


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert