Chaos Mesh and Litmus: Chaos Engineering in Kubernetes

Chaos Mesh and Litmus: Chaos Engineering in Kubernetes

A zero-to-production guide to breaking your own systems on purpose, safely, so that real outages find you prepared: how Chaos Mesh and LitmusChaos work inside, how to design experiments, and how to run them without causing harm.

Think about a fire drill at a school. Nobody believes the school is about to burn down. The drill exists because on the day of a real fire, there is no time to discover that a door is locked, that the alarm is broken, or that nobody knows where to stand. A drill finds these problems on a calm Tuesday morning, when the cost of finding them is a few minutes of lost lessons, not a tragedy.

Chaos engineering is the fire drill for software. You deliberately cause small, controlled failures in a running system, such as killing a server, slowing down a network or filling a disk, and you watch what happens. If the system copes, you gain real evidence that it is resilient. If it does not, you have found a weakness cheaply, before your customers found it for you at the worst possible moment.

Kubernetes teams often believe their systems are resilient because Kubernetes restarts failed containers and spreads copies across machines. That is a good start, but it is not proof. Real systems fail in stranger ways: a dependency becomes slow rather than dead, a network link drops half its packets, a clock drifts, a disk fills up. Two open source tools, Chaos Mesh and LitmusChaos, bring controlled chaos into Kubernetes in a native way. This guide explains both from the very beginning. Every new word is explained when it first appears, every idea has an everyday comparison, and each chapter builds on the last. By the end you will understand how the tools work inside, how to design safe experiments, and how to build a lasting practice around them.

1Why Failure Is Normal in Distributed Systems

Before learning any tool, we need to accept an uncomfortable fact: in a large system, something is always broken. The question is whether anyone notices.

What a distributed system is

A distributed system is a program made of many smaller programs running on many computers that talk to each other over a network. A modern online shop is a good example. One service handles logins, another handles the product catalog, another handles the shopping cart, another handles payments, and so on. Kubernetes runs these services as containers spread across a cluster of machines.

Why things break

Each machine, disk and network cable has a small chance of failing. When you have thousands of them, small chances add up. If one machine fails once every three years, then in a fleet of 1,095 machines, you should expect about one failure every day. Beyond hardware, software has bugs, deployments go wrong, configuration is mistyped, certificates expire, and traffic spikes arrive without warning.

The famous false assumptions

Engineers at a large computer company once listed beliefs that newcomers to distributed systems tend to hold, and which cause painful surprises: the network is reliable, latency is zero, bandwidth is infinite, the network is secure, topology does not change, there is one administrator, transport cost is zero, and the network is the same everywhere. Every one of these is false, and every one can be tested by chaos experiments.

Failure is not always a clean stop

The worst failures are not the ones where a service dies. A dead service is easy to detect and easy to route around. The nasty ones are partial: a service answers, but ten times slower than usual. A network drops one packet in twenty. A disk accepts writes but takes seconds to confirm them. A clock jumps forward. These grey failures are exactly what ordinary tests miss, and what chaos tools simulate well.

Everyday Analogy

A bridge engineer does not assume that no truck will ever be overweight, no storm will ever hit, and no bolt will ever rust. The bridge is designed and tested for those events. Software systems deserve the same honesty: design as if parts will fail, because they will.

i
Key Idea

Resilience is not the absence of failure. It is the ability to keep serving users while parts are failing. You can only know you have it by testing it.

2A Short History and the Principles of Chaos Engineering

Chaos engineering did not begin as a tidy discipline. It began as a nervous experiment at a company that had just moved to the cloud.

Where it started

Around 2010, Netflix was moving from its own data centers to the cloud. In the cloud, machines can vanish at any time. To make sure its services could cope, engineers built a tool called Chaos Monkey that randomly terminated servers during working hours. The rule was simple: if a service could not survive losing a machine, better to find out when engineers were at their desks than during a holiday weekend. Chaos Monkey grew into a family of tools often called the Simian Army, each simulating a different kind of trouble. Other companies, including Amazon with its practice of “game days,” built similar habits.

The principles

In the mid-2010s the practice was written down as a set of principles, published as the Principles of Chaos Engineering. They are short and worth remembering:

Principle 1

Start with a steady state

Define what “working normally” looks like in measurable terms, such as orders per minute or the share of requests that succeed.

Principle 2

Form a hypothesis

State what you expect: “if we lose one database replica, the steady state will hold.”

Principle 3

Vary real-world events

Inject failures that actually happen: crashes, slow networks, full disks, bad deployments.

Principle 4

Run in production, eventually

Real traffic and real configuration behave differently from test setups. Start in safer environments and move toward production as confidence grows.

Principle 5

Automate

Experiments run continuously or on a schedule, not once a year.

Principle 6

Minimize the blast radius

Limit how many users and systems an experiment can affect, and be ready to stop it instantly.

What chaos engineering is not

  • It is not random destruction. Every experiment has a question, a plan, limits and a way to stop.
  • It is not a replacement for testing. Unit and integration tests check that code is correct. Chaos experiments check that a running system copes with a hostile world.
  • It is not only for giants. A team with three services and one cluster can learn a great deal from a single well-chosen experiment.
Everyday Analogy

A vaccine gives your body a small, controlled dose of a threat so the immune system learns to respond. Chaos engineering gives your system a small, controlled dose of failure so that people and software learn to respond, and you find the weak spots while the dose is still harmless.

3The Experiment Loop

Every chaos experiment, whatever tool you use, follows the same loop. Learn it once, and you can design experiments for any system.

flowchart LR
  A["Define steady state with metrics"] --> B["Write a hypothesis"]
  B --> C["Choose a fault and limit the blast radius"]
  C --> D["Set abort conditions"]
  D --> E["Inject the fault"]
  E --> F["Observe metrics and behavior"]
  F --> G{"Did steady state hold?"}
  G -->|"yes"| H["Gain confidence, widen the scope"]
  G -->|"no"| I["Found a weakness - stop and recover"]
  I --> J["Fix the weakness"]
  J --> K["Re-run to verify the fix"]
  H --> A
  K --> A
Figure 1: The chaos experiment loop

Step by step

1

Define the steady state

Pick a few numbers that show the system is healthy from the user’s point of view: success rate, response time, orders completed. Prefer business-level signals over machine-level ones.

2

State a hypothesis

Write a plain sentence: “When one of three cart Pods is killed, the success rate stays above 99.9 percent and response time stays below 300 milliseconds.”

3

Choose the fault and the scope

Start with the smallest fault that can test the hypothesis, on the smallest safe target, such as one Pod in a test namespace.

4

Set abort conditions

Decide in advance what result means “stop now,” such as success rate dropping below 98 percent. Automate the stop if you can.

5

Inject and observe

Run the experiment while watching dashboards, logs and traces. Note what happens, including surprises.

6

Learn and fix

If the hypothesis held, widen the scope or raise the severity. If it failed, write down why, fix the cause, and run again.

The value is in the hypothesis

Many beginners think the point of chaos engineering is the breaking. It is actually the predicting. Writing down what you expect forces the team to share assumptions, and the interesting results are the cases where reality disagrees with the prediction. A team that says “we have no idea what will happen” is not ready for the experiment, and a team that says “nothing will happen” is often wrong.

Everyday Analogy

A science experiment in school has the same structure: you form a hypothesis, set up a controlled test, change one thing, measure, and compare with your prediction. Chaos engineering is simply the scientific method applied to live software systems.

4A Map of Failures in Kubernetes

To design good experiments, you need to know what can fail. Here is a tour from the smallest piece to the whole region.

LayerExample failuresWhat a healthy system does
Container and PodProcess crash, out-of-memory kill, failing health check, Pod deletedKubernetes restarts or replaces it, and traffic moves to healthy copies
ApplicationSlow responses, error responses, bad data, memory leaksCallers use timeouts, retries and fallbacks
NodeMachine crash, node out of disk, node under heavy CPU load, node drained for maintenancePods are rescheduled; disruption rules keep enough copies running
NetworkAdded delay, dropped or duplicated packets, split between groups of Pods, limited bandwidthServices tolerate slowness; split-brain situations are handled safely
StorageSlow disk, disk full, read or write errors, data corruptionThe application degrades gracefully and alerts fire early
TimeClock skew or jumpsCertificates, tokens, caches and schedules behave sensibly
DNS and discoveryName lookups fail or return wrong answersClients retry and cache sensibly
Control planeAPI server slow or unavailable, scheduler or controller delaysRunning workloads continue; autoscaling degrades gently
DependencyA database, queue, cache or third-party API is slow or downCircuit breakers, queues and caches absorb the shock
Zone or regionAn entire data center or cloud zone is lostCapacity in other zones takes over without human action

What Kubernetes protects you from, and what it does not

Kubernetes automatically handles the first rows of this table. If a Pod dies, a replacement starts. If a node fails, Pods move. That is why simple “kill a Pod” experiments often pass, which is reassuring but not very informative. The higher rows are where applications are weak, and where Kubernetes cannot help, since it does not know what your application considers healthy. Slow networks, slow dependencies and partial failures are where chaos experiments earn their keep.

!
Common Trap

Teams often declare victory after killing Pods, since Kubernetes restarts them. They then meet their first real outage in the form of a slow database, and nothing in their experience prepared them. Include latency and partial failure in your plans from the start.

5Blast Radius, Safety and Abort Conditions

The strongest objection to chaos engineering is fear: “what if the experiment causes a real outage?” Good practice answers this fear with careful limits.

Blast radius

The blast radius is the amount of the system, and the number of users, that an experiment can affect. You control it in several ways:

  • Scope of targets. Choose one Pod, not a whole Deployment. Choose one namespace, not the cluster.
  • Percentage of traffic. Affect a small share of requests, such as a canary group, before affecting all of them.
  • Duration. Run for thirty seconds, not thirty minutes. Tools in this guide support automatic recovery when the duration ends.
  • Severity. Add 100 milliseconds of delay before adding five seconds. Fill a disk to 70 percent before 100 percent.
  • Environment. Begin in a development cluster, then staging, then a small slice of production.

Abort conditions and the big red button

Before every experiment, agree on measurable signals that mean “stop now,” and make stopping easy. With both tools in this guide, deleting or pausing the experiment object recovers the fault, and you can wire monitoring alerts to do this automatically. Everyone involved should know who has the authority to stop an experiment and how.

Prerequisites before any experiment

Check 1

Monitoring works

You can see the steady-state metrics in real time. If you cannot observe the system, you cannot run an experiment on it.

Check 2

Someone is on call

People who can fix problems are present and aware, not asleep or away.

Check 3

Backups exist

For experiments touching data, a recent and tested backup is available.

Check 4

Stakeholders know

Support, product and neighboring teams are told, so they do not mistake the experiment for a real incident.

Check 5

Rollback is rehearsed

You have practiced stopping the experiment and restoring normal service.

Check 6

Known weaknesses are fixed first

Do not run an experiment whose outcome you already know will be a failure. Fix the known problem, then test the fix.

Everyday Analogy

Fire drills at schools are announced to teachers, held at a planned time, supervised by adults who know the building, and stopped immediately if a child is hurt. Nobody pulls the alarm at random during an exam. Safe chaos experiments carry the same preparation.

i
Tip

Tie your abort conditions to your service level objectives. If your promise to customers is 99.9 percent availability, an experiment that threatens that promise should stop itself. The error budget, the amount of failure your promise allows, is also the natural budget for chaos.

6Chaos Mesh: Overview and Philosophy

Now we meet the first of our two tools. Chaos Mesh brings a large, ready-made set of faults to Kubernetes and treats them like any other Kubernetes object.

Where it comes from

Chaos Mesh was created by PingCAP, the company behind the TiDB distributed database. The engineers there needed to test a database that must stay correct under every kind of failure, and built a toolkit for it. They released it as open source and donated it to the Cloud Native Computing Foundation (CNCF), where it is a hosted project at the incubating level. It runs on Kubernetes and is designed so that you describe an experiment in a configuration file and apply it, exactly as you would a Deployment.

The core idea: faults as Kubernetes objects

In Chaos Mesh, each kind of fault is a custom resource, a new type of Kubernetes object. There is a type for killing Pods, a type for network trouble, a type for disk trouble, a type for CPU and memory stress, and more. To start an experiment you create an object of the right type, saying what to break, where and for how long. To stop it, you delete the object. Everything fits the tools and habits teams already use: version control, code review and automation.

Why teams choose it

Breadth

Many fault types

Pod, network, disk, CPU, memory, time, DNS, HTTP, kernel and Java faults, plus cloud and physical machine faults.

Native

Kubernetes-first

Experiments are custom resources. No separate language or agent protocol to learn.

Visual

Dashboard

A web interface lets you create, run and watch experiments without writing configuration.

Automation

Schedules and workflows

Run experiments repeatedly on a cron schedule, or chain them into orchestrated scenarios.

No code changes

Application unaware

Faults are injected from outside, so you do not need to modify or rebuild your application.

Safety

Scoping controls

Namespace filters and annotation-based opt-in limit what can be targeted.

Everyday Analogy

Chaos Mesh is like a well-equipped testing laboratory for a car maker. It has a table with a drop test, a wind tunnel, a heat chamber and a vibration rig. You tell the lab technician which test to run on which car, for how long, and you collect the results. You do not have to build the test rigs yourself.

i
Good to Know

Feature lists and supported versions change as projects evolve. Treat the fault types in this guide as the stable core, and check the current documentation for newer additions and for support on your Kubernetes version and container runtime.

7Chaos Mesh Architecture

Chaos Mesh is made of three main programs. Understanding their roles tells you where things can go wrong and what permissions they need.

flowchart TB
  subgraph Users["Users and Automation"]
    ENG["Engineer or pipeline"]
    UI["Chaos Dashboard in browser"]
  end
  subgraph CM["chaos-mesh namespace"]
    DASH["chaos-dashboard - UI and API"]
    CTRL["chaos-controller-manager - controllers and webhooks"]
    DAE1["chaos-daemon on node 1"]
    DAE2["chaos-daemon on node 2"]
  end
  subgraph K8S["Kubernetes control plane"]
    API["API Server"]
  end
  subgraph N1["Node 1"]
    P1["Target Pod A"]
  end
  subgraph N2["Node 2"]
    P2["Target Pod B"]
  end
  ENG -->|"apply chaos object"| API
  UI --> DASH
  DASH -->|"create objects"| API
  API -->|"watch events"| CTRL
  CTRL -->|"gRPC request"| DAE1
  CTRL -->|"gRPC request"| DAE2
  DAE1 -->|"inject fault into namespaces and cgroups"| P1
  DAE2 -->|"inject fault into namespaces and cgroups"| P2
  CTRL -->|"update status"| API
Figure 2: Chaos Mesh components and how a fault travels from a request to a target

The three main components

ComponentHow it runsWhat it does
Controller managerA Deployment, usually with several replicas and leader electionWatches chaos objects, decides which Pods or nodes match, schedules start and stop times, calls the daemons, updates status, and hosts the admission webhooks.
Chaos daemonA DaemonSet, one Pod per node, with high privilegesDoes the actual fault injection on its node by entering the target container’s Linux namespaces and control groups, through the container runtime.
DashboardA Deployment with a web interface and APILets people create and monitor experiments, view history and manage workflows without writing files by hand.

Why a privileged daemon?

Many faults need deep access to the machine. To add network delay inside a Pod, the daemon must enter that Pod’s network namespace and change its traffic rules. To stress CPU inside a container, it must run a process inside that container’s control group. These actions need elevated privileges on the node. This is the biggest security consideration of Chaos Mesh, and we cover it in Chapter 24.

Container runtime connection

The daemon finds the target container through the container runtime, such as containerd or CRI-O, using a socket on the node. Installation therefore asks you to tell Chaos Mesh which runtime and socket path your cluster uses. A wrong setting is a classic reason for experiments that never take effect.

Admission webhooks

The controller manager also runs webhooks. Some validate experiment objects, rejecting invalid ones with clear errors. One mutates Pods when needed, for example to add a helper sidecar for file system faults. These need valid certificates, which the installation sets up.

Everyday Analogy

The controller manager is the test manager at the car laboratory who reads the work order and decides what to do. The daemons are the technicians stationed at every test bay with the keys to every test rig. The dashboard is the front desk, where visitors can submit work orders and watch the progress screens.

8Chaos Mesh Fault Types

This is the menu of failures Chaos Mesh can serve. Each is a separate custom resource with its own set of actions.

Fault typeWhat it simulatesTypical actions
PodChaosPods and containers failingKill a Pod, make a Pod unavailable by replacing its image with a broken one for a while, kill a specific container
NetworkChaosNetwork problemsAdd delay, drop packets, duplicate packets, corrupt packets, limit bandwidth, partition groups of Pods from each other
IOChaosDisk and file system problemsAdd latency to file operations, return errors, change file attributes, or corrupt the data read
StressChaosResource exhaustionBurn CPU or consume memory inside a container
TimeChaosClock skewShift the time seen by processes in a container
KernelChaosKernel-level failuresMake selected system calls or memory allocations fail, using kernel tracing facilities
DNSChaosName lookup problemsReturn errors or random answers for matching domain names
HTTPChaosWeb protocol problemsDelay or abort HTTP requests and responses, change status codes or bodies, match by path or method
JVMChaosFaults in Java programsThrow exceptions from named methods, add latency to methods, stress the garbage collector
Cloud chaos kindsFailures in cloud accountsStop or restart virtual machines, detach disks on supported cloud providers
PhysicalMachineChaosFailures on machines outside KubernetesNetwork, process and disk faults on hosts reached through an agent

Starter experiments that teach a lot

  • Kill one Pod of a Deployment. Checks that traffic moves, replacements start quickly and no data is lost.
  • Add 300 milliseconds of delay between a service and its database. Reveals missing timeouts and slow-query cascades.
  • Partition two groups of Pods. Tests how clustered software behaves when members cannot talk to each other.
  • Stress CPU in a container. Shows whether autoscaling reacts and whether limits protect neighbors.
  • Return errors from DNS. Shows whether clients cache, retry, or crash.
  • Shift the clock forward. Finds certificate and token handling problems.
Everyday Analogy

Think of the fault types as the settings on a flight simulator for pilots: engine failure, strong crosswind, fog, instrument failure, radio silence. A good training program mixes them and raises the difficulty step by step, not by flipping every switch at once.

!
Common Trap

Some fault types depend on kernel features, runtime support or special images, and may not work on every cluster. KernelChaos in particular needs particular kernel configuration. Always test a new fault type in a safe environment before building plans that depend on it.

9How Chaos Mesh Injects Faults Inside

The faults can seem like magic. In truth, they use a handful of well-known Linux features. Knowing them helps you predict what an experiment will and will not do.

Linux building blocks

Containers on Linux are ordinary processes, wrapped in two features. Namespaces give a process its own private view of things like the network, process list and file system. Control groups, or cgroups, limit how much CPU and memory a group of processes may use. Chaos Mesh’s daemon works by stepping into these same wrappers and changing things from inside.

Network faults

For delay, loss, duplication and bandwidth limits, the daemon uses the Linux traffic control facility inside the target Pod’s network namespace. Traffic control can place rules on outgoing network traffic that wait, drop or shape packets. To restrict the fault to specific destinations, such as only traffic to the database, the daemon uses packet-filtering rules and address sets. Partitions are built with firewall rules that drop packets between the chosen groups.

Pod faults

The simplest fault is a Pod kill, done through the Kubernetes API, as if an administrator had deleted the Pod. A container kill sends a signal to a specific container through the runtime. The “Pod failure” action works differently: it swaps the image of the containers for a deliberately broken placeholder for the duration, then restores them.

Stress faults

For CPU and memory stress, the daemon starts a stress-generating process inside the target container’s control group. Because it shares the container’s limits, the stress competes with your real application for the very resources the container is allowed to use. That is exactly what a noisy neighbor or a runaway thread would do.

Disk faults

IOChaos works by interposing on file access. Chaos Mesh injects a helper sidecar into the target Pod through a mutating webhook, and uses a user-space file system to intercept reads and writes to the chosen paths. The interception can then delay or fail the operations. This is why IO experiments require the sidecar to be present before the application starts using the files.

Time, DNS and HTTP faults

  • Time: the daemon modifies how the target process obtains the current time, so the process sees a shifted clock while the rest of the machine does not.
  • DNS: a special DNS server is deployed. Faults are applied by configuring cluster DNS to consult it for matching names.
  • HTTP: the daemon redirects the Pod’s traffic through a transparent proxy that can modify, delay or abort messages that match the rule.

Recovery

Every injection has a matching recovery step, which the controller triggers when the duration ends, when the object is paused or when it is deleted. If the controller is down at that moment, the fault can persist until the controller returns, one reason that high availability of the chaos tools themselves matters. We return to this in Chapter 26.

Everyday Analogy

Imagine the technician slipping into a room through a back door to dim the lights, mute the phones and switch off one air conditioner, while the people inside carry on working. When the test ends, the technician returns and puts every switch back. The people inside never changed their behavior, but they felt every change.

10Chaos Mesh: Choosing Targets, Modes, Duration and Schedules

An experiment object answers four questions: what to break, how much of it, for how long, and how often. These settings are your main safety controls.

Selectors: what to break

A selector describes which Pods, or nodes, are eligible. You combine several filters, and only targets that match all of them are chosen:

Namespace

Where

Limit to one or more named namespaces, such as a staging area. Always set this.

Labels

Which application

Match by the labels you already use on Pods, such as the app name and tier.

Expressions

Flexible matching

Use set-based rules like “label environment is in staging or test.”

Fields and annotations

Finer filters

Select by Pod fields such as the node it runs on, or by annotations you added for opt-in.

Phase

Pod state

Choose only running Pods, so that experiments do not waste effort on Pods that are not serving.

Explicit list

Named Pods

Pick exact Pods by name when you want a precise, repeatable target.

Modes: how much of it

ModeMeaningWhen to use it
OnePick one random matching PodFirst experiments, and the safest default
FixedPick a specific number of PodsWhen you know you want exactly two out of five
Fixed percentPick a percentage of matching PodsTo keep tests meaningful as fleet sizes change
Random max percentPick a random number up to a percentageTo simulate varied real-world loss
AllEvery matching PodRare; for partition tests or full dependency outages, with great care

Duration: for how long

Most fault types accept a duration. When the time is up, the controller removes the fault automatically. This is a vital safety net: even if you forget about the experiment, or the person who started it goes home, the system recovers by itself. Keep durations short at first, and extend them only when you understand the behavior.

Direction and targets for network faults

Network experiments add two more ideas. The direction says whether the fault applies to traffic leaving the Pod, entering it or both. The external target, or “to” group, narrows the fault to traffic going to particular Pods, addresses or domain names. For example, “add delay only to traffic from the cart service to the payments service” lets the rest of the system carry on normally and gives a very precise test.

Schedules: how often

A Schedule is another custom resource that wraps any fault type with a cron-style timetable, for example “every weekday at 11 a.m.” It also holds rules for history, which keeps a limited number of past runs, and for concurrency, which decides whether a new run may start while the previous one is still active. Scheduling turns chaos from a rare event into a steady habit.

Everyday Analogy

Think of dialing a dimmer switch. The selector picks which room, the mode picks how many lights, the duration is a timer that turns them back up automatically, and the schedule is the weekly routine. You can make the test as gentle or as harsh as you like, and a timer protects you from forgetting.

i
Tip

Make “one Pod, one namespace, short duration” your default template. Anyone wanting a bigger experiment has to say so explicitly, and a reviewer can ask why.

11Chaos Mesh Workflows, Status Checks and the Dashboard

Real outages are rarely a single event. Workflows let you build realistic scenarios from several steps.

Workflows: scenarios made of steps

A Chaos Mesh Workflow is a custom resource that describes a whole scenario as a graph of steps, much like a recipe. The step types are:

  • Chaos steps that run a fault, such as a network delay.
  • Serial steps that run their children one after another.
  • Parallel steps that run their children at the same time.
  • Suspend steps that wait for a fixed time, to let the system settle between faults.
  • Task steps that run a container, for example a script that sends test traffic or checks a result.
  • Status check steps that probe a target and fail the workflow if the system is unhealthy.

A scenario in words

Imagine you want to test the loss of a database replica during a traffic peak. The workflow could say: first start a load generator as a task. In parallel, wait two minutes, then kill one database Pod. After that, add 200 milliseconds of delay between the application and the remaining database for three minutes. Throughout, run a status check against the application’s health endpoint every ten seconds, and abort the whole workflow if two checks fail in a row. Such a scenario would be hard and risky to run by hand and is easy to repeat as a workflow.

Status checks as automatic guards

The status check feature lets an experiment test the health of the system itself. It can call an HTTP endpoint at an interval and judge success by the response. Used inside a workflow, it works as an abort condition. Used alongside a schedule, it can run as a “steady state verifier” that decides whether a scheduled experiment may run at all.

The dashboard

The dashboard offers a form-based way to create experiments and view their status, events and history. It is friendly for beginners and for game days, where a facilitator wants to start and stop faults while people watch. It can also create workflows through a visual editor. For long-term use, many teams save the generated definitions into version control and apply them through automation, so the dashboard remains a helper and not the source of truth.

Controlling who can do what

Because chaos can hurt, access must be controlled. The dashboard supports token-based access tied to Kubernetes RBAC, so a user can only create experiments in namespaces where their own account has permission. Configure this carefully, and do not expose the dashboard to the open internet. Chapter 24 covers governance in detail.

Everyday Analogy

A single fault is like a single exercise in a fire drill: “everyone out of the building.” A workflow is the whole rehearsal: alarm sounds, the lights flicker, one exit is blocked, people re-route, and an observer with a clipboard checks whether anyone is left behind. Status checks are the observer.

!
Common Trap

Workflows are powerful, and long ones can leave faults active if they are interrupted or if the controller restarts. Give every chaos step a duration, add an overall deadline to the workflow, and test the abort path before trusting the workflow in an important environment.

12LitmusChaos: Overview and Philosophy

Now we turn to the second tool. Litmus takes a different route to the same goal, with a strong focus on shared experiments, platform features and measuring resilience.

Where it comes from

LitmusChaos was created by the team at MayaData, the company behind the OpenEBS storage project, because they wanted to test storage systems on Kubernetes. It joined the CNCF as a sandbox project in 2020 and later advanced to the incubating level. A company called Harness later took over the commercial work around it, and builds its chaos engineering product on Litmus, while the open source project continues in the CNCF.

The core idea: chaos as a shared, reusable catalog

Litmus organizes chaos into three kinds of objects and a public catalog. Experiments are the recipes: reusable definitions of a fault and how to run it. Engines connect an experiment to a particular application. Results record what happened. A public catalog called the ChaosHub holds dozens of ready-made experiments that you can pull into your own cluster. This catalog-and-engine structure grew from the idea that chaos tests should be a library that the whole community shares and improves.

Beyond injecting faults: judging the outcome

A defining feature of Litmus is that an experiment does not only cause trouble, it also checks whether the system coped. Experiments can include probes, small checks that run before, during or after the fault and decide the verdict. If the website kept answering with correct pages during the fault, the experiment passes. If not, it fails. This built-in judgment turns an experiment into an automated test that can run in a pipeline without a person watching.

Why teams choose it

Catalog

ChaosHub

A growing library of experiments for Kubernetes, cloud providers and common applications.

Verdicts

Probes

Automatic checks that decide pass or fail, so experiments act as tests.

Platform

ChaosCenter

A web portal and control plane for managing experiments across many clusters, teams and projects.

Score

Resilience score

A single number summarizing how well a set of experiments passed, useful for tracking progress.

GitOps

Declarative and API-driven

Everything is defined in Kubernetes objects and can be driven through an API and a command-line tool.

Pipelines

CI/CD fit

Designed to be called from build and release pipelines as automated resilience checks.

Everyday Analogy

If Chaos Mesh is a laboratory with many test rigs, Litmus is more like a public library of tested lab procedures with an examiner attached. You borrow a procedure, point it at your equipment, run it, and the examiner marks it pass or fail according to the criteria you set.

i
Good to Know

Litmus has gone through major redesigns of its platform between its 1.x, 2.x and 3.x generations, and the exact component names changed. The ideas in this guide, the three objects, probes and the catalog, are stable. Check the documentation for your version when you install.

13Litmus Architecture

Litmus splits its parts between a control plane that you use to plan and watch, and an agent side that runs inside each target cluster.

flowchart TB
  subgraph CC["ChaosCenter - control plane"]
    FE["Web portal"]
    GQL["GraphQL server"]
    AUTH["Authentication server"]
    DB[("Database")]
  end
  subgraph TC["Target cluster - chaos infrastructure"]
    SUB["Subscriber"]
    OP["Chaos operator"]
    RUN["Chaos runner"]
    EXP["Experiment job"]
    HELP["Helper pods when needed"]
    EXPT["Chaos exporter - metrics"]
    APP["Target application"]
  end
  HUB["ChaosHub - experiment catalog"]
  PROM["Prometheus"]
  FE --> GQL
  GQL --> AUTH
  GQL --> DB
  GQL |"secure connection"| SUB
  HUB -->|"experiment definitions"| GQL
  SUB -->|"create engine objects"| OP
  OP -->|"starts"| RUN
  RUN -->|"creates"| EXP
  EXP --> HELP
  EXP -->|"inject fault"| APP
  HELP -->|"inject fault"| APP
  EXPT -->|"results as metrics"| PROM
Figure 3: Litmus control plane and chaos infrastructure in a target cluster

The control plane: ChaosCenter

ChaosCenter is the part you log into. It contains a web portal, a server exposing a GraphQL interface, an authentication service for users and projects, and a database that stores experiment definitions, schedules, results and user accounts. It can run in one cluster and manage experiments in many others, which suits organizations with many clusters and teams.

The chaos infrastructure in each target cluster

PartRole
SubscriberKeeps a secure connection to the control plane, receives instructions such as “run this experiment now,” and reports status back. The connection is outbound from the cluster, so the control plane does not need to reach into it.
Chaos operatorA Kubernetes operator that watches ChaosEngine objects and starts the work they describe.
Chaos runnerA short-lived Pod created for each engine, which prepares and launches each experiment, and collects results.
Experiment jobThe Pod that actually carries out the fault logic and the probes for one experiment.
Helper PodsExtra Pods with higher privileges, started on the target’s node for faults that need deep access, such as network or stress faults.
Chaos exporterPublishes experiment results and status as Prometheus metrics, so dashboards can overlay them on application graphs.
Workflow componentsIn several versions, a workflow engine based on Argo Workflows runs multi-experiment scenarios.

Standalone use

You do not have to use the portal. The operator and the custom resources work on their own. Teams can install only the operator, pull experiments from the hub, apply an engine and read the result, entirely with kubectl and pipeline tools. The portal adds convenience, multi-cluster control and team features.

Everyday Analogy

The control plane is like head office, with the planners, the records and the staff directory. The chaos infrastructure in each cluster is like the field team at a branch. Head office sends work orders to branches over a secure line, and each branch reports back. A branch can also work independently with its own copy of the procedures.

14Litmus Custom Resources and the ChaosHub

Three objects tell the whole story of a Litmus experiment. Learn them, and you can read any Litmus configuration.

ChaosExperiment: the recipe

A ChaosExperiment is a reusable definition of one kind of fault. It names the container image that carries out the fault, the permissions needed, the default settings, and the list of adjustable values. Examples include deleting Pods, killing containers, adding network latency, burning CPU, draining a node or filling a disk. Experiments do not point at any application; they are general recipes.

ChaosEngine: the plan for one application

A ChaosEngine connects one application to one or more experiments. It holds:

  • Application information: the namespace, the label and the kind of workload to target, such as a Deployment.
  • The experiments to run and any overrides of their default values, such as the total duration, the interval between hits, the share of Pods affected, or the container to target.
  • The service account that grants the experiment the rights it needs, and nothing more.
  • Engine state: active, which lets it run, or stopped, which halts it.
  • Clean-up policy: whether to keep or delete the experiment Pods after completion.
  • Annotation check: an optional safety, requiring that the target workload carries an opt-in annotation before it can be touched.

ChaosResult: the verdict

A ChaosResult is created for each experiment in an engine. It records the verdict, the probe outcomes and the run history. The verdicts are:

Awaited

In progress

The experiment is still running, or has not yet produced a final answer.

Pass

Resilient

The fault was injected and every probe succeeded, so the application coped.

Fail

Weakness found

The fault ran but a probe failed, or the experiment could not complete as designed.

Stopped

Aborted

The experiment was stopped early, by a user or an abort condition.

The ChaosHub

The ChaosHub is a public Git repository of experiment definitions, grouped by category. There are generic Kubernetes experiments, ones for specific cloud providers, and ones for popular applications such as databases and message brokers. You can connect the portal to the public hub or to your own private hub, where your team curates its experiments. A private hub is a good way to share approved, well-tested experiments inside a company and to prevent people from running untested ones.

How the pieces relate

ObjectAnalogyCreated byLives
ChaosExperimentA recipe in a cookbookPulled from the hub or written by your teamLong
ChaosEngineA work order: cook this recipe for this tableYou, or the portal, for each applicationPer run or per schedule
ChaosResultThe tasting notes and scoreThe experiment itself, automaticallyKept for history
i
Tip

Always use the annotation check in shared clusters. It means a workload must say “yes, you may test me” before any engine can touch it. It is a cheap and powerful protection against a mistyped label hitting the wrong application.

15The Life of a Litmus Experiment

Let us follow one experiment from the moment you start it until the verdict is written.

sequenceDiagram
  autonumber
  participant U as User or Pipeline
  participant API as Kubernetes API
  participant OP as Chaos Operator
  participant RUN as Chaos Runner
  participant EXP as Experiment Pod
  participant APP as Target Application
  U->>API: Create ChaosEngine with state active
  API-->>OP: Engine event
  OP->>API: Validate target and permissions
  OP->>RUN: Launch chaos runner
  RUN->>API: Read ChaosExperiment definition
  RUN->>EXP: Create experiment job
  EXP->>APP: Run pre-chaos probes
  EXP->>APP: Inject fault for the chosen duration
  EXP->>APP: Run probes during chaos
  EXP->>APP: Remove fault and wait for recovery
  EXP->>APP: Run post-chaos probes
  EXP->>API: Write ChaosResult with verdict
  RUN->>API: Update engine status
  API-->>U: Read result and verdict
Figure 4: The lifecycle of a Litmus experiment

Step by step

1

Create the engine

You apply a ChaosEngine in the active state, or the portal does so when a schedule fires.

2

Operator checks

The operator confirms that the target application exists, that the required annotation is present if enabled, and that the service account has the needed rights.

3

Runner starts

A runner Pod is created. It reads the experiment definition and builds the job with your overrides applied.

4

Pre-chaos checks

The experiment verifies the application is healthy before touching it. If not, it refuses to proceed. Chaos on an already sick system teaches nothing.

5

Injection

The fault is applied for the configured duration, perhaps repeatedly at set intervals, such as deleting a Pod every ten seconds for a minute.

6

Probes judge

Probes run before, during and after the fault, according to how each is configured.

7

Recovery and verdict

The fault is removed, post-chaos checks confirm the application returned to health, and the ChaosResult records the verdict.

8

Clean-up

According to the clean-up policy, experiment Pods are removed or kept for inspection.

Stopping an experiment

To stop a running experiment, set the engine state to stopped or delete the engine. The operator then tells the experiment to abort and revert the fault. Experiments are written to clean up after themselves when interrupted, but you should still rehearse stopping, since it is the move that matters most when something goes wrong.

Everyday Analogy

A driving test follows this exact shape. The examiner first checks that your car is roadworthy (pre-chaos check), then asks you to handle a hazard (injection), watches your reactions (probes), and finally gives the verdict (result). If the car were already faulty at the start, the test would be stopped, since it would not measure your driving at all.

16Probes and the Resilience Score

Probes are what turn Litmus experiments into automated tests. They answer the question “was the system fine while we hurt it?”

What a probe is

A probe is a small check that runs as part of an experiment. It tests some aspect of the steady state, and its result contributes to the final verdict. A good experiment has probes that mirror what users care about, not only that the Pod came back.

The probe types

ProbeWhat it checksExample
HTTP probeCalls a web address and checks the response code or contentThe checkout page returns success within one second
Command probeRuns a command and compares its outputA script confirms the database accepts writes
Kubernetes probeReads or lists Kubernetes objects and checks a conditionThree Pods of the cart service are ready
Prometheus probeRuns a monitoring query and compares the result to a thresholdThe error rate stays below one percent

Probe modes: when to run

Start

Start of test

Runs once before the fault, confirming the system is healthy to begin with.

End

End of test

Runs once after the fault ends, confirming the system returned to normal.

Edge

Both ends

Runs before and after, so a system that was healthy and is healthy again passes.

Continuous

Throughout

Runs repeatedly at an interval for the whole experiment, catching brief outages.

During

Only during chaos

Runs only while the fault is active, to examine behavior under stress.

Tuning a probe

Probes have settings for how long to wait for each attempt, how many times to try, how long to pause between attempts, and whether to stop the whole experiment at the first failure. Set these thoughtfully. A probe with a too-short timeout fails for harmless reasons, and a probe that retries ten times may hide a real problem. Choose settings that match your service goals.

The resilience score

When you run several experiments together as a workflow, ChaosCenter combines their outcomes into a resilience score between 0 and 100. Each experiment can be given a weight showing its importance, and the score reflects how many probes passed, weighted accordingly. A score is a handy way to compare services, track improvement over time and set targets, for example “every critical service must score at least 90 before release.” Keep in mind that a score is only as meaningful as the experiments and probes behind it. A perfect score from weak experiments is false comfort.

Everyday Analogy

Probes are the examiner’s checklist during a driving test: stayed in lane, signaled, kept safe distance. The resilience score is the total mark on the certificate. A learner might pass an easy test with full marks and still fail on real roads, so the difficulty of the test matters as much as the mark.

!
Common Trap

Many people run Pod-delete experiments with no probes and read the result as “pass” because the experiment finished. Without probes that reflect user experience, a pass only means the tool ran, not that your service stayed healthy.

17The Litmus Experiment Catalog and Workflows

The catalog is large. This chapter shows its main families and how to combine experiments into realistic scenarios.

Main experiment families

FamilyExamplesWhat they reveal
Pod-levelDelete a Pod, kill a container, stress CPU, hog memory, fill disk, add network latency, loss, duplication or corruption, partition a Pod from the network, fault DNS or HTTPRestart behavior, timeouts, retries and graceful degradation
Node-levelDrain a node, cordon it, restart a node, stress node CPU, memory or disk, stop the kubeletRescheduling, disruption budgets, capacity headroom
Cloud providerStop instances, detach volumes, disrupt load balancers or databases on major cloudsDependence on specific cloud resources
Application-specificFaults against popular databases, brokers and platformsBehavior of stateful systems under tailored failures
PlatformFaults against infrastructure components such as the control planeCluster-level fragility

Common tuning values

Most experiments accept the same few settings. The total chaos duration sets how long the fault is active. The chaos interval sets the gap between repeated hits within that time. A force option decides whether Pods are deleted gracefully or immediately. A percentage setting decides what share of eligible Pods is affected. A target container setting narrows the fault to one container inside a Pod, which is wise when a Pod has sidecars you do not want to disturb.

Workflows: combining experiments

ChaosCenter lets you build workflows, series and groups of experiments with weights, schedules and shared settings. A typical workflow might run a Pod-delete experiment, then network latency, then a CPU stress test, one after another, and compute a resilience score at the end. Because workflows are saved definitions, they can be scheduled, copied between projects, versioned and shared.

Use Case: A pre-release resilience gate

A team runs a three-experiment workflow against its staging environment after every release candidate: kill a cart Pod under load, add 300 milliseconds of delay to the payment dependency, and drain one node. Each experiment has probes on the checkout success rate and response time. The pipeline reads the resilience score and refuses to promote the release if it falls below 90. Over two quarters, the team found and fixed four weaknesses before they reached production.

i
Tip

Start with a handful of well-chosen experiments, not the whole catalog. Four experiments with strong probes teach more than forty experiments that nobody reads. Add new ones when a real incident or a design review suggests a gap.

18Chaos Mesh and Litmus Side by Side

Both tools break things on purpose, safely. They differ in style, and the right choice depends on your team, not on a winner.

The short comparison

QuestionChaos MeshLitmusChaos
Core ideaOne custom resource per fault type, applied directlyA catalog of experiments, connected to applications by engines
Strongest fitDeep, fine-grained fault injection, especially network, IO, time and JVM faultsExperiments as automated tests, with probes, scores and team features
Judging outcomesMostly left to you, using status checks, monitoring and workflowsBuilt in through probes, verdicts and a resilience score
ScenariosWorkflows with serial, parallel, suspend, task and status check stepsWorkflows of weighted experiments, with scores
PortalDashboard for creating and viewing experimentsChaosCenter with projects, users, hubs, schedules and analytics
PrivilegesA privileged daemon on each nodeExperiment and helper Pods created per run, with narrower permissions per experiment
Sharing recipesManifests in your own repositoryChaosHub, public or private
Beyond KubernetesPhysical machine and cloud chaos availableCloud, virtual machine and application experiments in the catalog
Learning curveGentle for single faultsA few more concepts to learn, but they pay off in automation

Different shapes of safety

Chaos Mesh keeps a long-running privileged daemon on every node, which is always ready, so faults begin quickly, but that daemon is a powerful component you must guard well. Litmus tends to start short-lived Pods with specific rights for each experiment, which narrows what exists at any time but adds a little startup delay and more moving parts to understand.

How to choose

  • If you want to explore many kinds of low-level faults quickly, and you already have strong monitoring, Chaos Mesh is a natural start.
  • If you want automated pass-or-fail checks in release pipelines and shared, reviewed experiments, Litmus is a natural start.
  • If you run many clusters and many teams, the project and hub features of Litmus help with organization, and the namespace-scoped controls of Chaos Mesh help with isolation. Evaluate both against your governance needs.
  • If you are unsure, run a small pilot with each on a test cluster for a week, using the same simple question, and see which one your team understands faster.

Using both

Some organizations use both, with Litmus as the pipeline gate and Chaos Mesh for deep exploration during game days. This is allowed, but it doubles the amount of cluster-wide machinery, so make sure you have the people to look after both. Pick one for your first year if you are small.

Everyday Analogy

Choosing between them is like choosing between a well-stocked workshop and a certified inspection service. The workshop lets you try many things with fine tools, and you decide what counts as good. The inspection service gives you a checklist and a certificate. A serious factory might use both, but a small shop starts with whichever matches its immediate need.

i
Good to Know

Features change quickly in both projects. Treat the table above as the general character of each tool, and confirm particular features against the version you plan to install.

19Preparing a Cluster for Chaos

Before you install anything, make sure the cluster is ready to be hurt without hurting people. A few preparations matter more than any tool setting.

A safe first environment

Begin in a cluster that mirrors production in structure but not in importance. It should run the same kinds of workloads, with the same settings for replicas, probes, limits and policies, but with test traffic only. The closer the match, the more your findings transfer to production. A tiny single-node playground teaches you the tool but not your system.

The readiness checklist

1

Know your runtime

Check which container runtime your nodes use, since the node-level agent needs to find containers through the runtime’s socket. Both tools support the common runtimes, but the socket path and settings differ and must be set correctly.

2

Have working monitoring

You need graphs of request rate, errors, latency and Pod health before the first test. Without them you are blind.

3

Add health probes and limits

Workloads should declare readiness and liveness checks, and resource requests and limits. Experiments will otherwise measure missing basics, not subtle weaknesses.

4

Set disruption budgets

Add PodDisruptionBudgets for important services. Node drain experiments respect them, so they test whether your budgets are sensible.

5

Label the opt-in targets

Decide which namespaces and workloads may be tested, and mark them. Everything else is protected.

6

Agree on a stop word

Choose the person or rule that can stop all experiments instantly and make sure everyone knows how.

7

Warn the neighbors

Tell the on-call team and anyone who shares the cluster when experiments will run. Surprise is for the system, not for people.

Installation in plain terms

Both tools are installed through their official Helm charts or manifests. The installation creates the custom resource definitions, the controller or operator, and the node-level or per-run components, plus the dashboard or portal. Put the tool in its own namespace, pin a specific version instead of “latest,” and read the release notes before upgrading, since custom resource formats occasionally change between versions. Keep the install settings in version control so that the cluster setup can be reproduced.

Minimizing the footprint

Install only what you need. Many Chaos Mesh features are optional, and you may switch off fault types you do not plan to use, which reduces the attack surface. For Litmus, install only the experiments from the hub that you will really run. A smaller catalog is easier to review and safer to hand to colleagues.

Everyday Analogy

Preparing the cluster is like preparing a building before a fire drill. You check that the exits are marked, the alarms work, the safety officers are in place and the neighbors know a drill is coming. You do not begin by setting off smoke in the busiest corridor.

!
Common Trap

Running chaos on a cluster that has no monitoring is the most common mistake of beginners. The experiment may well reveal a weakness, but nobody will see it, and the team will conclude that chaos engineering “does nothing.”

20Seeing Chaos: Observability During Experiments

An experiment is only as useful as your ability to see its effects. Observability turns a fault into a lesson.

The three signals

Metrics

Numbers over time

Request rate, error rate, latency, saturation, restarts and queue depth. They tell you that something changed and when.

Logs

Events as text

Show what the application said while the fault ran, such as retry warnings or connection errors.

Traces

The path of a request

Show exactly where a slow or failed request spent its time, which is invaluable for network and dependency faults.

Marking the experiment on the graph

The most useful habit is putting a visible marker on your dashboards when each experiment starts and ends. Both tools can help: Chaos Mesh publishes events and can integrate with Grafana through a data source and annotations, and Litmus provides an exporter that publishes experiment status as metrics, which you can overlay on application graphs. With a marker, anyone looking at a sudden spike can tell at once whether it came from the planned fault or from something else.

What to watch for each kind of fault

FaultWhat you expect to seeWarning signs
Pod killA brief dip in capacity, quick replacement, steady success rateA burst of errors, slow replacement, or a lost in-flight request
Network delayLatency rises a little, timeouts and retries engageRetry storms, queue growth, error cascades upstream
Packet lossSlightly slower calls, connections recoveredHung connections, long stalls with no timeout
CPU stressThrottling, perhaps autoscaling beginsNeighboring workloads slow down, health checks fail
Memory pressureThe targeted container is restarted at its limit, others unaffectedNode-level pressure, unrelated Pods evicted
Disk faultClear error messages, graceful degradationSilent data loss, crash loops, no alerts
Node drainPods move, budgets respectedPending Pods with nowhere to go, outage of a single-replica service

Do your alerts fire?

An overlooked benefit of chaos is testing your alerting. If you kill a database replica and no alert fires, that is a finding: either the system is fine and the alert is not needed, or the system is in trouble and nobody will know. Ask after every experiment: “Would the on-call person have been told, and would the message have been useful?”

Recording what you learn

Take screenshots of the dashboards, note the start and end times, write down what you expected and what happened. A short experiment report, including the hypothesis, the settings, the observed behavior and the follow-up actions, is the lasting product of the exercise. Without it, the knowledge lives in one person’s head.

Everyday Analogy

A science experiment without measurements is just play. Imagine testing a bridge by driving a heavy truck over it with no sensors and no cameras. You may see that it did not collapse, but you will learn nothing about how close it came.

i
Tip

Build one standard “chaos dashboard” per service, with the four golden signals (latency, traffic, errors and saturation), a restart count, and the experiment markers. Re-use it for every test of that service.

21Steady State, SLOs and Hypotheses

The hypothesis is the heart of chaos engineering. A good one makes the experiment meaningful, and a vague one makes it theater.

Defining steady state

Steady state means “the system is behaving normally,” expressed in measurable terms that reflect user experience. Good steady-state measures are things like the share of successful checkouts, the 95th percentile response time, the number of orders processed per minute, or the age of the oldest message in a queue. Poor measures are things like “CPU is below 70 percent,” which describe machinery and not value.

Using SLOs

If your team already has service level objectives, such as “99.9 percent of requests succeed within 500 milliseconds,” they are the best steady-state definition. They state what users are promised. A chaos experiment then asks: “Can we keep this promise while the fault is active?” The error budget gives another useful angle, since a chaos run spends a bit of budget on purpose, and you can plan for how much you are willing to spend.

Writing a hypothesis

A good hypothesis has four parts, written in plain words:

  • The fault: what exactly will we do?
  • The scope: to which target, and for how long?
  • The prediction: what do we expect to remain true?
  • The abort rule: what result will make us stop at once?

Example: “When we kill one of the five product-catalog Pods in staging for a single event, the checkout success rate will stay above 99.5 percent and the replacement Pod will be ready within 40 seconds. We will stop if the success rate drops below 97 percent for more than 30 seconds.”

Predict first, then test

Ask the team to write down predictions before the run. Often people are surprised by how much they disagree. Disagreement is itself a finding: the system is not understood well enough, and the experiment shows who has the better model of it.

Good and weak hypotheses

Strong hypotheses

  • Tied to a user-visible measure
  • Specific numbers and times
  • Include an abort rule
  • Can be proved false
  • Written down before the run

Weak hypotheses

  • “The system will be fine”
  • Only machine measures such as CPU
  • No limit on the damage
  • Impossible to fail, so teaches nothing
  • Invented after seeing the result
Everyday Analogy

Think of a doctor’s stress test. The doctor says before the test: “Your heart rate should rise to about 150 and recover below 100 within three minutes. If you feel chest pain, we stop.” That statement makes the test meaningful. Without it, running on a treadmill is just exercise.

The experiment that cannot fail teaches nothing, and the experiment that nobody predicted teaches the most.

22A Playbook of Experiments to Try First

Here is a ladder of experiments, from gentle to demanding. Each one has a plain question and a typical lesson. Climb it one step at a time.

1

Kill one Pod of a stateless service

Question: Do users notice when one copy disappears? Typical lesson: A surprising number of services have a single replica, or no readiness check, or a slow start, so traffic reaches a Pod that is not ready.

2

Kill a container with sidecars present

Question: Does the Pod recover when only the app or only the proxy container dies? Typical lesson: Startup ordering problems between app and sidecar.

3

Add moderate latency to one dependency

Question: Do timeouts and retries behave? Typical lesson: Missing timeouts, which let slow calls pile up and exhaust threads.

4

Make one dependency fail outright

Question: Does the application degrade gracefully, or fall over? Typical lesson: Optional features that were secretly required, such as a recommendation service blocking the whole page.

5

Drop a small percentage of packets

Question: Are connections and retries robust to small, realistic loss? Typical lesson: Clients that hang forever on a single lost packet.

6

Stress CPU on a target container

Question: Do limits protect neighbors, and does autoscaling react? Typical lesson: Missing limits, slow autoscaling, or health checks that fail because of the load itself.

7

Fault DNS for one domain

Question: What happens when a name cannot be resolved? Typical lesson: Applications that cache nothing, or that crash at start when a name is missing.

8

Drain one node

Question: Do Pods move cleanly, and do disruption budgets help? Typical lesson: Single-replica services, Pods with local storage that cannot move, or no spare capacity.

9

Partition two services

Question: What do both sides do when they cannot talk? Typical lesson: Inconsistent data, duplicated work or endless retries.

10

Combine faults in a workflow

Question: Do realistic multi-step failures break us? Typical lesson: Weaknesses that only appear in combination, such as a restart during a slow dependency.

How to use the ladder

Do not move up until the current step is boring: the system passes, the alerts are right and the team can run it without drama. Fix what you find at each rung and repeat the experiment to prove the fix worked. A passed experiment becomes a regression test that can run on a schedule forever.

i
Tip

Keep the ladder in your repository as a living list. Each rung has a link to the experiment definition, the date of the last run and its result.

23Chaos in Pipelines: Continuous Resilience

The goal is not a few heroic tests, but a steady habit. Pipelines make the habit automatic.

Where chaos fits in delivery

Build

After deploy to test

Run a small, fast experiment set against the freshly deployed test environment, such as Pod kill and short latency, with probes.

Release

Before promotion

Run the fuller workflow in a staging environment, and require a minimum resilience score before the release moves on.

Schedule

Regular timetable

Run experiments weekly on staging, and perhaps monthly in carefully selected production services, to catch drift.

Incident

After an outage

Reproduce the failure as an experiment, fix the cause and keep the experiment as a guard against its return.

Making experiments pipeline-friendly

  • Deterministic enough: Results should not vary wildly between runs. Pin the target, fix the duration and use probes with sensible tolerances.
  • Fast: A pipeline gate that takes an hour will be skipped. Keep gating experiments to a few minutes and run longer ones on a schedule.
  • Clear exit codes: The pipeline needs a simple pass or fail from the result object, with a link to details.
  • Self-cleaning: Every fault must be reverted even if the pipeline is cancelled, which is why durations and clean-up policies matter.
  • Isolated: Run in a dedicated namespace or cluster, so parallel pipelines do not interfere with one another.

GitOps style

Because experiments are Kubernetes objects, they can be stored in Git and applied by the same tools that deploy your applications. A change to an experiment goes through review, just as code does. This makes it visible who changed the blast radius, and when, and it makes rollbacks trivial.

Handling flaky results

If an experiment fails sometimes and passes at other times, do not just rerun it until it passes. Investigate. Flakiness is often the true signal: the system is marginal, and the experiment sits right at the edge. Either fix the weakness or tune the experiment to a fairer threshold, but do both on purpose, with a note of why.

Use Case: Catching a regression with a scheduled run

A team ran a weekly Pod-kill experiment against its order service with a probe on order success. One week it began to fail. The probe showed a spike of errors for about 20 seconds after the kill. Looking at the changes of that week, they found a new library that opened its database connection pool lazily and held a lock during start. The team fixed the code before any customer was affected, and the weekly experiment proved its worth in that single catch.

Everyday Analogy

Pipeline chaos is like a car’s regular safety inspection. Nobody expects a problem at each visit, but the schedule catches slow wear before it becomes a breakdown, and the paperwork shows that the checks really happened.

24Security, Permissions and Governance

A tool that can kill Pods and cut networks is a powerful tool. Treat it like one.

The risks to understand

Chaos tools need elevated rights. The node-level agent of Chaos Mesh and the helper Pods of Litmus can reach into other containers’ namespaces, change network rules and consume resources. If an attacker or a careless user gained control of these, they could cause an outage far larger than any planned experiment, or use the privileges as a way to escape a container. Governance is about making sure that does not happen.

Controls to put in place

ControlWhat it does
RBAC for experiment objectsOnly named roles may create, edit or delete chaos resources, and only in permitted namespaces.
Namespace allow-listsThe tool refuses to target namespaces that are not on the list, such as system namespaces and the chaos tool’s own namespace.
Opt-in annotationsA workload must carry an agreed marker before it may be targeted.
Dashboard authenticationNo anonymous access, single sign-on if possible, and no public exposure.
Network policyRestrict who can reach the dashboard, the controller and the agents.
Least-privilege service accountsEach experiment gets only the rights it needs, and no more.
Policy engine rulesAdmission policies can require that chaos objects have a duration, a bounded mode and an owner label.
Audit loggingRecord who created which experiment and when, and keep the record.
Image provenanceUse experiment images from trusted registries, pinned by version, and mirror them internally if possible.

A protection against yourself

The tool’s own namespace and the cluster’s core components, such as the control plane, DNS and the networking layer, should be excluded from ordinary experiments. Deliberately testing them is a separate, advanced exercise with its own approvals, never a side effect of a loose label selector.

Approvals and change management

Match approval effort to risk. A small experiment in a test namespace needs no meeting. A production experiment needs a short written plan, an owner, an on-call contact informed, a time window, and an abort rule. A cross-team experiment needs the agreement of the owners of every service that might be touched. Write down these levels so people know what is expected without having to ask.

Compliance and customer trust

Some regulated industries expect evidence of resilience testing. Chaos experiment reports, with hypotheses and results, serve well as evidence. At the same time, do not run experiments that could expose or corrupt customer data without a careful review by the people responsible for data protection.

Everyday Analogy

Keys to the building’s fire alarm panel are held by few people, the panel is in a locked room, and every use is logged. The tool that can trigger the alarm for a drill must be at least as well protected as the alarm itself.

!
Common Trap

A dashboard exposed through a public load balancer with weak or no login has happened in real clusters. Anyone who finds it can create experiments. Always put it behind authentication and a private network path, and check this regularly.

25Game Days: Chaos as a Team Sport

A game day is a planned session where a team deliberately breaks things and practices responding. It trains people as much as it tests systems.

Why people need practice

Systems are only half of resilience. The other half is people: Do they know where to look? Can they find the right dashboard in the first two minutes? Does the runbook still match reality? Do they know who to call? These questions are answered only by practicing under mild pressure.

The roles

Facilitator

Runs the day

Keeps time, enforces safety rules and decides when to stop.

Injector

Applies the faults

Runs the chaos tool according to the plan, and reverts it on cue.

Responders

The on-call team

Handle the situation as if real, using normal tools and runbooks. Sometimes they know in advance, and sometimes they do not.

Observers

Take notes

Record the timeline, what people did and where they struggled, without interfering.

Scribe

Captures actions

Writes down every finding and follow-up task with an owner.

A simple game day schedule

1

Brief (20 minutes)

Explain the scenario, the safety rules, the stop signal and the roles. Confirm that the target is a safe environment.

2

Predict (10 minutes)

Responders write down what they expect to happen and how they will know.

3

Inject and respond (45 minutes)

The injector starts the fault. The responders detect, diagnose and fix. Observers take notes on timing.

4

Recover and verify (15 minutes)

The fault is removed, and the team confirms the steady state has returned.

5

Debrief (30 minutes)

Walk through the timeline without blame. Ask what surprised people, what slowed them and what to improve.

6

Follow up (within a week)

Turn findings into tracked tasks, and schedule a repeat to confirm the fixes.

Measuring game day results

Useful numbers include the time from the start of the fault to the first alert, the time to the first person looking at the right dashboard, the time to diagnosis, and the time to recovery. Track them across game days. Falling numbers mean the team is getting stronger, even if the scenarios become harder.

The blameless rule

A game day must be safe for people. If someone makes a mistake during the exercise, the lesson is about the system that allowed the mistake, such as a confusing runbook, and not about the person. Teams that blame people during a drill soon stop volunteering for drills.

Everyday Analogy

A game day is a school fire drill for adults. The aim is not to catch anyone out. It is to make sure that, on the day of a real fire, nobody has to think about where the exits are.

i
Tip

Your first game day should be small: one service, one fault, one hour, and a team that knows the system. Success builds the confidence needed for larger exercises.

26Chaos for Stateful Systems and Databases

Stateless services are forgiving. Databases, queues and caches hold data that matters, so experiments need extra care and different questions.

Why state raises the stakes

When a stateless Pod dies, another identical one takes over. When a database Pod dies, the data it held, the position of the leader, and the consistency of replicas all matter. A badly planned experiment can lose or corrupt information. A well-planned one can prove that your replication, failover and backups really work.

Questions worth asking

SystemExperimentQuestion
Replicated databaseKill the leader PodHow long until a new leader is chosen, and are any writes lost or duplicated?
Replicated databaseAdd network delay between replicasDoes replication lag grow, and does the application read stale data without noticing?
Message brokerKill one brokerAre messages preserved, and do consumers reconnect and resume where they left off?
CacheKill the cache entirelyDoes the database survive the sudden load, or does it collapse under the stampede?
Persistent volumeFault the disk with errors or slownessDoes the database fail loudly, and do alerts fire?
Connection poolCut the network between app and database brieflyDo clients reconnect, or stay stuck with dead connections?
Backup systemRestore into a clean environmentDoes the restore work, and how long does it take? (Not a fault, but a close cousin.)

Rules for stateful experiments

  • Have verified backups first. Restore at least once to prove they work before you start breaking things.
  • Use test data. Run first on copies or generated data, not customer records.
  • Add integrity probes. Check not only availability but also correctness, for example by writing known records during the fault and reading them back afterwards.
  • Move slowly. Prefer short, single faults to start, and understand the recovery behavior before combining faults.
  • Involve the data owners. The people who understand the data’s meaning should review the plan.
  • Prefer cluster-aware faults. Application-specific experiments, such as those in the Litmus catalog for popular databases, understand roles like leader and replica.

The cache stampede lesson

One of the most common discoveries is the cache stampede. When the cache is emptied or restarted, every request goes to the database at once. The database slows, requests time out, clients retry, and the overload deepens. The fix may be cache warming, request coalescing, limits, or jittered retries. A simple cache-kill experiment finds this safely before a real restart does.

Everyday Analogy

Testing a stateless service is like testing whether a restaurant can cope when a waiter calls in sick. Testing a database is like testing whether the restaurant’s reservation book survives a fire. You check that the copy exists first, and you test the sensitive part with much greater care.

!
Common Trap

Do not run disk or kernel-level faults against volumes holding data you cannot recreate. Unlike a killed Pod, damaged data does not come back when the experiment ends.

27Network Chaos, Service Meshes and Retry Storms

Most real outages in distributed systems are about the network and about how services talk to each other. This is where chaos experiments often pay off the most.

The fallacies we forget

Designers of distributed systems often assume, without noticing, that the network is reliable, that delays are zero, and that bandwidth is infinite. None of these is true. Network chaos reminds the software of the real world by adding delay, jitter, loss, duplication, reordering, corruption, bandwidth limits and full partitions.

What each network fault teaches

FaultWhat it simulatesWeakness it often reveals
DelayA congested link or a distant regionMissing or huge timeouts, thread exhaustion
JitterDelay that varies from call to callTuning that works only for steady latency
LossDropped packets on a poor linkConnections that hang, slow recovery
DuplicationPackets delivered twiceOperations that are not safe to repeat
CorruptionDamaged packetsWeak validation, strange protocol errors
Bandwidth limitA narrow pipeLarge responses that block everything
PartitionA split between groups of PodsSplit-brain behavior, inconsistent data

The retry storm

Here is a classic pattern. A dependency becomes slow. Callers time out and retry. The retries add load to the already struggling dependency, so it becomes even slower, causing more timeouts and more retries. A small slowdown becomes a complete outage. A network delay experiment reveals this behavior quickly.

flowchart LR
  A["Dependency becomes slow"] --> B["Callers hit timeouts"]
  B --> C["Callers retry at once"]
  C --> D["Load on dependency rises"]
  D --> E["Dependency gets even slower"]
  E --> B
  F["Remedies: backoff with jitter, retry budgets, circuit breakers, load shedding"] -.->|"break the loop"| C
Figure 5: How retries can turn a slowdown into an outage, and where to cut the loop

Reading the diagram

The loop on the right is a vicious circle, and each lap makes things worse. The dotted line shows where good engineering interrupts it. Exponential backoff spaces out retries. Jitter randomizes them so that clients do not retry in lockstep. A retry budget caps retries to a small fraction of total traffic. A circuit breaker stops calling a dependency that is clearly failing. Load shedding lets the dependency refuse excess work quickly instead of collapsing.

Service meshes and chaos

If you run a service mesh, you gain another route for fault injection. Meshes can inject delays and aborts at the proxy level for particular routes or percentages of requests, which is excellent for application-layer faults such as “make five percent of calls to the payments route return an error.” Chaos Mesh also offers an HTTP fault type for this style of testing. Network-layer faults and application-layer faults complement each other: the first tests the transport and the second tests your logic.

Be careful with shared infrastructure

Network faults can accidentally affect more than intended, especially when applied to Pods on a shared node. Scope by Pod and direction as tightly as possible. Test the experiment on a single Pod first and confirm in the graphs that only the intended path was affected.

Everyday Analogy

A retry storm is like a crowd shouting louder when a shopkeeper is slow. The shouting makes the shopkeeper even slower, so the crowd shouts more. A polite queue with a number system, which is the equivalent of backoff and limits, gets everyone served faster.

i
Tip

For each dependency in your architecture diagram, write down its timeout, retry count and fallback. If you cannot fill in one of the three, you have just found your next experiment.

28Resource Chaos, Autoscaling and Capacity

Resources are shared, and sharing is where surprises hide. Stress experiments test the walls between neighbors and the speed of your growth reflexes.

What resource limits really do

A CPU limit throttles a container that tries to use more than its allowance, making it slower but keeping it alive. A memory limit is harsher: a container that exceeds it is terminated and restarted. Requests, on the other hand, decide how Pods are placed on nodes and what share of CPU each gets under contention. Many problems come from setting requests and limits by guesswork. Stress experiments replace guesswork with evidence.

Experiments in this family

CPU

Burn processors

Runs busy workers inside a target container’s resource group, testing throttling, health checks and autoscaling.

Memory

Allocate memory

Grows memory use gradually, testing limit behavior and whether the container restarts cleanly.

Disk

Fill or slow storage

Fills space or adds latency, testing log rotation, temporary storage handling and alerts.

IO

Delay or fail file operations

Tests how applications deal with slow or broken storage underneath them.

Autoscaling under test

Horizontal autoscaling is a feedback loop. Metrics are collected, averaged, compared with a target, and the replica count is adjusted, with delays at each step. A stress experiment can show how long that loop really takes. Typical findings include:

  • The metrics pipeline lags by a minute or more, so scaling begins late.
  • New Pods take a long time to become ready because of image pulls or slow startup, so extra capacity arrives after the damage.
  • The cluster has no spare node capacity, so new Pods sit pending until a node is added.
  • The scaling target is based on CPU, but the true bottleneck is something else, such as a connection pool.
  • The maximum replica count is set too low, so the autoscaler hits the ceiling.

Noisy neighbors and eviction

Run a memory stress experiment on one Pod and watch the others on the same node. If your neighbors suffer, your limits or priorities need attention. When a node runs low on memory, Kubernetes evicts Pods, and the order depends on quality-of-service class and priority. Experiments show whether the right Pods are evicted first, and whether critical services have the priority they deserve.

Testing capacity headroom

Combine a node drain with a load test and ask: “If we lose one node at peak hour, do we still serve everyone?” This tells you whether your headroom is adequate, or whether your cost-saving efforts have quietly removed the margin you need.

Everyday Analogy

An apartment building shares water and electricity. A resource limit is like a circuit breaker per flat. A stress experiment is a neighbor deliberately running every appliance, to learn whether the breaker trips for them alone or whether the whole building goes dark.

!
Common Trap

Stressing a Pod that has no limits can starve the whole node, including the node’s own components. Always set limits on the target, or target a container that already has them, before running CPU or memory stress.

29Node, Zone and Cluster-Level Failures

Eventually you will want to test bigger failures: a machine, a whole building’s worth of machines, or the cluster’s own brain.

Node failures

Nodes fail in many ways. They may crash outright, lose network, run out of disk or memory, or have a stuck container runtime. Kubernetes marks a silent node as not ready after a grace period, then evicts its Pods after a further delay, so rescheduling can take minutes. During that time, traffic may continue to flow to Pods that are on the lost node. Node experiments show how long the whole recovery chain really takes in your cluster, and whether your application survives the wait.

Zone failures

Cloud providers group machines into zones that fail independently. A good setup spreads replicas across zones using topology spread rules and anti-affinity. You can simulate a zone loss by draining or isolating every node in one zone, and verify that capacity remains and that data replicas are still reachable. This often exposes services that were accidentally placed together, or storage volumes that are tied to one zone.

Control plane concerns

The control plane decides where Pods run and keeps the records. Running Pods generally continue running while the control plane is briefly unavailable, but nothing new can be scheduled, scaled or repaired. Testing control plane faults is risky and often impossible on managed services, where the provider owns the machinery. The safer approach is to test what you control: does your application keep serving when it cannot reach the API server for a few minutes? Do your operators and controllers handle errors without crashing?

Component faults worth testing

ComponentFaultQuestion
Cluster DNSSlow or failing name resolutionDo services cache results and retry sensibly?
Ingress controllerKill one replicaIs the entry point itself redundant, and does the load balancer notice quickly?
Metrics pipelineStop the metrics serverWhat do autoscalers do without data?
Admission webhooksMake a webhook unreachableDoes the failure policy block all deployments, or let them through?
Image registryBlock accessCan new Pods start from cached images, and what happens to new nodes?
CertificatesUse short-lived test certificatesDoes renewal work without a human?

The importance of dependencies you forgot

Draw a picture of everything your application needs in order to start, not just to run. Container registries, secret stores, configuration services, certificate authorities and DNS all appear on that picture. Many teams find they can survive losing a database but not losing a registry during a deployment.

Everyday Analogy

Testing node and zone failures is like checking what happens when a power cut hits one street, or a whole district. A well-planned city keeps hospitals running, because they have backup power and connections to several districts. A poorly planned one discovers that the hospital and its backup generator are on the same street.

i
Good to Know

Managed Kubernetes services restrict what you may do to the control plane and to nodes. Check your provider’s rules before running any experiment that touches provider-managed components.

30A Worked Story: A Shop Learns from Controlled Failure

This is an illustrative story, not a report about a real company. It shows how the ideas in this guide fit together in a small team.

The setting

A fictional online shop, “Corner Basket,” runs about twenty services on Kubernetes. Orders, payments, catalog, search and a recommendation service sit behind a single storefront. After a stressful holiday weekend where a slow payment provider caused a long outage, the team of eight decided to try chaos engineering.

Month one: foundations

They did not install a tool at first. They wrote down their steady state: checkout success above 99 percent, page response under one second for 95 percent of requests. They built a dashboard for it, checked that every service had readiness probes and more than one replica, and found that three services had only one replica. They fixed those, and had improved resilience before running a single experiment.

Month two: first experiments

They installed a chaos tool in their staging cluster, limited to the staging namespaces and protected by login. Their first experiment killed one catalog Pod. The checkout rate dipped to 96 percent for 25 seconds. The reason was that the catalog Pod accepted traffic before its cache had loaded, and the readiness check only tested that the port was open. They fixed the readiness check to wait for the cache, and the experiment then passed with no visible dip.

Month three: the dependency that was not optional

The team made the recommendation service fail completely. The storefront should simply have omitted the “you may also like” block. Instead, the whole page failed after a 30-second wait, because the code called the service without a timeout and treated its response as required. They added a short timeout and a fallback that showed popular items. A cheap experiment had found the exact weakness that had hurt them during the holiday, in a different dependency.

Month four: the payment provider

They added 3 seconds of delay to calls to the payment provider’s address. Checkout threads piled up, the order service ran out of workers, and unrelated order lookups started to fail. They introduced a separate worker pool for payments, a circuit breaker, and a clear message to the shopper when payment was slow. They repeated the test and saw that only checkout slowed, while everything else remained healthy.

Month five: automation and a game day

The team added four experiments with probes to their release pipeline, and a monthly game day for the on-call rotation. In the first game day, it took 11 minutes for anyone to find the right dashboard. They reorganized the dashboards and the runbook, and the next game day took 3 minutes.

Month six: production, carefully

After six months, with strong monitoring, small blast radii and an agreed stop rule, they ran a single Pod kill on a low-risk production service during business hours with the on-call engineer watching. It passed. They scheduled it monthly. Later, a change broke it, and the experiment caught the problem on its next run.

What changed

3
single-replica services fixed before any test
5
real weaknesses found in staging
11 → 3
minutes to find the right dashboard
0
customer-visible incidents from tested causes
Most of the value came from questions the team asked while preparing, and from fixing what the first, gentlest experiments exposed.
Everyday Analogy

The team behaved like a family that decides to test its smoke detectors. Just by walking around the house, they found a detector with a dead battery and a blocked exit. The drill itself confirmed the fixes, but the preparation had already made them safer.

31Anti-Patterns: How Chaos Programs Go Wrong

Learn from the mistakes others have already made. These are the most common ways that chaos engineering efforts fail or cause harm.

AP-1Avoid

Chaos without observability

Experiments run on systems with no useful graphs, alerts or logs. Nobody can tell what happened, and results are anecdotes. Instead: build the steady-state dashboard first.

AP-2Avoid

Starting in production

Enthusiasm leads a team to run experiments in production before it has any confidence. A minor weakness becomes a customer-facing outage and the program is cancelled. Instead: climb the ladder, starting in test environments.

AP-3Avoid

Breaking things already known to be broken

If you know the service has a single replica, killing it proves nothing. Instead: fix known weaknesses first and use experiments to find unknown ones.

AP-4Avoid

Unbounded blast radius

An experiment with no duration, a broad selector, or the “all” mode, run with no abort rule. Instead: one Pod, one namespace, short time, and a written stop condition.

AP-5Avoid

Running without telling anyone

Surprising the on-call team creates real incidents and distrust. Instead: announce experiments, and keep “unannounced” drills for mature teams with explicit consent.

AP-6Avoid

Findings without follow-through

Teams collect reports, then nobody fixes anything. Instead: every finding becomes a tracked task with an owner, and the experiment is repeated to prove the fix.

AP-7Avoid

Chaos as a one-time event

A single heroic game day, then nothing for a year. Systems change; so must the tests. Instead: schedule experiments and make the pipeline run them.

AP-8Avoid

Chasing the score

Teams tune experiments to pass so the resilience number looks good. Instead: raise the difficulty over time and treat a drop in score as useful information.

AP-9Avoid

Blame instead of learning

People are criticized for what a drill revealed. They stop taking part. Instead: run blameless debriefs focused on the system.

AP-10Avoid

Leaving the tool wide open

The dashboard is public, permissions are broad and nobody audits who runs experiments. Instead: apply the controls from Chapter 24.

32A Maturity Roadmap

Chaos engineering grows in stages. Knowing where you are helps you choose a sensible next step.

flowchart LR
  S0["Stage 0: Foundations - monitoring, probes, replicas"] --> S1["Stage 1: Manual experiments in test"]
  S1 --> S2["Stage 2: Scheduled experiments with probes"]
  S2 --> S3["Stage 3: Pipeline gates and game days"]
  S3 --> S4["Stage 4: Careful production experiments"]
  S4 --> S5["Stage 5: Resilience as a shared culture"]
Figure 6: Stages of chaos engineering maturity

What each stage looks like

StageTypical activitySigns you are ready to move on
0. FoundationsDashboards, alerts, health checks, replicas, disruption budgetsYou can describe steady state with numbers
1. Manual testsA few experiments by hand in a safe environment, written hypotheses and reportsThe team can run and stop an experiment confidently
2. ScheduledExperiments with probes run on a timetableResults are trusted and rarely flaky
3. Pipelines and game daysExperiments gate releases, with regular team exercisesFindings are fixed within an agreed time
4. ProductionSmall, announced, well-guarded experiments in live systemsThe blast radius controls have a good track record
5. CultureTeams design for failure from the start, and new services ship with their own experimentsThis is simply how engineering is done here

Reading the diagram

The chain runs from left to right and every box depends on the one before. Stage 0 comes first, because without foundations the other stages have nothing to stand on. The final stage is a state of mind, not a tool: people ask “what happens if this fails?” in design reviews, long before any experiment is run.

Measuring the program

  • Share of critical services with at least one automated experiment.
  • Number of weaknesses found and fixed, and the average time to fix.
  • Time to detect and time to recover in game days.
  • Incidents caused by failure types you have already tested, which should fall toward zero.
  • Confidence reported by the on-call team.
i
Tip

Do not try to skip stages. Teams that jump from stage 0 to production experiments tend to have a bad day, and then abandon the practice for years.

33Frequently Asked Questions

Short answers to questions that come up again and again.

Q1

Is chaos engineering just random breaking?

No. It is a disciplined method with a hypothesis, a limited scope, measurements and a way to stop. The randomness, such as picking a random Pod, is a small part inside a carefully designed test.

Q2

Do I need to run chaos in production?

Not at first, and some organizations never will. Production is where the real conditions live, so mature teams eventually run small experiments there. But a great deal of value comes from staging environments that are realistic.

Q3

Which tool should a small team pick?

Choose the one whose model matches your first need. If you want quick, varied fault injection, try Chaos Mesh. If you want experiments with automatic verdicts in pipelines, try Litmus. Run a one-week pilot, and do not worry about switching later, because the ideas transfer.

Q4

Will chaos tools harm my cluster?

They can if used carelessly. Limit namespaces, use short durations, require opt-in, protect access and keep the control plane out of scope. Used with these controls, risk is small and well understood.

Q5

How is this different from load testing?

Load testing asks how much traffic the system can take. Chaos experiments ask how the system behaves when parts fail. They work well together, and a common technique is running chaos while a load test provides realistic traffic.

Q6

Is chaos engineering the same as disaster recovery testing?

They are related. Disaster recovery tests focus on large events, such as the loss of a region, and on restoring data. Chaos engineering covers a wider range of smaller faults and runs more frequently. A mature program includes both.

Q7

What if an experiment gets stuck?

Delete the experiment object or stop the engine, and the controller will revert the fault. Because durations are set, most experiments end alone. If a fault remains, check the tool’s documentation for manual clean-up, and rehearse this beforehand.

Q8

Do the tools work with service meshes?

Yes, in general. Pod-level and network faults operate underneath or beside the mesh proxies. Be aware that sidecar proxies add their own retries and timeouts, which affects what you observe, so include them when you interpret results.

Q9

Can I test things outside Kubernetes?

Both projects have options for cloud resources and virtual or physical machines. The coverage varies, so check the current documentation for what you need.

Q10

How often should experiments run?

As often as your system changes in ways that might affect resilience. For many teams, that means gating experiments on each release, with a fuller weekly run, and a monthly game day.

Q11

What do I do when an experiment finds a serious weakness?

Celebrate briefly, since you found it safely. Stop the experiment if it is still running, record the evidence, create a tracked task with an owner and a deadline, and repeat the experiment after the fix.

Q12

How do I get management support?

Frame it in terms of cost and risk. Show past incidents, the cost of downtime, and how a small experiment would have found the cause. Start with a small pilot that yields a concrete finding, since a real result persuades better than a presentation.

34Key Takeaways and Next Steps

You have walked through the ideas, the tools, the habits and the traps. Here is the guide in a nutshell.

What to remember

  • Failure in distributed systems is normal. Chaos engineering finds weaknesses on your schedule, with safety measures, instead of on the system’s schedule.
  • Every experiment follows the loop: define steady state, state a hypothesis, inject a limited fault, observe, learn and fix, then repeat.
  • Blast radius is your main safety control: narrow selectors, small modes, short durations, abort rules and opt-in targets.
  • Chaos Mesh offers rich, low-level fault injection through simple custom resources, a node-level daemon, workflows and a dashboard.
  • LitmusChaos offers a shared catalog, engines, probes, verdicts and a resilience score, which suit automated pipelines and team governance.
  • Probes and steady-state measures turn experiments into tests. Without them, a “pass” means little.
  • Observability comes first. Mark experiments on dashboards, and check that your alerts fire.
  • Foundations such as replicas, health probes, limits and disruption budgets are the first fixes, often before any experiment.
  • Game days train people as well as systems, and must be blameless.
  • Stateful systems need verified backups, test data and integrity probes.
  • Protect the tools with RBAC, authentication, namespace allow-lists and audit logs.
  • Grow in stages, and turn every finding into a fix, then a repeat test.

Your first week

1

Day one

Pick one service and write its steady state in numbers. Build or check its dashboard.

2

Day two

Review the basics: replicas, probes, limits and budgets. Fix the obvious gaps.

3

Day three

Install one tool in a test cluster, limited to one namespace and protected by login.

4

Day four

Write a hypothesis for a single Pod kill, tell your team and run it with an abort rule.

5

Day five

Write the short report, file the follow-ups, and schedule a repeat after the fixes.

i
A Final Word on Versions

Both projects evolve quickly, so field names, features and component names may differ in the version you install. The concepts here, steady state, hypothesis, blast radius, probes and learning loops, stay valid. Always confirm specifics against the official documentation of your version.

Back to top