Skip to content

Reliability & Chaos Testing

Chaos engineering is the discipline of experimenting on a system to build confidence in its ability to withstand turbulent conditions. You form a hypothesis about steady state, inject a realistic fault, and observe whether the system holds.

steady state ──► inject fault ──► observe ──► learn
│ │ │ │
p99, errors kill pod did SLO hold? fix / accept
add latency
partition net

Related practice: reliability testing keeps the focus on the SLOs you promised (availability, error budget) rather than on a single outage.

Use it for

  • Systems with replication, retries, failover or autoscaling claims to verify
  • Game days: a scheduled, controlled experiment with a rollback ready
  • Validating that timeouts, circuit breakers and retries actually work
  • Finding the failure a real datacentre or network event will eventually cause

Avoid or reduce it when

  • You have no observability — you cannot learn from an experiment you cannot see
  • There is no blast-radius control (feature flags, canary, abort button)
  • You start in production before proving the experiment in staging
  • Nobody owns the SLOs; without a target, “resilient” is undefined
Tool Ecosystem Notes
Chaos Mesh Kubernetes CRDs for pod, network, IO, DNS and time chaos
Litmus Kubernetes ChaosHub library, experiment workflows
Gremlin SaaS / agent Managed attacks, safety controls
Toxiproxy Multi TCP proxy to inject latency and resets
AWS Fault Injection Simulator AWS Managed cloud-level faults
Pumba Docker Chaos for plain Docker containers
Chaos Monkey JVM / Spinnaker The original random-termination tool
kube-monkey Kubernetes Schedules random pod kills
Terminal window
docker run -d --name toxiproxy -p 8474:8474 -p 8666:8666 \
ghcr.io/shopify/toxiproxy:2.9.0
toxiproxy-cli create postgres --listen 0.0.0.0:8666 --upstream db:5432
toxiproxy-cli toxic add postgres -t latency -a latency=300
Terminal window
toxiproxy-cli create postgres --listen 0.0.0.0:8666 --upstream db:5432
toxiproxy-cli toxic add postgres -t latency -a latency=500
# now run your suite; assert timeouts and circuit breakers behave
toxiproxy-cli toxic remove postgres -n latency_downstream
  • Define steady state first. Without an SLO you cannot tell an experiment from an outage.
  • Constrain the blast radius. One service, one zone, an abort switch, and a feature flag around anything risky.
  • Run game days on a schedule. Practice drills beat a heroic scramble during a real incident.
  • Inject realistic faults. Real incidents are latency, partial failure and DNS — not just a clean pod kill.
  • Automate in staging, explore in production. Same experiment, staged confidence.
  • Blame the system, not the person. Every surprise is a missing guard rail; turn it into a test or a dashboard panel.

Self-assessment quiz

Pick one answer per question, then press Check answers.

  1. What is the first step of a chaos experiment?
  2. Which tool injects latency and resets through a TCP proxy?
  3. Which is a Kubernetes-native chaos platform?
  4. Why limit the blast radius of an experiment?
  5. What kind of faults do real incidents most often involve?