
컨테이너용 카오스 테스팅, 네트워크 에뮬레이션 및 스트레스 테스팅 도구
Docker, containerd 및 Podman을 위한 카오스 테스팅 도구
빠른 시작 · 사용자 가이드 · 네트워크 카오스 · 배포 · 기여
Pumba는 Docker, containerd 및 Podman 컨테이너를 위한 카오스 테스팅 및 네트워크 에뮬레이션 도구입니다. Netflix Chaos Monkey에서 영감을 받은 Pumba는 카오스 엔지니어링을 컨테이너 수준으로 가져옵니다 — 컨테이너를 kill, stop, pause, remove하고, 네트워크 지연과 패킷 손실을 주입하거나, 컨테이너 리소스에 스트레스 테스트를 수행할 수 있습니다.
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]
| 런타임 | 소켓 (기본값) | netem / iptables / stress | 참고 |
|---|---|---|---|
| Docker | /var/run/docker.sock | 루트 또는 소켓 접근 권한으로 동작 | 기본 런타임. |
| containerd | /run/containerd/containerd.sock | 루트 권한 필요(사이드카용 overlayfs 마운트) | 네임스페이스: k8s.io(Kubernetes), moby(Docker 관리), default(순수 containerd). |
| Podman | /run/podman/podman.sock (rootful) | rootful Podman 필요(그렇지 않으면 즉시 실패) | Podman의 Docker 호환 API 사용. macOS에서는 pumba가 podman machine 내부에서 실행됩니다(아래 참조). |
| OS | amd64 | arm64 | 참고 |
|---|---|---|---|
| Linux | ✅ | ✅ | 기본 대상입니다. 대상 컨테이너와 동일한 커널에서 pumba를 실행하세요. |
| macOS | ✅ | ✅ | 개발자 편의용입니다. 원격 Docker/Podman/containerd VM(예: Colima, podman machine)을 구동하는 데 사용하세요. |
| Windows | ❌ | ❌ | 지원되지 않으며 계획도 없습니다. 아래 참조. |
Windows는 의도적으로 빌드되지 않습니다. 카오스 프리미티브 — Linux netns/cgroup 쓰기, tc/iptables 사이드카 주입, POSIX 신호 전달(SIGCONT/SIGSTOP/SIGUSR1/SIGUSR2, containerd 런타임에서 사용) — 은 Windows에 해당하는 기능이 없습니다. Docker Desktop의 WSL2 백엔드를 사용하더라도 Windows에서의 타당한 사용 사례가 없으므로 Windows 바이너리는 게시되지 않습니다. Windows 지원을 추가하는 PR은 수락되지 않습니다. Linux(네이티브, 컨테이너 또는 VM)에서 pumba를 실행하세요.
| 카테고리 | 명령 | 설명 |
|---|---|---|
| 컨테이너 카오스 | kill, stop, pause, rm, restart | 컨테이너 라이프사이클 중단 |
| 실행 | exec | 컨테이너 내부에서 명령 실행 |
| 네트워크 지연 | netem delay | 발신 트래픽에 지연 추가 |
| 패킷 손실 | netem loss, iptables loss | 패킷 드롭(발신 및 수신) |
| 네트워크 효과 | netem duplicate, corrupt, rate | 패킷 중복, 손상 또는 속도 제한 |
| 스트레스 테스트 | stress | stress-ng를 통한 CPU, 메모리, I/O 스트레스(하위 cgroup 또는 동일 cgroup 주입) |
| 대상 지정 | names, regex (re2:), labels, --random | 유연한 컨테이너 선택 |
| 스케줄링 | --interval | 고정 간격으로 반복되는 카오스 |
자신의 플랫폼에 맞는 최신 릴리스를 다운로드하거나 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는 Docker 호환 소켓을 통해 Podman과 통신합니다. --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)을 가리키는 명확한 메시지와 함께 즉시 실패합니다.
macOS에서 Podman은 Linux VM 내부에서 실행됩니다. Pumba는 대상 컨테이너와 동일한 커널에서 실행되어야 하므로(호스트 측 /proc/<pid>/cgroup 읽기), podman machine VM 내부에서 pumba 바이너리를 실행하세요: