Chaos Mesh is a chaos engineering platform that runs on Kubernetes. Each fault is declared as a custom resource, such as a network delay, a pod kill, a file system error or a stressed CPU, and Chaos Mesh injects it into selected workloads for a defined time. It addresses a common gap in reliability work: retries, timeouts, failover and autoscaling are usually designed on paper and exercised for the first time in production. Controlled experiments let a team confirm that these mechanisms work and find the ones that do not. Chaos Mesh grew out of the internal chaos platform that PingCAP built to test TiDB, and was open sourced on December 31, 2019. It was accepted into the CNCF Sandbox on July 28, 2020 and moved to Incubating in February 2022. The 2.8 release line is current, with 2.8.4 published in August 2026.
CNCF daily · Sprint 1, day 7 · Chaos Engineering
At a glance
| Category | Chaos Engineering |
| CNCF status | Incubating. Sandbox accepted July 2020; moved to Incubating in February 2022 |
| Written in | Go, with a React web dashboard |
| License | Apache 2.0 |
| Fault coverage | Pods, network, I/O and file system, kernel, stress, time, JVM and HTTP, plus cloud API and physical machine faults |
| Orchestration | Workflows for multi-step scenarios and Schedules for recurring experiments |
| Interfaces | Kubernetes custom resources, Chaos Dashboard and the kubectl CLI |
| Release line | 2.8 (2.8.4, August 2026); 2.7 is the previous line |
Architecture
flowchart TB
USER[Engineer or pipeline] -->|kubectl or dashboard| API[Kubernetes API server]
DASH[Chaos Dashboard<br/>UI, API, RBAC] --> API
API --> CM
subgraph CP[Chaos Mesh control plane]
CM[Controller Manager<br/>fault, workflow and schedule controllers]
WH[Admission webhooks<br/>validate and mutate]
end
CM -->|instructs| D1[Chaos Daemon<br/>node A privileged DaemonSet]
CM -->|instructs| D2[Chaos Daemon<br/>node B privileged DaemonSet]
D1 -->|enters namespaces| P1[Target pods<br/>network, I/O, CPU, kernel faults]
D2 -->|enters namespaces| P2[Target pods]
CM -->|cloud faults| CLOUD[Cloud APIs<br/>AWS, Azure, GCP]
P1 --> OBS[Prometheus and Grafana<br/>steady state signals]
P2 --> OBS
| Component | Responsibility |
|---|---|
| Controller Manager | The control plane. It reconciles fault resources, runs the Workflow and Schedule controllers, and hosts the admission webhooks. |
| Chaos Daemon | A privileged DaemonSet on every node. It enters the namespaces of target pods to inject and remove faults. Its privileges can be restricted. |
| Chaos Dashboard | A web interface and API for designing, running and watching experiments, with role-based access control. |
| Fault resources | One custom resource per fault family, for example PodChaos, NetworkChaos, IOChaos, StressChaos and HTTPChaos. |
| Workflow | Chains several experiments, with serial and parallel steps and status checks, into one scenario. |
| Schedule | Runs an experiment on a recurring cron schedule. |
Design principle. Chaos Mesh treats a fault as declarative Kubernetes configuration. An experiment is a reviewed manifest in Git with a selector, a duration and a mode, so it can be applied, scheduled, audited and removed like any other resource, and a delete or timeout reverts the fault.
Production reference design
A common pattern on EKS, GKE, AKS or on-premises Kubernetes: install it in a dedicated namespace, run experiments first in staging, and enable them in production only for narrow, approved cases.
- Install with Helm, pinning a version and setting the container runtime that your nodes use:
Check the runtime and socket path against your node image, and the chart values against the chart version you install.helm repo add chaos-mesh https://charts.chaos-mesh.org helm install chaos-mesh chaos-mesh/chaos-mesh \ -n chaos-mesh --create-namespace \ --version <version> \ --set chaosDaemon.runtime=containerd \ --set chaosDaemon.socketPath=/run/containerd/containerd.sock - Limit where chaos can run. Enable authorisation and namespace filtering so faults only reach namespaces that are annotated for chaos, and give engineers RBAC for specific namespaces rather than cluster-wide access.
- Define the steady state first. Pick the signals that show the service is healthy, such as request success rate and latency, and put them on a Grafana dashboard before injecting anything.
- Write the first experiment as a manifest, with a small blast radius:
apiVersion: chaos-mesh.org/v1alpha1 kind: NetworkChaos metadata: { name: orders-latency, namespace: chaos-testing } spec: action: delay mode: one selector: namespaces: [orders] labelSelectors: { app: orders-api } delay: { latency: 200ms, jitter: 50ms } duration: 5m - Compose scenarios. Use a
Workflowto combine faults, for example a network delay followed by a pod kill, with a status check that aborts the run if an error-rate threshold is crossed. - Schedule and automate. Use a
Schedulefor recurring checks in staging, and trigger experiments from CI after a deployment. Keep manifests in Git and apply them with Argo CD or Flux. - Close the loop. Record each experiment’s hypothesis, result and fix, and rerun it after the fix.
Typical production uses include validating retries and timeouts, rehearsing node and zone failures, testing autoscaling and failover of databases and message brokers, and running regular game days.
Operational considerations
- The daemon is privileged. It needs access to the container runtime and node namespaces. Restrict who can create chaos resources, enable namespace filtering, and review its security context against your cluster policy.
- Match the runtime. The daemon talks to containerd, CRI-O or Docker through a socket, so a wrong runtime or path in the install is the most common cause of failed injections.
- Control the blast radius. Start with one pod, a short duration and a clear abort condition. Use
mode, selectors anddurationto bound each run, and know how to delete the resource to stop it. - Avoid unreviewed production runs. Run in production only with an agreed hypothesis, a named owner, an on-call engineer watching and an off switch.
- Measure, do not guess. An experiment without steady state metrics only shows that something broke. Wire experiments to the same dashboards and alerts that production uses.
- Keep versions aligned. Upgrade the CRDs with the chart, read the release notes for each minor release, and avoid running mixed versions of the controller and daemon.
Adoption
- Coverage of the move to Incubating named DataStax, Percona and Prudential among more than 50 organisations using Chaos Mesh in production at that time, and reported that Digital China combines it with its DevOps platform.
- Microsoft Azure Chaos Studio integrates Chaos Mesh to run faults on Kubernetes workloads.
- PingCAP created the project from its work testing TiDB and continues to contribute, and the project keeps a public adopters list in its repository.
Alternatives
| Solution | Model | Best suited to |
|---|---|---|
| Litmus | CNCF Incubating, Kubernetes chaos with an experiment hub and workflows | Teams that want a shared library of ready-made experiments |
| Chaosblade | CNCF Sandbox, fault injection for hosts, containers and applications | Mixed estates that include non-Kubernetes hosts |
| AWS Fault Injection Service and Azure Chaos Studio | Managed fault injection in a single cloud | Teams that want cloud-level faults with provider IAM and audit |
| Gremlin | Commercial chaos platform | Organisations that want a supported product and reporting |
| Chaos Toolkit and chaoskube | Scriptable experiments and random pod termination | Simple experiments driven from CI or scripts |
Strengths and limitations
| Strengths | Limitations |
|---|---|
| Declarative, Git-friendly experiments through Kubernetes custom resources | Kubernetes-focused, with less coverage for non-containerised hosts |
| Broad fault coverage: pods, network, I/O, kernel, stress, time and cloud APIs | The privileged daemon widens the attack surface and needs governance |
| Workflows, schedules and a dashboard cover one-off and recurring use | Needs good steady state metrics, or results are hard to interpret |
| Incubating CNCF project with an active release cadence | Runtime and kernel specifics can make injection fail on unusual nodes |
| Works with Prometheus, Grafana and GitOps tooling | A fault can outlast an experiment if cleanup fails, so abort paths matter |
Recommendation
Adopt Chaos Mesh for Kubernetes teams that want declarative, repeatable fault injection in staging and approved production game days. Start with a small blast radius, define steady state metrics first, restrict the namespaces and people allowed to inject faults, and keep experiments in Git. Assess Litmus alongside it if a shared experiment library matters more than fault breadth, and a managed cloud fault service if most risk sits in cloud infrastructure.
References: CNCF project page · Chaos Mesh joins CNCF as a Sandbox project · PingCAP: Announcing Chaos Mesh as a CNCF Sandbox project · FOSS Force: CNCF moves Chaos Mesh to its incubator · Chaos Mesh documentation · Chaos Mesh on GitHub