Skip to main content
← All Articles · · 9 min read

Chaos Engineering in 2026: Tools, Techniques & Getting Started

Learn chaos engineering with Gremlin, LitmusChaos, and AWS Fault Injection Service. Design controlled experiments, build resilience into distributed systems, and integrate chaos testing into CI/CD pipelines.

chaos engineeringchaos monkeyresilience testingfault injectionreliabilitySRE

Chaos engineering is the practice of deliberately introducing controlled failures into a system to expose weaknesses before they cause real outages. Netflix popularized the concept with Chaos Monkey in 2011. In 2026, it’s a standard practice at any organization serious about reliability — and the tooling has matured to make it accessible far beyond Netflix-scale teams.

The premise is simple: if your system will experience failures (and it will), you’d rather discover how it behaves in a controlled experiment than during a 3am production incident.


The Chaos Engineering Hypothesis Model

Chaos engineering is science, not random destruction. Every experiment follows a hypothesis structure:

  1. Define steady state: what does “normal” look like? (requests/second, error rate, p99 latency)
  2. Hypothesize: “We believe the system will maintain steady state when [failure is injected]”
  3. Inject failure: introduce the specific fault
  4. Observe: measure the impact against steady state
  5. Conclude: did the system behave as expected? If not, that’s a weakness to fix.

The goal is learning, not breaking things. You’re testing your assumptions about system resilience.


Chaos Monkey and the Simian Army

Netflix’s Chaos Monkey terminates EC2 instances at random during business hours, forcing teams to build services that handle instance failures gracefully. It’s the original chaos tool, now open-sourced at github.com/netflix/chaosmonkey.

Netflix extended the concept to the Simian Army:

  • Chaos Gorilla: terminates an entire AWS availability zone
  • Chaos Kong: simulates an entire AWS region failure
  • Latency Monkey: introduces artificial network latency
  • Conformity Monkey: finds instances not following best practices
  • Security Monkey: detects security violations and misconfigurations

The key insight from Netflix: Chaos Monkey runs every day during business hours — not randomly at night. Engineers need to be present to respond and fix issues immediately.


Chaos Engineering Tools in 2026

Gremlin (Commercial)

The most complete chaos platform. Supports CPU/memory/disk attacks, network delay/loss/corruption, shutdown attacks, and state attacks across AWS, GCP, Azure, Kubernetes, and bare metal.

# Gremlin CLI: 10% packet loss on production service for 60 seconds
gremlin attack-container \
  --target-type Container \
  --container-labels app=payment-service \
  --attack-type packet_loss \
  --percent 10 \
  --length 60

Gremlin’s “Game Days” feature orchestrates multi-team resilience exercises with pre-planned scenarios and rollback capabilities.

LitmusChaos (CNCF, Open Source)

The leading open-source chaos framework for Kubernetes. Experiments defined as Kubernetes custom resources, integrated with ArgoCD and GitHub Actions.

# Litmus ChaosEngine: inject pod failure
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
  name: pod-failure-experiment
  namespace: payment-system
spec:
  appinfo:
    appns: payment-system
    applabel: app=payment-service
    appkind: deployment
  chaosServiceAccount: litmus-admin
  experiments:
    - name: pod-delete
      spec:
        components:
          env:
            - name: TOTAL_CHAOS_DURATION
              value: '60'       # seconds
            - name: CHAOS_INTERVAL
              value: '10'       # kill a pod every 10 seconds
            - name: FORCE
              value: 'false'    # graceful termination
            - name: PODS_AFFECTED_PERC
              value: '50'       # kill 50% of pods

AWS Fault Injection Service (FIS)

AWS’s native chaos engineering service. Injects faults into EC2, EKS, RDS, and other AWS services directly from the console or API.

{
  "description": "Kill 25% of EC2 instances in payment-asg",
  "targets": {
    "PaymentInstances": {
      "resourceType": "aws:ec2:instance",
      "resourceTags": {"Service": "payment-api"},
      "selectionMode": "PERCENT(25)"
    }
  },
  "actions": {
    "TerminateInstances": {
      "actionId": "aws:ec2:terminate-instances",
      "targets": {"Instances": "PaymentInstances"},
      "parameters": {}
    }
  },
  "stopConditions": [
    {
      "source": "aws:cloudwatch:alarm",
      "value": "arn:aws:cloudwatch:::alarm:payment-error-rate-critical"
    }
  ]
}

The stopConditions are critical: FIS automatically stops the experiment if a CloudWatch alarm triggers, preventing chaos experiments from causing uncontrolled damage.

Chaos Toolkit (Open Source)

A Python-based framework for defining chaos experiments as JSON/YAML files. Integrates with Kubernetes, AWS, GCP, and custom endpoints.

{
  "title": "Pod Failure Resilience Check",
  "description": "Verify checkout handles pod failures gracefully",
  "steady-state-hypothesis": {
    "title": "Normal checkout operation",
    "probes": [{
      "type": "probe",
      "name": "checkout-success-rate",
      "provider": {
        "type": "http",
        "url": "https://api.example.com/metrics/checkout-success",
        "timeout": 5
      },
      "tolerance": {"type": "range", "range": [0.99, 1.0]}
    }]
  },
  "method": [{
    "type": "action",
    "name": "kill-checkout-pods",
    "provider": {
      "type": "python",
      "module": "chaosk8s.pod.actions",
      "func": "terminate_pods",
      "arguments": {
        "label_selector": "app=checkout",
        "ns": "production",
        "qty": 2
      }
    }
  }]
}

Failure Mode Categories

Systematic chaos engineering covers these failure categories:

CategoryExample Experiments
ComputeInstance termination, pod eviction, OOM kill
NetworkPacket loss, latency, DNS failure, network partition
StorageDisk full, I/O latency, read/write errors
StateMemory pressure, CPU starvation, clock skew
DependenciesThird-party API failure, database unavailability
ConfigurationInvalid config deployment, secrets rotation

Start with compute failures (instance/pod termination) — they’re easiest to implement and expose the most common resilience gaps.


Integrating Chaos into CI/CD

Run lightweight chaos experiments as part of your deployment pipeline to catch regressions before they reach production:

# GitHub Actions: chaos experiment in staging after deploy
- name: Deploy to Staging
  uses: your-org/deploy-action@v1

- name: Wait for stable state (5 min)
  run: sleep 300

- name: Run chaos experiment
  run: |
    # Terminate 1 pod, verify service remains healthy
    kubectl delete pod -l app=payment-service -n staging --field-selector=metadata.name=$(kubectl get pods -l app=payment-service -n staging -o jsonpath='{.items[0].metadata.name}')

    # Wait 30 seconds
    sleep 30

    # Verify error rate is still < 1%
    ERROR_RATE=$(curl -s https://staging-api.example.com/metrics/error-rate)
    if (( $(echo "$ERROR_RATE > 0.01" | bc -l) )); then
      echo "Error rate exceeded threshold after chaos: $ERROR_RATE"
      exit 1
    fi
    echo "Chaos experiment passed: error rate = $ERROR_RATE"

GameDay: Organized Resilience Exercises

A GameDay is a structured resilience exercise involving multiple teams. It typically runs for 4–8 hours with a specific scenario:

Example GameDay Scenario: “Database Unavailability”

  1. Announce scope: DBA team will simulate 5-minute RDS failover
  2. Observe baseline: confirm all dashboards green before starting
  3. Inject: initiate RDS Multi-AZ failover
  4. Observe: which services degraded? What alerts fired? Did circuit breakers open?
  5. Restore: confirm recovery after failover completes
  6. Retrospective: document what worked, what failed, what to fix

GameDays build team muscle memory, test runbooks, and expose integration assumptions that no amount of unit testing catches.


Circuit Breakers: Essential Defense Pattern

Chaos engineering often reveals missing circuit breakers. A circuit breaker prevents a service from hammering a failing dependency:

// Circuit breaker with opossum
import CircuitBreaker from 'opossum';

const paymentApiCall = async (order) => {
  return await fetch(`https://payment-api.internal/charge`, {
    method: 'POST',
    body: JSON.stringify(order),
  });
};

const breaker = new CircuitBreaker(paymentApiCall, {
  timeout: 3000,           // fail if call takes > 3 seconds
  errorThresholdPercentage: 50,  // open after 50% failure rate
  resetTimeout: 30000,     // try again after 30 seconds
  volumeThreshold: 5,      // minimum 5 calls before circuit can open
});

breaker.fallback(() => ({ status: 'payment-unavailable' }));

breaker.on('open', () => console.log('Circuit OPEN: payment service unavailable'));
breaker.on('halfOpen', () => console.log('Circuit testing recovery...'));
breaker.on('close', () => console.log('Circuit CLOSED: service recovered'));

Getting Started: A 90-Day Plan

Month 1 — Foundation

  • Audit your system’s failure assumptions. What happens if your payment API goes down? Your auth service? Your database?
  • Install LitmusChaos in staging Kubernetes cluster
  • Run your first experiment: pod-delete against a non-critical service
  • Verify that the service recovers automatically and alerts fire correctly

Month 2 — Expand

  • Run network latency experiments (50ms added latency to critical dependencies)
  • Test database failover in staging
  • Run first GameDay with engineering and on-call team
  • Add circuit breakers to services that failed experiments

Month 3 — Systematize

  • Integrate pod failure experiments into staging deploy pipeline
  • Document all experiments as code in a chaos repository
  • Schedule monthly GameDays as a calendar event
  • Track “chaos experiment coverage” as a reliability metric

Common Chaos Engineering Mistakes

Running chaos in production without preparation: Start in staging. Only run production experiments when you have confidence from staging and mature observability.

No stop conditions: Every experiment needs automated stop conditions. If your monitoring alarm triggers, the experiment should halt automatically.

Chaos without observability: You can’t learn from a chaos experiment if you can’t measure the impact. Set up dashboards and baseline metrics before injecting faults.

One-time experiments: Chaos engineering is continuous, not a one-time audit. Systems change; resilience assumptions need regular validation.


Chaos engineering is ultimately about changing your engineering culture from “we hope this won’t fail” to “we’ve verified this fails gracefully.” The tools make the practice accessible; the discipline makes it valuable.

Free Download

50 CLI Commands That Save Hours Every Week

The exact Git shortcuts, file search tricks, Docker commands, and productivity hacks that senior developers use daily. Compiled from 5+ years of shipping production code.

  • Git mastery (10 cmds)
  • File & search wizardry
  • Docker & DevOps tricks
  • Process & network tools
  • Productivity boosters
  • macOS & Linux install guide

No spam. 1 email/week max. Unsubscribe anytime.

Found this guide useful? Check out our free developer tools.