Minimal Orchestration: Nomad & Swarm (Artikel 228)
Container-Orchestrierung für ressourcenarme Umgebungen. Erfahren Sie den Einsatz von HashiCorp Nomad und Docker Swarm auf Alpine Linux als schlanke Alternative zu Kubernetes.
# Minimal Orchestration: Nomad und Swarm auf Alpine
TL;DR / Management Summary Kubernetes (K3s) ist großartig, aber manchmal immer noch zu “schwer” für winzige Edge-Nodes oder IoT-Cluster. HashiCorp Nomad und der klassische Docker Swarm bieten hier die perfekte Alternative. Nomad ist ein einzelnes Binary, das neben Containern auch rohe Binaries orchestrieren kann. Swarm ist bereits in Docker integriert. Unter Alpine Linux verbrauchen diese Orchestratoren im Leerlauf weniger als 50MB RAM.
# 1. Einführung & Architektur
Einfachheit in der Masse.
Während Kubernetes hunderte Komponenten verwaltet, setzen Nomad und Swarm auf ein kompaktes Master-Worker-Modell.
# Der Vergleich (Mermaid)
graph LR
subgraph "Nomad (The Universalist)"
A[Nomad Server] --> B[Nomad Client: Alpine Node]
B --> C[Task: Docker Container]
B --> D[Task: Raw Binary]
end
subgraph "Docker Swarm (The Integrated)"
E[Swarm Manager] --> F[Swarm Worker: Alpine Node]
F --> G[Service: Container]
end
# 2. HashiCorp Nomad auf Alpine
Ein Binary für alles.
Nomad ist ideal für SLES/Arch/Alpine Admins, da es keine komplexen Abhängigkeiten hat.
# Installation
# Auf Alpine (via Community Repo)
apk add nomad
rc-update add nomad default
rc-service nomad start
# Ein Job-File (web.nomad)
job "web-app" {
datacenters = ["dc1"]
group "frontend" {
count = 3
task "server" {
driver = "docker"
config {
image = "nginx:alpine"
}
resources {
cpu = 100
memory = 64
}
}
}
}
# 3. Docker Swarm auf Alpine
Zero-Config Orchestrierung.
Swarm ist bereits Teil des docker Pakets.
# Cluster initialisieren
# Auf dem Master
docker swarm init --advertise-addr <master_ip>
# Token für Worker anzeigen
docker swarm join-token worker
# Stack deployen
Nutzen Sie die gewohnte Docker-Compose Syntax:
docker stack deploy -c docker-compose.yml my-app
# 4. Day-2 Operations: Ressourcen-Monitoring
Wer frisst was?
In minimalen Clustern ist das Monitoring der Reservation vs. Usage kritisch.
- Nomad: Nutzen Sie das integrierte Web-UI (Port 4646).
- Swarm: Nutzen Sie Portainer als leichtgewichtige GUI-Erweiterung.
# 5. Troubleshooting & “War Stories”
Wenn das Orchester falsch spielt.
# Story 1: “Der hängende Nomad-Client”
Symptom: Ein Node wird als down angezeigt, obwohl er pingbar ist und die CPU-Last niedrig ist.
Ursache: Der Nomad-Client nutzt standardmäßig /tmp für seine Task-Daten. In Alpine ist /tmp oft ein tmpfs (RAM-Disk). Wenn viele Jobs laufen, läuft der RAM-Disk-Speicher voll und der Client blockiert.
Lösung: Legen Sie das Datenverzeichnis von Nomad auf eine echte Partition:
data_dir = "/var/lib/nomad".
# Story 2: “Das Swarm DNS-Loch”
Symptom: Container innerhalb eines Swarm-Stacks können sich sporadisch nicht unter ihrem Service-Namen erreichen.
Ursache: Alpine nutzt musl libc. Deren DNS-Resolver hat Probleme mit dem VIP-Loadbalancer von Docker Swarm (IP-Hash).
Lösung: Stellen Sie den Endpoint-Mode in der Compose-Datei auf dnsrr (DNS Round Robin) um:
endpoint_mode: dnsrr.
# 6. Fazit & Empfehlung
- Wahl: Nutzen Sie Nomad, wenn Sie neben Containern auch Binaries oder Java-Apps auf dem gleichen System orchestrieren wollen.
- Wahl: Nutzen Sie Swarm, wenn Sie bereits Docker-Compose einsetzen und eine “batteries-included” Lösung ohne Installation suchen.
- Minimalismus: Beide Lösungen sind K3s überlegen, wenn Sie auf Systemen mit weniger als 1GB RAM arbeiten.
# Anhang: Cheatsheet
| Aufgabe | Nomad Befehl | Swarm Befehl |
|---|---|---|
| Status sehen | nomad node status |
docker node ls |
| Job deployen | nomad job run <file> |
docker stack deploy ... |
| Logs ansehen | nomad alloc logs <id> |
docker service logs <name> |
| Skalieren | nomad job scale <name> <count> |
docker service scale <name>=<count> |
| Unbenutztes löschen | nomad system gc |
docker system prune |
| Dashboard Port | 4646 |
9000 (Portainer) |
| Health Check | nomad status <job> |
docker service ps <name> |
| Node drain | nomad node drain <id> |
docker node update --availability drain ... |