
Инструмент для хаос-тестирования, эмуляции сети и стресс-тестирования контейнеров
Инструмент хаос-тестирования для Docker, containerd и Podman
Быстрый старт · Руководство пользователя · Сетевой хаос · Развёртывание · Участие в разработке
Pumba — это инструмент хаос-тестирования и эмуляции сетевых сбоев для контейнеров Docker, containerd и Podman. Вдохновлённый Netflix Chaos Monkey, Pumba привносит chaos engineering на уровень контейнеров: убивайте, останавливайте, приостанавливайте и удаляйте контейнеры, вносите сетевые задержки и потерю пакетов или создавайте нагрузку на ресурсы контейнеров.
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 нацелен на Linux-контейнеры — каждое хаос-действие зависит от примитивов Linux (netns, cgroups v2, iptables, tc qdisc, сокеты среды выполнения контейнеров). Публикуемые бинарники:
Windows намеренно не собирается. Примитивы хаоса — запись в Linux netns/cgroups, внедрение sidecar с tc/iptables, передача POSIX-сигналов (SIGCONT/SIGSTOP/SIGUSR1/SIGUSR2, используемых средой выполнения containerd) — не имеют аналогов в Windows. Правдоподобного сценария использования Windows нет даже с бэкендом WSL2 в Docker Desktop, поэтому бинарник для Windows не публикуется. PR, добавляющие поддержку Windows, приниматься не будут; пожалуйста, запускайте pumba на Linux (нативно, в контейнере или в VM).
Скачайте последний релиз для вашей платформы или используйте Docker:
# Binary
curl -sL https://github.com/alexei-led/pumba/releases/latest/download/pumba_linux_amd64 -o pumba
chmod +x pumba
# Docker (recommended)
docker pull ghcr.io/alexei-led/pumba:latest
# Kill a random container matching "test" every 30 seconds
pumba --interval=30s --random kill "re2:^test"
# Add 3 seconds network delay to mydb for 5 minutes
pumba netem --duration 5m delay --time 3000 mydb
# Drop 10% of incoming packets to myapp for 2 minutes
pumba iptables --duration 2m loss --probability 0.1 myapp
# Stress CPU of mycontainer for 60 seconds
pumba stress --duration 60s --stressors="--cpu 4 --timeout 60s" mycontainer
# Kill a container by ID via containerd
pumba --runtime containerd --containerd-namespace k8s.io kill <container-id>
# Add network delay via containerd (requires tc in the container image)
pumba --runtime containerd --containerd-namespace moby \
netem --duration 5m delay --time 3000 <container-id>
Pumba общается с Podman через Docker-совместимый сокет. Флаг --podman-socket необязателен — если он пуст, pumba последовательно проверяет $CONTAINER_HOST, $PODMAN_SOCK, podman machine inspect, /run/podman/podman.sock и $XDG_RUNTIME_DIR/podman/podman.sock.
# Kill a container by name via Podman (rootful socket auto-detected)
sudo pumba --runtime podman kill mycontainer
# Add network delay via Podman (requires rootful socket)
sudo pumba --runtime podman netem --duration 5m delay --time 3000 mycontainer
# Stress CPU via Podman (default child-cgroup mode)
sudo pumba --runtime podman stress --duration 60s --stressors="--cpu 4 --timeout 60s" mycontainer
# Explicit socket override
pumba --runtime podman --podman-socket unix:///run/podman/podman.sock kill mycontainer
netem, iptables и stress требуют rootful Podman — в rootless-режиме происходит быстрый отказ с понятным сообщением, указывающим на podman machine set --rootful (macOS) или rootful systemd-юнит (Linux).
Podman на macOS работает внутри Linux VM. Pumba должен работать на том же ядре, что и целевые контейнеры (чтение /proc/<pid>/cgroup на стороне хоста), поэтому запускайте бинарник pumba внутри VM podman machine:
# one-time setup
brew install podman
podman machine init --rootful --cpus 4 --memory 4096 --now
podman machine ssh sudo dnf install -y bats # optional, for bats tests
# copy a linux/arm64 or linux/amd64 pumba binary into the VM
podman machine ssh sudo cp /path/to/pumba /usr/local/bin/
# run inside the VM
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>
Совет: Для сетевого хаоса на контейнерах без
tc/iptablesиспользуйте--tc-image, чтобы запустить sidecar-контейнер: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 | ✅ Основной |
| Docker Hub | alexeiled/pumba | ⚠️ Устаревший |
Образы собираются нативно для linux/amd64 и linux/arm64 (без QEMU).
| Runtime | Socket (default) | netem / iptables / stress | Notes |
|---|
| Docker | /var/run/docker.sock | Works as root or with socket access | Default runtime. |
| containerd | /run/containerd/containerd.sock | Requires root (overlayfs mounts for sidecar) | Namespaces: k8s.io (Kubernetes), moby (Docker-managed), default (pure containerd). |
| Podman | /run/podman/podman.sock (rootful) | Requires rootful Podman (fails fast else) | Uses Podman's Docker-compat API; on macOS pumba runs inside podman machine (see below). |
| OS | amd64 | arm64 | Notes |
|---|
| Linux | ✅ | ✅ | Primary target. Run pumba on the same kernel as the targeted containers. |
| macOS | ✅ | ✅ | Developer ergonomics only. Use it to drive a remote Docker/Podman/containerd VM (e.g. Colima, podman machine). |
| Windows | ❌ | ❌ | Not supported and not planned. See below. |
| Category | Commands | Description |
|---|
| Хаос контейнеров | kill, stop, pause, rm, restart | Нарушение жизненного цикла контейнеров |
| Выполнение | exec | Выполнение команд внутри контейнеров |
| Сетевая задержка | netem delay | Добавление задержки исходящему трафику |
| Потеря пакетов | netem loss, iptables loss | Отбрасывание пакетов (исходящих и входящих) |
| Сетевые эффекты | netem duplicate, corrupt, rate | Дублирование, повреждение или ограничение скорости пакетов |
| Стресс-тестирование | stress | Нагрузка на CPU, память и I/O через stress-ng (в дочерней cgroup или инъекция в ту же cgroup) |
| Выбор целей | names, regex (re2:), labels, --random | Гибкий выбор контейнеров |
| Планирование | --interval | Повторяющийся хаос с фиксированным интервалом |
| Flag | Default | Description |
|---|
--runtime | docker | Среда выполнения контейнеров (docker, containerd или podman) |
--containerd-socket | /run/containerd/containerd.sock | Путь к сокету containerd |
--containerd-namespace | k8s.io | Namespace containerd (k8s.io для Kubernetes, moby для Docker) |
--podman-socket | (определяется автоматически) | URI сокета Podman (например, unix:///run/podman/podman.sock); пустое значение включает автоопределение |
| Document | Description |
|---|
| Руководство пользователя | Команды хаоса для контейнеров, выбор целей, планирование, конфигурация |
| Сетевой хаос | netem, iptables, продвинутые сценарии, схемы архитектуры |
| Стресс-тестирование | Стресс-тестирование CPU/памяти/IO с помощью stress-ng |
| Развёртывание | Docker, Kubernetes DaemonSets, OpenShift |
| Участие в разработке | Сборка из исходников, запуск тестов, структура проекта |