
Tool für Chaos-Tests, Netzwerk-Emulation und Stresstests von Containern
Chaos-Testwerkzeug für Docker, containerd und Podman
Schnellstart · Benutzerhandbuch · Netzwerk-Chaos · Bereitstellung · Mitwirken
Pumba ist ein Chaos-Test- und Netzwerk-Emulationswerkzeug für Docker-, containerd- und Podman-Container. Inspiriert von Netflix Chaos Monkey bringt Pumba Chaos Engineering auf die Container-Ebene – Container töten, stoppen, pausieren und entfernen, Netzwerkverzögerungen und Paketverluste einfügen oder Container-Ressourcen unter Belastung testen.
graph LR
A[Pumba CLI] -->|Docker API / containerd API / Podman compat API| B[Container Runtime]
B -->|List & Filter| C[Target Containers]
A -->|kill / stop / pause / rm| C
A -->|netem / iptables| D[Helper Container / Direct Exec]
D -->|Shares network namespace| C
D -->|Runs tc / iptables| E[Network Chaos]
Pumba zielt auf Linux-Container ab – jede Chaos-Aktion hängt von Linux-Primitiven ab (netns, cgroups v2, iptables, tc qdiscs, Container-Runtime-Sockets). Veröffentlichte Binärdateien:
Windows wird bewusst nicht gebaut. Die Chaos-Primitive – Linux-netns/cgroup-Schreibvorgänge, tc/iptables-Sidecar-Injektion, POSIX-Signalweiterleitung (SIGCONT/SIGSTOP/SIGUSR1/SIGUSR2, die von der containerd-Laufzeitumgebung verwendet werden) – haben kein Windows-Äquivalent. Es gibt keinen plausiblen Windows-Anwendungsfall, selbst mit dem WSL2-Backend von Docker Desktop, daher wird keine Windows-Binärdatei veröffentlicht. PRs, die Windows-Unterstützung hinzufügen, werden nicht angenommen; bitte führen Sie pumba auf Linux aus (nativ, als Container oder in einer VM).
Laden Sie das neueste Release für Ihre Plattform herunter, oder verwenden Sie Docker:
# Binärdatei
curl -sL https://github.com/alexei-led/pumba/releases/latest/download/pumba_linux_amd64 -o pumba
chmod +x pumba
# Docker (empfohlen)
docker pull ghcr.io/alexei-led/pumba:latest
# Töte alle 30 Sekunden einen zufälligen Container, der "test" entspricht
pumba --interval=30s --random kill "re2:^test"
# Füge mydb 5 Minuten lang eine Netzwerkverzögerung von 3 Sekunden hinzu
pumba netem --duration 5m delay --time 3000 mydb
# Verwerfe 2 Minuten lang 10 % der eingehenden Pakete für myapp
pumba iptables --duration 2m loss --probability 0.1 myapp
# Belaste die CPU von mycontainer 60 Sekunden lang
pumba stress --duration 60s --stressors="--cpu 4 --timeout 60s" mycontainer
# Töte einen Container anhand seiner ID über containerd
pumba --runtime containerd --containerd-namespace k8s.io kill <container-id>
# Füge über containerd eine Netzwerkverzögerung hinzu (erfordert tc im Container-Image)
pumba --runtime containerd --containerd-namespace moby \
netem --duration 5m delay --time 3000 <container-id>
Pumba kommuniziert mit Podman über dessen Docker-kompatiblen Socket. --podman-socket ist optional – wenn leer, prüft pumba der Reihe nach $CONTAINER_HOST, $PODMAN_SOCK, podman machine inspect, /run/podman/podman.sock und $XDG_RUNTIME_DIR/podman/podman.sock.
# Töte einen Container anhand seines Namens über Podman (rootful Socket automatisch erkannt)
sudo pumba --runtime podman kill mycontainer
# Füge über Podman eine Netzwerkverzögerung hinzu (erfordert rootful Socket)
sudo pumba --runtime podman netem --duration 5m delay --time 3000 mycontainer
# Belaste die CPU über Podman (Standard-Child-cgroup-Modus)
sudo pumba --runtime podman stress --duration 60s --stressors="--cpu 4 --timeout 60s" mycontainer
# Explizite Socket-Überschreibung
pumba --runtime podman --podman-socket unix:///run/podman/podman.sock kill mycontainer
netem, iptables und stress erfordern rootful Podman – rootless bricht schnell mit einer klaren Meldung ab, die auf podman machine set --rootful (macOS) oder die rootful systemd-Unit (Linux) verweist.
Podman läuft auf macOS innerhalb einer Linux-VM. Pumba muss auf demselben Kernel wie die Zielcontainer laufen (Host-seitiges Lesen von /proc/<pid>/cgroup), führen Sie die pumba-Binärdatei also innerhalb der podman machine-VM aus:
# einmalige Einrichtung
brew install podman
podman machine init --rootful --cpus 4 --memory 4096 --now
podman machine ssh sudo dnf install -y bats # optional, für bats-Tests
# kopieren Sie eine linux/arm64- oder linux/amd64-pumba-Binärdatei in die VM
podman machine ssh sudo cp /path/to/pumba /usr/local/bin/
# innerhalb der VM ausführen
podman machine ssh sudo pumba --runtime podman --log-level debug ps
podman machine ssh sudo pumba --runtime podman netem --duration 10s delay --time 200 <container-id>
Tipp: Für Netzwerk-Chaos auf Containern ohne
tc/iptablesverwenden Sie--tc-image, um einen Sidecar zu starten:pumba --runtime containerd netem --tc-image ghcr.io/alexei-led/pumba-alpine-nettools:latest \ --duration 5m delay --time 3000 <container-id>
docker run -it --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
ghcr.io/alexei-led/pumba --interval=10s --random kill "re2:^test"
| Registry | Image | Status |
|---|---|---|
| GitHub Container Registry | ghcr.io/alexei-led/pumba | ✅ Primär |
| Docker Hub | alexeiled/pumba | ⚠️ Veraltet |
Images werden nativ für linux/amd64 und linux/arm64 gebaut (kein QEMU).
| Laufzeit | Socket (Standard) | netem / iptables / stress | Hinweise |
|---|
| Docker | /var/run/docker.sock | Funktioniert als Root oder mit Socket-Zugriff | Standard-Laufzeitumgebung. |
| containerd | /run/containerd/containerd.sock | Erfordert Root (overlayfs-Mounts für Sidecar) | Namensräume: k8s.io (Kubernetes), moby (Docker-verwaltet), default (reines containerd). |
| Podman | /run/podman/podman.sock (rootful) | Erfordert rootful Podman (sonst schneller Abbruch) | Verwendet Podmans Docker-kompatible API; auf macOS läuft pumba innerhalb von podman machine (siehe unten). |
| Betriebssystem | amd64 | arm64 | Hinweise |
|---|
| Linux | ✅ | ✅ | Primäres Ziel. Führen Sie pumba auf demselben Kernel wie die Zielcontainer aus. |
| macOS | ✅ | ✅ | Nur für Entwicklerzwecke. Verwenden Sie es, um eine entfernte Docker-/Podman-/containerd-VM zu steuern (z. B. Colima, podman machine). |
| Windows | ❌ | ❌ | Nicht unterstützt und nicht geplant. Siehe unten. |
| Kategorie | Befehle | Beschreibung |
|---|
| Container-Chaos | kill, stop, pause, rm, restart | Unterbrechen des Container-Lebenszyklus |
| Ausführen | exec | Befehle innerhalb von Containern ausführen |
| Netzwerkverzögerung | netem delay | Latenz zum ausgehenden Datenverkehr hinzufügen |
| Paketverlust | netem loss, iptables loss | Pakete verwerfen (ausgehend und eingehend) |
| Netzwerkeffekte | netem duplicate, corrupt, rate | Pakete duplizieren, beschädigen oder ratenbegrenzen |
| Belastungstest | stress | CPU-, Speicher-, I/O-Belastung über stress-ng (Child-cgroup oder gleiche cgroup Injektion) |
| Zielauswahl | Namen, Regex (re2:), Labels, --random | Flexible Containerauswahl |
| Zeitplanung | --interval | Wiederkehrendes Chaos in festen Intervallen |
| Flag | Standard | Beschreibung |
|---|
--runtime | docker | Container-Laufzeitumgebung (docker, containerd oder podman) |
--containerd-socket | /run/containerd/containerd.sock | containerd-Socket-Pfad |
--containerd-namespace | k8s.io | containerd-Namensraum (k8s.io für Kubernetes, moby für Docker) |
--podman-socket | (automatisch erkannt) | Podman-Socket-URI (z. B. unix:///run/podman/podman.sock); leer löst automatische Erkennung aus |
| Dokument | Beschreibung |
|---|
| Benutzerhandbuch | Container-Chaos-Befehle, Zielauswahl, Zeitplanung, Konfiguration |
| Netzwerk-Chaos | netem, iptables, fortgeschrittene Szenarien, Architekturdiagramme |
| Belastungstest | CPU-/Speicher-/I/O-Belastungstests mit stress-ng |
| Bereitstellung | Docker, Kubernetes-DaemonSets, OpenShift |
| Mitwirken | Aus dem Quellcode bauen, Tests ausführen, Projektstruktur |