
Herramienta de pruebas de caos, emulación de red y pruebas de estrés para contenedores
Herramienta de pruebas de caos para Docker, containerd y Podman
Inicio rápido · Guía de usuario · Caos de red · Despliegue · Contribuciones
Pumba es una herramienta de pruebas de caos y emulación de red para contenedores Docker, containerd y Podman. Inspirado en Netflix Chaos Monkey, Pumba lleva la ingeniería del caos al nivel de contenedor — matar, detener, pausar y eliminar contenedores, inyectar retrasos de red y pérdida de paquetes, o realizar pruebas de estrés sobre los recursos de los contenedores.
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 se dirige a contenedores Linux: cada acción de caos depende de primitivas de Linux (netns, cgroups v2, iptables, tc qdiscs, sockets del runtime de contenedores). Binarios publicados:
Windows no se compila intencionalmente. Las primitivas de caos — escrituras de netns/cgroup de Linux, inyección de sidecar tc/iptables, reenvío de señales POSIX (SIGCONT/SIGSTOP/SIGUSR1/SIGUSR2 utilizadas por el runtime containerd) — no tienen equivalente en Windows. No hay un caso de uso plausible para Windows ni siquiera con el backend WSL2 de Docker Desktop, por lo que no se publica ningún binario de Windows. No se aceptarán PRs que añadan soporte para Windows; por favor ejecuta pumba en Linux (nativo, contenedor o VM).
Descarga la última versión para tu plataforma, o usa 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 se comunica con Podman a través de su socket Docker-compat. --podman-socket es opcional: si está vacío, pumba sondea $CONTAINER_HOST, $PODMAN_SOCK, podman machine inspect, /run/podman/podman.sock y $XDG_RUNTIME_DIR/podman/podman.sock en ese orden.
# 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 y stress requieren Podman rootful; el modo rootless falla rápidamente con un mensaje claro que señala podman machine set --rootful (macOS) o la unidad systemd rootful (Linux).
Podman en macOS se ejecuta dentro de una VM Linux. Pumba debe ejecutarse en el mismo kernel que los contenedores objetivo (lectura de /proc/<pid>/cgroup del lado del host), por lo que ejecuta el binario de pumba dentro de la 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>
Consejo: Para caos de red en contenedores sin
tc/iptables, usa--tc-imagepara desplegar un 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"
| Registro | Imagen | Estado |
|---|---|---|
| GitHub Container Registry | ghcr.io/alexei-led/pumba | ✅ Principal |
| Docker Hub | alexeiled/pumba | ⚠️ Obsoleto |
Las imágenes se compilan de forma nativa para linux/amd64 y linux/arm64 (sin QEMU).
| Runtime | Socket (por defecto) | netem / iptables / stress | Notas |
|---|
| Docker | /var/run/docker.sock | Funciona como root o con acceso al socket | Runtime por defecto. |
| containerd | /run/containerd/containerd.sock | Requiere root (montajes overlayfs para sidecar) | Namespaces: k8s.io (Kubernetes), moby (gestionado por Docker), default (containerd puro). |
| Podman | /run/podman/podman.sock (rootful) | Requiere Podman rootful (falla rápido si no) | Usa la API Docker-compat de Podman; en macOS pumba se ejecuta dentro de podman machine (ver más abajo). |
| OS | amd64 | arm64 | Notas |
|---|
| Linux | ✅ | ✅ | Objetivo principal. Ejecuta pumba en el mismo kernel que los contenedores objetivo. |
| macOS | ✅ | ✅ | Solo ergonomía para desarrolladores. Úsalo para controlar una VM Docker/Podman/containerd remota (p. ej. Colima, podman machine). |
| Windows | ❌ | ❌ | No compatible ni planeado. Ver más abajo. |
| Categoría | Comandos | Descripción |
|---|
| Caos en contenedores | kill, stop, pause, rm, restart | Alterar el ciclo de vida del contenedor |
| Ejecutar | exec | Ejecutar comandos dentro de contenedores |
| Retardo de red | netem delay | Añadir latencia al tráfico de salida |
| Pérdida de paquetes | netem loss, iptables loss | Descartar paquetes (salida y entrada) |
| Efectos de red | netem duplicate, corrupt, rate | Duplicar, corromper o limitar la tasa de paquetes |
| Pruebas de estrés | stress | Estrés de CPU, memoria y E/S mediante stress-ng (cgroup hijo o inyección en el mismo cgroup) |
| Selección de objetivos | nombres, regex (re2:), etiquetas, --random | Selección flexible de contenedores |
| Programación | --interval | Caos recurrente a intervalos fijos |
| Flag | Por defecto | Descripción |
|---|
--runtime | docker | Runtime de contenedor (docker, containerd o podman) |
--containerd-socket | /run/containerd/containerd.sock | Ruta del socket de containerd |
--containerd-namespace | k8s.io | Namespace de containerd (k8s.io para Kubernetes, moby para Docker) |
--podman-socket | (detección automática) | URI del socket de Podman (p. ej. unix:///run/podman/podman.sock); vacío activa la detección automática |
| Documento | Descripción |
|---|
| Guía de usuario | Comandos de caos de contenedores, selección de objetivos, programación, configuración |
| Caos de red | netem, iptables, escenarios avanzados, diagramas de arquitectura |
| Pruebas de estrés | Pruebas de estrés de CPU/memoria/E/S con stress-ng |
| Despliegue | Docker, DaemonSets de Kubernetes, OpenShift |
| Contribuciones | Compilar desde el código fuente, ejecutar pruebas, estructura del proyecto |