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.
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.
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:
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.
Form a hypothesis
State what you expect: “if we lose one database replica, the steady state will hold.”
Vary real-world events
Inject failures that actually happen: crashes, slow networks, full disks, bad deployments.
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.
Automate
Experiments run continuously or on a schedule, not once a year.
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.
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
Step by step
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.
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.”
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.
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.
Inject and observe
Run the experiment while watching dashboards, logs and traces. Note what happens, including surprises.
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.
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.
| Layer | Example failures | What a healthy system does |
|---|---|---|
| Container and Pod | Process crash, out-of-memory kill, failing health check, Pod deleted | Kubernetes restarts or replaces it, and traffic moves to healthy copies |
| Application | Slow responses, error responses, bad data, memory leaks | Callers use timeouts, retries and fallbacks |
| Node | Machine crash, node out of disk, node under heavy CPU load, node drained for maintenance | Pods are rescheduled; disruption rules keep enough copies running |
| Network | Added delay, dropped or duplicated packets, split between groups of Pods, limited bandwidth | Services tolerate slowness; split-brain situations are handled safely |
| Storage | Slow disk, disk full, read or write errors, data corruption | The application degrades gracefully and alerts fire early |
| Time | Clock skew or jumps | Certificates, tokens, caches and schedules behave sensibly |
| DNS and discovery | Name lookups fail or return wrong answers | Clients retry and cache sensibly |
| Control plane | API server slow or unavailable, scheduler or controller delays | Running workloads continue; autoscaling degrades gently |
| Dependency | A database, queue, cache or third-party API is slow or down | Circuit breakers, queues and caches absorb the shock |
| Zone or region | An entire data center or cloud zone is lost | Capacity 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.
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
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.
Someone is on call
People who can fix problems are present and aware, not asleep or away.
Backups exist
For experiments touching data, a recent and tested backup is available.
Stakeholders know
Support, product and neighboring teams are told, so they do not mistake the experiment for a real incident.
Rollback is rehearsed
You have practiced stopping the experiment and restoring normal service.
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.
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.
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
Many fault types
Pod, network, disk, CPU, memory, time, DNS, HTTP, kernel and Java faults, plus cloud and physical machine faults.
Kubernetes-first
Experiments are custom resources. No separate language or agent protocol to learn.
Dashboard
A web interface lets you create, run and watch experiments without writing configuration.
Schedules and workflows
Run experiments repeatedly on a cron schedule, or chain them into orchestrated scenarios.
Application unaware
Faults are injected from outside, so you do not need to modify or rebuild your application.
Scoping controls
Namespace filters and annotation-based opt-in limit what can be targeted.
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.
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
The three main components
| Component | How it runs | What it does |
|---|---|---|
| Controller manager | A Deployment, usually with several replicas and leader election | Watches chaos objects, decides which Pods or nodes match, schedules start and stop times, calls the daemons, updates status, and hosts the admission webhooks. |
| Chaos daemon | A DaemonSet, one Pod per node, with high privileges | Does the actual fault injection on its node by entering the target container’s Linux namespaces and control groups, through the container runtime. |
| Dashboard | A Deployment with a web interface and API | Lets 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.
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 type | What it simulates | Typical actions |
|---|---|---|
| PodChaos | Pods and containers failing | Kill a Pod, make a Pod unavailable by replacing its image with a broken one for a while, kill a specific container |
| NetworkChaos | Network problems | Add delay, drop packets, duplicate packets, corrupt packets, limit bandwidth, partition groups of Pods from each other |
| IOChaos | Disk and file system problems | Add latency to file operations, return errors, change file attributes, or corrupt the data read |
| StressChaos | Resource exhaustion | Burn CPU or consume memory inside a container |
| TimeChaos | Clock skew | Shift the time seen by processes in a container |
| KernelChaos | Kernel-level failures | Make selected system calls or memory allocations fail, using kernel tracing facilities |
| DNSChaos | Name lookup problems | Return errors or random answers for matching domain names |
| HTTPChaos | Web protocol problems | Delay or abort HTTP requests and responses, change status codes or bodies, match by path or method |
| JVMChaos | Faults in Java programs | Throw exceptions from named methods, add latency to methods, stress the garbage collector |
| Cloud chaos kinds | Failures in cloud accounts | Stop or restart virtual machines, detach disks on supported cloud providers |
| PhysicalMachineChaos | Failures on machines outside Kubernetes | Network, 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.
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.
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.
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:
Where
Limit to one or more named namespaces, such as a staging area. Always set this.
Which application
Match by the labels you already use on Pods, such as the app name and tier.
Flexible matching
Use set-based rules like “label environment is in staging or test.”
Finer filters
Select by Pod fields such as the node it runs on, or by annotations you added for opt-in.
Pod state
Choose only running Pods, so that experiments do not waste effort on Pods that are not serving.
Named Pods
Pick exact Pods by name when you want a precise, repeatable target.
Modes: how much of it
| Mode | Meaning | When to use it |
|---|---|---|
| One | Pick one random matching Pod | First experiments, and the safest default |
| Fixed | Pick a specific number of Pods | When you know you want exactly two out of five |
| Fixed percent | Pick a percentage of matching Pods | To keep tests meaningful as fleet sizes change |
| Random max percent | Pick a random number up to a percentage | To simulate varied real-world loss |
| All | Every matching Pod | Rare; 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.
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.
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.
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.
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
ChaosHub
A growing library of experiments for Kubernetes, cloud providers and common applications.
Probes
Automatic checks that decide pass or fail, so experiments act as tests.
ChaosCenter
A web portal and control plane for managing experiments across many clusters, teams and projects.
Resilience score
A single number summarizing how well a set of experiments passed, useful for tracking progress.
Declarative and API-driven
Everything is defined in Kubernetes objects and can be driven through an API and a command-line tool.
CI/CD fit
Designed to be called from build and release pipelines as automated resilience checks.
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.
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
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
| Part | Role |
|---|---|
| Subscriber | Keeps 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 operator | A Kubernetes operator that watches ChaosEngine objects and starts the work they describe. |
| Chaos runner | A short-lived Pod created for each engine, which prepares and launches each experiment, and collects results. |
| Experiment job | The Pod that actually carries out the fault logic and the probes for one experiment. |
| Helper Pods | Extra Pods with higher privileges, started on the target’s node for faults that need deep access, such as network or stress faults. |
| Chaos exporter | Publishes experiment results and status as Prometheus metrics, so dashboards can overlay them on application graphs. |
| Workflow components | In 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.
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:
In progress
The experiment is still running, or has not yet produced a final answer.
Resilient
The fault was injected and every probe succeeded, so the application coped.
Weakness found
The fault ran but a probe failed, or the experiment could not complete as designed.
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
| Object | Analogy | Created by | Lives |
|---|---|---|---|
| ChaosExperiment | A recipe in a cookbook | Pulled from the hub or written by your team | Long |
| ChaosEngine | A work order: cook this recipe for this table | You, or the portal, for each application | Per run or per schedule |
| ChaosResult | The tasting notes and score | The experiment itself, automatically | Kept for history |
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
Step by step
Create the engine
You apply a ChaosEngine in the active state, or the portal does so when a schedule fires.
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.
Runner starts
A runner Pod is created. It reads the experiment definition and builds the job with your overrides applied.
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.
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.
Probes judge
Probes run before, during and after the fault, according to how each is configured.
Recovery and verdict
The fault is removed, post-chaos checks confirm the application returned to health, and the ChaosResult records the verdict.
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.
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
| Probe | What it checks | Example |
|---|---|---|
| HTTP probe | Calls a web address and checks the response code or content | The checkout page returns success within one second |
| Command probe | Runs a command and compares its output | A script confirms the database accepts writes |
| Kubernetes probe | Reads or lists Kubernetes objects and checks a condition | Three Pods of the cart service are ready |
| Prometheus probe | Runs a monitoring query and compares the result to a threshold | The error rate stays below one percent |
Probe modes: when to run
Start of test
Runs once before the fault, confirming the system is healthy to begin with.
End of test
Runs once after the fault ends, confirming the system returned to normal.
Both ends
Runs before and after, so a system that was healthy and is healthy again passes.
Throughout
Runs repeatedly at an interval for the whole experiment, catching brief outages.
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.
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.
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
| Family | Examples | What they reveal |
|---|---|---|
| Pod-level | Delete 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 HTTP | Restart behavior, timeouts, retries and graceful degradation |
| Node-level | Drain a node, cordon it, restart a node, stress node CPU, memory or disk, stop the kubelet | Rescheduling, disruption budgets, capacity headroom |
| Cloud provider | Stop instances, detach volumes, disrupt load balancers or databases on major clouds | Dependence on specific cloud resources |
| Application-specific | Faults against popular databases, brokers and platforms | Behavior of stateful systems under tailored failures |
| Platform | Faults against infrastructure components such as the control plane | Cluster-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.
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
| Question | Chaos Mesh | LitmusChaos |
|---|---|---|
| Core idea | One custom resource per fault type, applied directly | A catalog of experiments, connected to applications by engines |
| Strongest fit | Deep, fine-grained fault injection, especially network, IO, time and JVM faults | Experiments as automated tests, with probes, scores and team features |
| Judging outcomes | Mostly left to you, using status checks, monitoring and workflows | Built in through probes, verdicts and a resilience score |
| Scenarios | Workflows with serial, parallel, suspend, task and status check steps | Workflows of weighted experiments, with scores |
| Portal | Dashboard for creating and viewing experiments | ChaosCenter with projects, users, hubs, schedules and analytics |
| Privileges | A privileged daemon on each node | Experiment and helper Pods created per run, with narrower permissions per experiment |
| Sharing recipes | Manifests in your own repository | ChaosHub, public or private |
| Beyond Kubernetes | Physical machine and cloud chaos available | Cloud, virtual machine and application experiments in the catalog |
| Learning curve | Gentle for single faults | A 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.
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.
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
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.
Have working monitoring
You need graphs of request rate, errors, latency and Pod health before the first test. Without them you are blind.
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.
Set disruption budgets
Add PodDisruptionBudgets for important services. Node drain experiments respect them, so they test whether your budgets are sensible.
Label the opt-in targets
Decide which namespaces and workloads may be tested, and mark them. Everything else is protected.
Agree on a stop word
Choose the person or rule that can stop all experiments instantly and make sure everyone knows how.
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.
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.
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
Numbers over time
Request rate, error rate, latency, saturation, restarts and queue depth. They tell you that something changed and when.
Events as text
Show what the application said while the fault ran, such as retry warnings or connection errors.
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
| Fault | What you expect to see | Warning signs |
|---|---|---|
| Pod kill | A brief dip in capacity, quick replacement, steady success rate | A burst of errors, slow replacement, or a lost in-flight request |
| Network delay | Latency rises a little, timeouts and retries engage | Retry storms, queue growth, error cascades upstream |
| Packet loss | Slightly slower calls, connections recovered | Hung connections, long stalls with no timeout |
| CPU stress | Throttling, perhaps autoscaling begins | Neighboring workloads slow down, health checks fail |
| Memory pressure | The targeted container is restarted at its limit, others unaffected | Node-level pressure, unrelated Pods evicted |
| Disk fault | Clear error messages, graceful degradation | Silent data loss, crash loops, no alerts |
| Node drain | Pods move, budgets respected | Pending 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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Partition two services
Question: What do both sides do when they cannot talk? Typical lesson: Inconsistent data, duplicated work or endless retries.
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.
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
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.
Before promotion
Run the fuller workflow in a staging environment, and require a minimum resilience score before the release moves on.
Regular timetable
Run experiments weekly on staging, and perhaps monthly in carefully selected production services, to catch drift.
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.
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
| Control | What it does |
|---|---|
| RBAC for experiment objects | Only named roles may create, edit or delete chaos resources, and only in permitted namespaces. |
| Namespace allow-lists | The tool refuses to target namespaces that are not on the list, such as system namespaces and the chaos tool’s own namespace. |
| Opt-in annotations | A workload must carry an agreed marker before it may be targeted. |
| Dashboard authentication | No anonymous access, single sign-on if possible, and no public exposure. |
| Network policy | Restrict who can reach the dashboard, the controller and the agents. |
| Least-privilege service accounts | Each experiment gets only the rights it needs, and no more. |
| Policy engine rules | Admission policies can require that chaos objects have a duration, a bounded mode and an owner label. |
| Audit logging | Record who created which experiment and when, and keep the record. |
| Image provenance | Use 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.
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.
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
Runs the day
Keeps time, enforces safety rules and decides when to stop.
Applies the faults
Runs the chaos tool according to the plan, and reverts it on cue.
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.
Take notes
Record the timeline, what people did and where they struggled, without interfering.
Captures actions
Writes down every finding and follow-up task with an owner.
A simple game day schedule
Brief (20 minutes)
Explain the scenario, the safety rules, the stop signal and the roles. Confirm that the target is a safe environment.
Predict (10 minutes)
Responders write down what they expect to happen and how they will know.
Inject and respond (45 minutes)
The injector starts the fault. The responders detect, diagnose and fix. Observers take notes on timing.
Recover and verify (15 minutes)
The fault is removed, and the team confirms the steady state has returned.
Debrief (30 minutes)
Walk through the timeline without blame. Ask what surprised people, what slowed them and what to improve.
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.
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.
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
| System | Experiment | Question |
|---|---|---|
| Replicated database | Kill the leader Pod | How long until a new leader is chosen, and are any writes lost or duplicated? |
| Replicated database | Add network delay between replicas | Does replication lag grow, and does the application read stale data without noticing? |
| Message broker | Kill one broker | Are messages preserved, and do consumers reconnect and resume where they left off? |
| Cache | Kill the cache entirely | Does the database survive the sudden load, or does it collapse under the stampede? |
| Persistent volume | Fault the disk with errors or slowness | Does the database fail loudly, and do alerts fire? |
| Connection pool | Cut the network between app and database briefly | Do clients reconnect, or stay stuck with dead connections? |
| Backup system | Restore into a clean environment | Does 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.
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.
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
| Fault | What it simulates | Weakness it often reveals |
|---|---|---|
| Delay | A congested link or a distant region | Missing or huge timeouts, thread exhaustion |
| Jitter | Delay that varies from call to call | Tuning that works only for steady latency |
| Loss | Dropped packets on a poor link | Connections that hang, slow recovery |
| Duplication | Packets delivered twice | Operations that are not safe to repeat |
| Corruption | Damaged packets | Weak validation, strange protocol errors |
| Bandwidth limit | A narrow pipe | Large responses that block everything |
| Partition | A split between groups of Pods | Split-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
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.
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.
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
Burn processors
Runs busy workers inside a target container’s resource group, testing throttling, health checks and autoscaling.
Allocate memory
Grows memory use gradually, testing limit behavior and whether the container restarts cleanly.
Fill or slow storage
Fills space or adds latency, testing log rotation, temporary storage handling and alerts.
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.
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.
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
| Component | Fault | Question |
|---|---|---|
| Cluster DNS | Slow or failing name resolution | Do services cache results and retry sensibly? |
| Ingress controller | Kill one replica | Is the entry point itself redundant, and does the load balancer notice quickly? |
| Metrics pipeline | Stop the metrics server | What do autoscalers do without data? |
| Admission webhooks | Make a webhook unreachable | Does the failure policy block all deployments, or let them through? |
| Image registry | Block access | Can new Pods start from cached images, and what happens to new nodes? |
| Certificates | Use short-lived test certificates | Does 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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
Blame instead of learning
People are criticized for what a drill revealed. They stop taking part. Instead: run blameless debriefs focused on the system.
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"]
What each stage looks like
| Stage | Typical activity | Signs you are ready to move on |
|---|---|---|
| 0. Foundations | Dashboards, alerts, health checks, replicas, disruption budgets | You can describe steady state with numbers |
| 1. Manual tests | A few experiments by hand in a safe environment, written hypotheses and reports | The team can run and stop an experiment confidently |
| 2. Scheduled | Experiments with probes run on a timetable | Results are trusted and rarely flaky |
| 3. Pipelines and game days | Experiments gate releases, with regular team exercises | Findings are fixed within an agreed time |
| 4. Production | Small, announced, well-guarded experiments in live systems | The blast radius controls have a good track record |
| 5. Culture | Teams design for failure from the start, and new services ship with their own experiments | This 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
Day one
Pick one service and write its steady state in numbers. Build or check its dashboard.
Day two
Review the basics: replicas, probes, limits and budgets. Fix the obvious gaps.
Day three
Install one tool in a test cluster, limited to one namespace and protected by login.
Day four
Write a hypothesis for a single Pod kill, tell your team and run it with an abort rule.
Day five
Write the short report, file the follow-ups, and schedule a repeat after the fixes.
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.