Docker Swarm Cluster Install Debian

Änderungsstand: 2021-09-12

Nicht mehr passend! Wird überarbeitet…

Ich zeige die Installation der ersten VM auf einem Unraid-Server. Meine Bezeichnung (Hostname) und IP-Adressen meiner 4 VM’s sind:

  • node1 (192.168.1.141)
  • node2 (192.168.1.142)
  • node3 (192.168.1.143)
  • node4 (192.168.1.144)

Erstellen einer virtuellen Maschine:

Die „Iso“ des gewünschten Betriebssystems herunterladen (Bullseye (Debian11) 64bit). Das muss übrigens nicht auf dem Server geschehen. Hier reicht ein Fremdrechner, von dem man auf die Unraid-Web-UI zugreift. Dann diese Iso ins Iso-Verzeichnis des Servers kopieren (mittels SMB-Freigabe funktioniert das Bestens).

VM 1 von 4:

Dann auf „VMS“ und „ADD VM“.

  • Gewünschtes System wählen (in meinem Beispiel wäre das Debian)
  • Name: NODE1 (somit kann ich meine VM’S besser auseinander halten)
  • Logical CPU’s: Ich verwende 2
    • Jede VM verwendet ein Paar (0/4 | 1/5 | 2/6 | 3/7 |
  • RAM: 2048
  • Gerät: i440fx-5.1
  • Bios: SeaBIOS
  • OS Install ISO: Hier die zu verwendete Iso auswählen (debian-11.0.0-amd64-netinst.iso)
  • Primary vDisk Location: Hier kann man ein Laufwerk des Arrays zuweisen, sogar den Cache selbst oder auf Auto stehen lassen (Auto)
  • Primary vDisk Size: 32GB ist für mich eine gute Größe
  • ## Wird momentan nicht verwendet! Unraid Share: /mnt/user/clusterpath/
  • ## Wird momentan nicht verwendet! Bezeichnung des eingehängten Datenträgers/Ordners: clusterfreigabe
  • VNC Passwort: Hier kann man ein Passwort vergeben, um VNC Passwortgeschützt zu verwenden (muss man aber nicht)
  • VNC Keyboard: Tastaturlayout festlegen
  • „Create“

VNC startet nun automatisch und ich beginne die Installation.

Installation Debian-Server:

  • Graphical install
  • German
  • Deutschland
  • Deutsch
  • Rechnername: node1 (die anderen VM’s sind dann node2, node3 und node4)
  • Domain-Name: kann Frei gelassen werden
  • Root-Passwort – – KEINE EINGABE (ich arbeite mit dem sudo-Befehl)
  • Benutzername: einen Benutzernamen anlegen (dieser hat dann später sudo-Rechte)
  • Benutzername für das Konto: Hier könnte man einen kleingeschriebenen anderen Namen vergeben (ich verwende die gleiche Namensgebung)
  • Passwort für Benutzer festlegen (Achtung! Unter Umständen Amerikanisches Tastaturlayout)
  • Partitionierung: Geführt – gesamte Platte verwenden und LVM einrichten
  • Virtuelle Festplatte (vda1) bestätigen
  • Alle Dateien auf einer Partition
  • Änderung schreiben und LVM einrichten? – Ja
  • Maximale Größe bestätigen
  • UEFI erzwingen? Nein (erscheint nicht bei Verwendung von SeaBIOS)
  • Änderung schreiben? Ja
  • Weiteres Medium einlesen? Nein
  • Deutschland
  • Spiegelserver: einen Server in der Nähe wählen
  • HTTP-Proxy: Wenn nicht verwendet, dann leer lassen
  • Anonyme Statistiken? Wie man mag
  • Softwareauswahl: NUR SSH server und Standard-Systemwerkzeuge
  • Grub Bootloader auf primären Laufwerk installieren? Ja
  • /dev/vda
  • Neustart: Weiter

Das System wurde installiert. Login mit Benutzernamen und Passwort. Nun die IP-Adresse herausfinden:

ip a

Jetzt hat man die IP-Adresse und die Bezeichnung des Netzwerkanschlusses. Ab jetzt verwende ich Putty und kann VNC schließen.

Debian-Server statische IP zuweisen:

sudo nano /etc/network/interfaces

Folgende Einträge dürften in der Standardkonfiguraion stehen (Bezeichnung des Networkadapters beachten!):

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug ens4
iface ens4 inet dhcp

Diese Einträge ändere ich in:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug ens4
iface ens4 inet static
  address 192.168.1.141
  netmask 255.255.255.0
  gateway 192.168.1.1
  dns-nameservers 192.168.1.1

STRG-x, y, Enter

sudo reboot

Achtung! Vergebene IP-Adresse im Putty anpassen!

Debian-Server IPv6 explizit abwählen:

sudo nano /etc/sysctl.d/01-disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1

STRG-X, y, Enter

sudo reboot

Test mit:

ip addr show | grep inet6

Es dürfen keine Einträge erscheinen!

Diesen Tip habe ich bei Thomas Krenn gefunden.

https://www.thomas-krenn.com/de/wiki/IPv6_deaktivieren

.

Installation Cluster Swarm:

Erster Raspi (Manager 1)

Meine statische IP: 192.168.1.141

Hostname ändern, falls noch nicht erledigt:

sudo hostnamectl set-hostname node1
sudo apt update && sudo apt upgrade -y && sudo apt install -y mc curl git
sudo reboot
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh
sudo apt update && apt-cache policy docker-ce
sudo usermod -aG docker ${USER}
sudo docker swarm init --advertise-addr 192.168.1.141

Die Ausgabe, für die Worker, nach „To add a worker to this swarm, run the following command:“ für die Worker kopieren und dort einfügen! docker swarm join –token …..

sudo docker swarm join-token manager

Die Ausgabe, für einen oder mehreren Manager, wenn verwendet, kopieren und im jeweiligen node für Manager reinkopieren!

Zweiter Raspi (Manager 2)

Meine statische IP: 192.168.1.142

Hostname ändern, falls noch nicht erledigt:

sudo hostnamectl set-hostname node2
sudo apt update && sudo apt upgrade -y && sudo apt install -y mc curl git
sudo reboot
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh
sudo apt update && apt-cache policy docker-ce
sudo usermod -aG docker ${USER}

Die kopierte Ausgabe von node1, für den weiteren Manager, einfügen! sudo docker swarm join –token …..

(das sudo davor nicht vergessen!)

Dritter Raspi (Worker 1)

Meine statische IP: 192.168.1.143

Hostname ändern, falls noch nicht erledigt:

sudo hostnamectl set-hostname node3
sudo apt update && sudo apt upgrade -y && sudo apt install -y mc curl git
sudo reboot
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh
sudo apt update && apt-cache policy docker-ce
sudo usermod -aG docker ${USER}

Die kopierte Ausgabe von node1, für die Worker, einfügen! sudo docker swarm join –token …..

(das sudo davor nicht vergessen!)

Vierter Raspi (Worker 2)

Meine statische IP: 192.168.1.144

Hostname ändern, falls noch nicht erledigt:

sudo hostnamectl set-hostname node4
sudo apt update && sudo apt upgrade -y && sudo apt install -y mc curl git
sudo reboot
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh
sudo apt update && apt-cache policy docker-ce
sudo usermod -aG docker ${USER}

Die kopierte Ausgabe von node1, für die Worker, einfügen! sudo docker swarm join –token …..

(das sudo davor nicht vergessen!)

Wurden alle VMs soweit eingerichtet, prüfe ich an der ersten VM, meinem Hauptmanager (node1), mit folgendem Befehl, ob alles übernommen wurde:

sudo docker node ls

Die Ausgabe:

ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
ii7fa3nwln7696a83107kiqj3 *   node1      Ready     Active         Leader           20.10.8
gxmmoeeehe4r58ef8mtxnnjr5     node2      Ready     Active         Reachable        20.10.8
wtfhcgqi858k4l2gocl8npqgt     node3      Ready     Active                          20.10.8
1ce1b9752fdvjtsmlutnhpv2w     node4      Ready     Active                          20.10.8

Passt. Alles in Ordnung. Die VM’s wurden nun vorbereitet und sind für Docker Swarm Cluster bereit. Ab nun arbeite ich an der ersten VM (node1) weiter.

Ich möchte Tage oder Wochen später einen weiteren Worker im Swarm hinzufügen? Dafür setze ich am node1 folgenden Befehl ab:

sudo docker swarm join-token worker

Die Ausgabe wie schon bekannt mit einem sudo davor am hinzuzufügendem Worker eintragen.

Für einen weiteren Manager, am ersten node:

sudo docker swarm join-token manager

Ich installiere nun Portainer im Swarm-Mode. Mit dem Portainer wird der benötigte „Agent“ mit installiert, der sich um die komplette Verwaltung kümmert.

sudo curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml

Um diesen Docker zu starten, folgenden Befehl verwenden:

sudo docker stack deploy -c portainer-agent-stack.yml portainer

Portainer wurde installiert und der „Agent“ kümmert sich um die Verteilung bzw. die Abarbeitung im Knoten. Um Portainer zu öffnen, im Browser die IP-Adresse des ersten Raspi:9000 eingeben: 192.168.1.141:9000

Die Initialisierung dauert etwas. Portainer wird auf einem Node und der dazugehörige Agent auf ALLEN Nodes ausgerollt. Bitte ca. 1 Minute warten, bevor man Portainer im Browser öffnet.

Die Datenplatte als NFS-Freigabe einbinden:

Wozu benötigt man eigentlich eine externe Freigabe? Nun, die anfallenden Daten der erstellen Docker sind im Normalfall nicht persistent. Das heißt, wenn der Docker Crasht oder gelöscht wird, sind die Daten weg. Abhilfe schafft die Angabe von Volumes im Compose-Script oder im Docker-Script. Dort kann man dem Docker mitteilen, dass die anfallenden Daten, wie z.B. Konfigurationsdateien, auf einer Freigabe abgelegt werden sollen. Wird der Docker gelöscht und anschließend wieder installiert und man gibt das selbe Verzeichnis als Volume wieder an, werden die sich darin befindlichen Daten wieder verwendet. Da ich aber hier in einem Cluster arbeite, macht es wenig Sinn, die Daten auf die einzelnen Nodes zu schreiben, weil der Manager auch andere Nodes zuweisen kann. Und dann wären die Daten dort nicht vorhanden. Abhilfe schafft also dementsprechend eine externe Freigabe, auf welcher alle Nodes im Cluster zugreifen können.

Ich verbinde eine NFS-Freigabe meines Unraid-Servers mit dem Cluster.

NFS-Freigabe eines Unraid-Server verwenden (Variante 1):

Bsp.: Ich erstelle eine Freigabe auf meinem Unraid-Server Namens clusterpath und gebe bei den „NFS Sicherheitseinstellungen“ – „Exportieren: Ja“ ein.

Die Befehle in den einzelnen Cluster-Nodes würden dann so aussehen (auf allen Nodes ausführen!):

sudo apt install -y nfs-common
sudo mkdir -p /mnt/data
sudo chmod 777 /mnt/data/
sudo mount -t nfs 192.168.1.39:/mnt/user/clusterpath /mnt/data
sudo cp /etc/fstab /etc/fstab.old
echo 192.168.1.39:/mnt/user/clusterpath /mnt/data nfs defaults 0 0  |  sudo tee -a /etc/fstab
sudo reboot

Die NFS-Freigabe ist für alle Nodes eingerichtet und verfügbar.

Jetzt unbedingt ein Test, ob auch alle Nodes auf die Freigabe zugreifen können. Ich erstelle auf einem Node in der Freigabe eine Datei und schaue, ob diese Datei auch auf allen anderen Nodes angezeigt wird:

Node 1:

sudo touch /mnt/data/testdatei.txt

Nun gebe ich folgenden Befehl auf allen anderen Nodes ein:

cd /mnt/data && ls

Die Datei testdatei.txt sollte nun auf allen Nodes sichtbar sein (Beispiel node4).

cluster@node4:~$ cd /mnt/data && ls
testdatei.txt
cluster@node4:/mnt/data$

.

Die Vorbereitung des Clusters ist nun abgeschlossen. Jetzt können die Docker für den Swarm installiert werden. Ich stelle in dieser Guidreihe einige Beispiele vor.

PS: Optional, als Alternative zu einer NFS-Freigabe, könnte man auch eine VDISK als Freigabe verwenden. Doch da weiß ich noch nicht, ob man eine VDISK für alle Nodes verwenden kann. Und genau das würde man benötigen. Das teste ich vielleicht später, wenn ich das Thema Cluster soweit durch habe.

NFS-Freigabe eines Unraid-Server verwenden (Variante 2):

Bsp.: Ich erstelle eine Freigabe auf meinem Unraid-Server (192.168.1.153) Namens nfspath und gebe bei den „NFS Sicherheitseinstellungen“ – „Exportieren: Ja“ ein.

Folgendes identisch auf allen Nodes anwenden:

sudo apt install -y nfs-common
sudo mkdir -p /mnt/data
sudo chmod 777 /mnt/data/

Jetzt schreibe ich für das Einbinden dieser Freigabe, ein Script:

sudo su
cd && mkdir -p scriptfiles
cd && cd scriptfiles && nano mountscript.sh

Folgendes eintragen und ggnf. Server-IP und Pfade anpassen:

#!/bin/bash
sudo mount -t nfs 192.168.1.153:/mnt/user/nfspath /mnt/data
#

Strg-x, y, Enter

sudo chmod 700 mountscript.sh

Zum Aufruf des Scriptes folgenden Befehl eingeben:

sudo ./mountscript.sh

Die Freigabe wurde eingehängt. Um das Script nach einem Serverneustart zu verwenden, gehe ich wie folgt vor:

sudo crontab -e

Folgendes gebe ich am Ende ein:

# Mount NFS-Freigabe
@reboot sleep 20 && ~/scriptfiles/mountscript.sh >/dev/null 2>&1
#

Strg-x, y, Enter

sudo reboot

20 Sekunden nach Restart wird die Freigabe eingehängt und ist verfügbar.

Der Cluster ist komplett eingerichtet, betriebsbereit und eine externe Freigabe, als NFS-Freigabe, verfügbar.

Jetzt unbedingt ein Test, ob auch alle Nodes auf die Freigabe zugreifen können. Ich erstelle auf einem Node in der Freigabe eine Datei und schaue, ob diese Datei auch auf allen anderen Nodes angezeigt wird:

Node 1:

sudo touch /mnt/data/testdatei.txt

Nun gebe ich folgenden Befehl auf allen anderen Nodes ein:

cd /mnt/data && ls

Die Datei testdatei.txt sollte nun auf allen Nodes sichtbar sein.

Quelle(n):

https://docs.docker.com/engine/install/debian/

https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/

https://documentation.portainer.io/v2.0/deploy/ceinstallswarm/

.dd

.

.

Erstelle eine Website wie diese mit WordPress.com
Jetzt starten