Skip to main content

Chaos Engineering Command

Design, run, and debug Chaos Engineering experiments on Kubernetes.


Interactive Wizard (fires when no arguments are provided)​

When invoked with no arguments, ask before proceeding:

Q1 — Mode?

What do you need?
1. install — install Litmus Chaos or Chaos Mesh via Helm
2. experiment — design a fault injection experiment
3. schedule — wrap an experiment in a recurring schedule
4. gameday — run a structured GameDay experiment
5. debug — diagnose a failed or stuck experiment
6. report — summarize results after an experiment completes

Enter 1–6 or mode name:

After collecting the mode, ask one follow-up:

  • install: Which tool? Litmus Chaos (recommended default) or Chaos Mesh (network/IO faults)?
  • experiment: Describe the workload to target — name, namespace, fault type (pod-delete / network-loss / cpu-stress / node-drain):
  • schedule: Provide the experiment YAML or describe the experiment to wrap in a schedule:
  • gameday: State the steady-state hypothesis — what metric or probe proves the system is healthy?
  • debug: Describe the symptom or paste the ChaosEngine/ChaosResult status:
  • report: Paste the ChaosResult output or describe the experiment that ran:

Then proceed into the relevant mode below.


Mode: install​

Install Litmus Chaos or Chaos Mesh via Helm.

Steps:

  1. Choose the tool:

    • Litmus Chaos: CNCF graduated, ChaosCenter UI, broad experiment library → recommended default
    • Chaos Mesh: CNCF incubating, fine-grained NetworkChaos, IOChaos → choose for network partitions or I/O faults
  2. Install Litmus Chaos:

    helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/
    helm repo update
    helm upgrade --install chaos litmuschaos/litmus \
    --namespace litmus \
    --create-namespace \
    --version 3.9.0 \
    -f examples/chaos/litmus-install-values.yaml
  3. Install Chaos Mesh:

    helm repo add chaos-mesh https://charts.chaos-mesh.org
    helm repo update
    helm upgrade --install chaos-mesh chaos-mesh/chaos-mesh \
    --namespace chaos-mesh \
    --create-namespace \
    --version 2.7.0 \
    -f examples/chaos/chaos-mesh-install-values.yaml
  4. Verify:

    # Litmus
    kubectl get pods -n litmus
    # Chaos Mesh
    kubectl get pods -n chaos-mesh

    Expected: all pods Running

Mode: experiment​

Generate a fault experiment from a description.

Steps:

  1. Identify: tool (Litmus/Mesh), fault class (pod/network/stress/node), target workload name and namespace
  2. Require steady-state hypothesis before generating the experiment:
    • HTTP probe: URL + expected response code
    • Prometheus probe: PromQL query that returns 1 (healthy) or 0 (degraded)
  3. Generate the experiment CRD with:
    • Namespace-scoped label selector
    • duration or TOTAL_CHAOS_DURATION set (default 60s)
    • Probe section referencing the steady-state hypothesis
    • PODS_AFFECTED_PERC: "50" for initial runs (safe); increase to 100% for full resilience test
  4. Output: experiment YAML + kubectl apply command + expected ChaosResult verdict

See examples/chaos/pod-delete-experiment.yaml and examples/chaos/network-loss-experiment.yaml for complete examples.

Mode: schedule​

Wrap an experiment in a recurring schedule.

Steps:

  1. Litmus ChaosSchedule:

    apiVersion: litmuschaos.io/v1alpha1
    kind: ChaosSchedule
    metadata:
    name: pod-delete-weekly
    namespace: my-namespace
    spec:
    schedule:
    repeat:
    properties:
    minChaosInterval: "168h"
    engineTemplateSpec:
    appinfo:
    appns: my-namespace
    applabel: "app=my-service"
    appkind: deployment
    chaosServiceAccount: litmus-admin
    experiments:
    - name: pod-delete
    spec:
    components:
    env:
    - name: TOTAL_CHAOS_DURATION
    value: "60"
  2. Chaos Mesh Schedule:

    apiVersion: chaos-mesh.org/v1alpha1
    kind: Schedule
    metadata:
    name: network-loss-weekly
    namespace: my-namespace
    spec:
    schedule: "0 2 * * 1"
    type: NetworkChaos
    historyLimit: 5
    concurrencyPolicy: Forbid
    networkChaosTemplate:
    spec:
    action: loss
    mode: all
    selector:
    namespaces: [my-namespace]
    labelSelectors:
    app: my-service
    loss:
    loss: "20"
    duration: 60s
  3. Recommend staging only — never schedule experiments in production without a change window

Mode: gameday​

Run a structured GameDay experiment.

Steps:

  1. Define steady-state hypothesis:

    • What metric or probe proves the system is healthy?
    • What is the acceptable degradation threshold?
  2. Scope the blast radius:

    • Namespace: <namespace>
    • Label selector: app=<service-name>
    • Max affected pods: 50% for first run
  3. Inject the fault (reference experiment from experiment mode output)

  4. Observe:

    • Watch probe results in ChaosResult
    • Check Prometheus/Grafana for error rate, latency, saturation
    • Note time-to-detect if an alert fired
  5. Record the verdict:

    • PASS: steady-state probe held throughout, service recovered within SLO
    • FAIL: probe failed, alert did not fire within expected window, or recovery exceeded SLO
  6. Output DORA impact summary:

    • Change failure rate delta: did this fault class cause failures in past deploys?
    • MTTR observed: time from fault injection to steady-state restoration
    • Recommendation: improve circuit breaker / HPA config / replica count / PDB

Mode: debug​

If you need deeper context on troubleshooting, load references/chaos.md.

Diagnose a failed or stuck experiment.

Checklist:

  1. Is the controller running?

    kubectl get pods -n litmus # Litmus
    kubectl get pods -n chaos-mesh # Chaos Mesh
  2. Is the ChaosEngine/fault stuck?

    kubectl describe chaosengine <name> -n <namespace> # Litmus
    kubectl describe podchaos <name> -n <namespace> # Chaos Mesh
  3. Check the ChaosResult (Litmus only):

    kubectl get chaosresult -n <namespace>
    kubectl describe chaosresult <engine-name>-<experiment-name> -n <namespace>

    Look for status.experimentStatus.verdict and probe failure messages.

  4. Common causes:

    SymptomCauseFix
    Stuck InitializedMissing RBACkubectl get clusterrolebinding -l app.kubernetes.io/component=operator
    No pods targetedLabel selector wrongkubectl get pods -n <ns> -l <selector>
    Probe failingWrong URL or PromQLTest probe URL with curl from inside the namespace
    Experiment won't endMissing durationAdd duration: 60s (Chaos Mesh) or TOTAL_CHAOS_DURATION (Litmus)
    Controller crashloopingVersion mismatchRe-install matching chart version

Mode: report​

Summarize experiment results after completion.

Steps:

  1. Collect ChaosResult:

    kubectl get chaosresult -n <namespace> -o yaml
  2. Report:

    • Fault injected: type, duration, affected pods
    • Steady-state probe: pass/fail timeline (from ChaosResult probe status)
    • Recovery time: time from fault injection (status.experimentStatus.passedRuns) to probe passing again
    • Verdict: PASS / FAIL with reason
  3. DORA impact:

    • Was error rate SLO breached? → contributes to change failure rate
    • Recovery time → MTTR observation
    • Feed into DORA benchmark mode: /platform-skills:dora benchmark

After completing this task, log errors and learnings via /platform-skills:self-improve log.