Je cluster ziet er gezond uit. Pods draaien. Metrics zijn groen. Alles werkt.

Tot een node faalt tijdens piekverkeer. Of de database connection pool uitgeput raakt. Of die ene service die niemand zich herinnert gedeployed te hebben al het beschikbare geheugen begint op te eten.

Je kunt wachten tot deze dingen gebeuren in productie om 3 uur ’s nachts. Of je kunt opzettelijk dingen kapot maken, op jouw voorwaarden, en de zwakheden fixen voor ze storingen worden.

Dit is chaos engineering.

Waarom Dingen Opzettelijk Kapot Maken?

Gedistribueerde systemen falen op gedistribueerde manieren. Je kunt niet elke failure mode anticiperen door code te lezen of architectuurdiagrammen te tekenen. De enige manier om te weten hoe je systeem zich gedraagt onder failure is om het te laten falen.

Chaos engineering is niet:

  • Willekeurige destructie
  • Testen in productie zonder voorbereiding
  • Dingen kapot maken om te zien wat er gebeurt

Chaos engineering is:

  • Hypothese-gedreven experimenteren — “We geloven dat het systeem node failure graceful afhandelt”
  • Gecontroleerde fault injection — Bekende blast radius, gedefinieerde duur, rollback klaar
  • Leren van failures — Elk experiment verbetert begrip

Netflix pioniererde dit met Chaos Monkey — willekeurig instanties doden om te zorgen dat engineers resiliente services bouwden. Vandaag is de praktijk volwassen geworden met geavanceerde tools en methodologieën.

Het Chaos Engineering Proces

flowchart TD
    subgraph process["Chaos Engineering Cyclus"]
        H["Definieer Hypothese"]
        E["Ontwerp Experiment"]
        R["Draai in Gecontroleerde Omgeving"]
        O["Observeer & Meet"]
        L["Leer & Verbeter"]
    end

    H --> E --> R --> O --> L
    L --> H

1. Definieer Hypothese

Begin met wat je gelooft dat waar is:

  • “Als één node faalt, zullen pods binnen 5 minuten reschedulen”
  • “Als de database traag wordt, zal de API graceful degraderen, niet crashen”
  • “Als DNS faalt, zullen gecachete responses requests bedienen voor 30 seconden”

2. Ontwerp Experiment

Definieer:

  • Blast radius: Wat kan beïnvloed worden?
  • Duur: Hoe lang blijft de fault bestaan?
  • Rollback: Hoe stop je direct?
  • Metrics: Wat indiceert succes of falen?

3. Draai in Gecontroleerde Omgeving

Begin klein:

  1. Development omgeving eerst
  2. Dan staging
  3. Productie alleen met safeguards

4. Observeer en Meet

Kijk naar je observability stack. Belangrijke vragen:

  • Vuurden alerts correct?
  • Hoe veranderde latency?
  • Stegen error rates?
  • Hoe lang tot recovery?

5. Leer en Verbeter

Documenteer bevindingen. Fix zwakheden. Update runbooks. Ontwerp dan het volgende experiment.

Litmus Chaos: Kubernetes-Native Chaos

Litmus is een CNCF project dat chaos engineering voor Kubernetes biedt. Het is declaratief, GitOps-vriendelijk, en uitgebreid.

Litmus Installeren

# Voeg Litmus helm repo toe
helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/
helm repo update

# Installeer Litmus
helm install litmus litmuschaos/litmus \
  --namespace litmus \
  --create-namespace \
  --set portal.frontend.service.type=ClusterIP

Litmus Architectuur

flowchart TD
    subgraph litmus["Litmus Componenten"]
        subgraph control["Control Plane"]
            Portal["Litmus Portal<br/>(UI/API)"]
            Server["Litmus Server"]
        end
        subgraph exec["Execution Plane"]
            Sub["Subscriber"]
            Runner["Chaos Runner"]
            Exp["Chaos Experiments"]
        end
    end

    Portal --> Server
    Server --> Sub
    Sub --> Runner
    Runner --> Exp
    Exp --> Target["Target Workload"]

ChaosEngine: Experimenten Declareren

apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
  name: nginx-chaos
  namespace: default
spec:
  appinfo:
    appns: 'default'
    applabel: 'app=nginx'
    appkind: 'deployment'
  engineState: 'active'
  chaosServiceAccount: litmus-admin
  experiments:
    - name: pod-delete
      spec:
        components:
          env:
            - name: TOTAL_CHAOS_DURATION
              value: '30'
            - name: CHAOS_INTERVAL
              value: '10'
            - name: FORCE
              value: 'false'

Dit doodt nginx pods elke 10 seconden voor 30 seconden totaal. Simpel, contained, observeerbaar.

Essentiële Chaos Experimenten

Pod-Level Chaos

Pod Delete: Dood pods om restart gedrag te testen

experiments:
  - name: pod-delete
    spec:
      components:
        env:
          - name: TOTAL_CHAOS_DURATION
            value: '60'
          - name: CHAOS_INTERVAL
            value: '10'
          - name: PODS_AFFECTED_PERC
            value: '50'  # Dood 50% van de pods

Container Kill: Dood specifieke containers binnen pods

experiments:
  - name: container-kill
    spec:
      components:
        env:
          - name: TARGET_CONTAINER
            value: 'sidecar'
          - name: CHAOS_INTERVAL
            value: '10'

Node-Level Chaos

Node Drain: Simuleer node onderhoud

apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
  name: node-drain-chaos
spec:
  engineState: 'active'
  auxiliaryAppInfo: ''
  chaosServiceAccount: litmus-admin
  experiments:
    - name: node-drain
      spec:
        components:
          env:
            - name: TOTAL_CHAOS_DURATION
              value: '60'
            - name: TARGET_NODE
              value: 'worker-1'

Node CPU Hog: Simuleer CPU druk

experiments:
  - name: node-cpu-hog
    spec:
      components:
        env:
          - name: TOTAL_CHAOS_DURATION
            value: '60'
          - name: NODE_CPU_CORE
            value: '2'  # Verbruik 2 cores

Network Chaos

Pod Network Loss: Simuleer network partities

experiments:
  - name: pod-network-loss
    spec:
      components:
        env:
          - name: NETWORK_INTERFACE
            value: 'eth0'
          - name: NETWORK_PACKET_LOSS_PERCENTAGE
            value: '100'  # Totaal verlies
          - name: TOTAL_CHAOS_DURATION
            value: '30'

Pod Network Latency: Injecteer latency

experiments:
  - name: pod-network-latency
    spec:
      components:
        env:
          - name: NETWORK_LATENCY
            value: '300'  # 300ms latency
          - name: JITTER
            value: '100'  # 100ms jitter

Storage Chaos

Disk Fill: Test disk druk afhandeling

experiments:
  - name: disk-fill
    spec:
      components:
        env:
          - name: FILL_PERCENTAGE
            value: '90'
          - name: TOTAL_CHAOS_DURATION
            value: '60'

Je Eerste Experiment Draaien

Laten we een compleet chaos experiment draaien tegen een voorbeeld applicatie.

1. Deploy Test Applicatie

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-app
  labels:
    app: demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - name: nginx
          image: nginx:alpine
          ports:
            - containerPort: 80
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 5
            periodSeconds: 5

2. Maak ServiceAccount voor Litmus

apiVersion: v1
kind: ServiceAccount
metadata:
  name: litmus-admin
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: litmus-admin
rules:
  - apiGroups: [""]
    resources: ["pods", "pods/exec", "pods/log", "events"]
    verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
  - apiGroups: ["apps"]
    resources: ["deployments", "replicasets"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: litmus-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: litmus-admin
subjects:
  - kind: ServiceAccount
    name: litmus-admin
    namespace: default

3. Draai Pod Delete Experiment

apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
  name: demo-chaos
  namespace: default
spec:
  appinfo:
    appns: 'default'
    applabel: 'app=demo'
    appkind: 'deployment'
  engineState: 'active'
  chaosServiceAccount: litmus-admin
  experiments:
    - name: pod-delete
      spec:
        components:
          env:
            - name: TOTAL_CHAOS_DURATION
              value: '30'
            - name: CHAOS_INTERVAL
              value: '10'
            - name: FORCE
              value: 'false'
        probe:
          - name: "check-endpoint"
            type: "httpProbe"
            httpProbe/inputs:
              url: "http://demo-app.default.svc:80"
              insecureSkipVerify: false
              method:
                get:
                  criteria: "=="
                  responseCode: "200"
            mode: "Continuous"
            runProperties:
              probeTimeout: 5
              interval: 2
              retry: 2

4. Observeer Resultaten

# Watch chaos engine status
kubectl get chaosengine demo-chaos -w

# Check chaos result
kubectl get chaosresult demo-chaos-pod-delete -o yaml

# Watch pod gedrag
kubectl get pods -l app=demo -w

Game Days: Oefenen voor Echte Incidenten

Chaos experimenten testen systemen. Game days testen mensen.

Een Game Day Plannen

  1. Definieer scope: Welke systemen, welke failure scenarios
  2. Stel team samen: Engineers die op echte incidenten zouden reageren
  3. Bereid runbooks voor: Documenteer verwachte responses
  4. Stel succescriteria: Hoe ziet “goed afgehandeld” eruit?
  5. Plan tijd: Dedicated tijd, niet gepropt tussen meetings

Game Day Structuur

09:00 - Briefing: Leg scope uit, regels, hoe af te breken
09:15 - Injecteer failure (team weet niet welke)
09:15 - Team reageert alsof echt incident
10:00 - Failure onthuld, extra scenarios geïntroduceerd
11:00 - Debrief: Wat werkte, wat niet, wat te verbeteren

Voorbeeld Scenarios

ScenarioWat Je Leert
Dood primaire databaseFailover snelheid, data integriteit
DNS storingCaching gedrag, timeout handling
Certificaat verlooptMonitoring gaps, renewal proces
Cloud regio onbeschikbaarMulti-regio readiness
Secrets manager downApplicatie gedrag zonder secrets

Integreren met GitOps

Chaos experimenten kunnen beheerd worden met ArgoCD:

# chaos-experiments/pod-delete.yaml (in Git)
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
  name: scheduled-pod-delete
  namespace: chaos-testing
spec:
  engineState: 'stop'  # Handmatig geactiveerd
  # ... experiment config

Workflow:

  1. Definieer experimenten in Git
  2. Sync met ArgoCD
  3. Activeer experimenten via engineState: 'active'
  4. Review resultaten
  5. Commit bevindingen en verbeteringen

Veiligheidsrichtlijnen

Wel Doen

  • Begin met non-productie omgevingen
  • Heb rollback procedures klaar
  • Monitor nauwlettend tijdens experimenten
  • Communiceer met stakeholders
  • Documenteer alles

Niet Doen

  • Experimenten draaien tijdens piekverkeer (tenzij dat specifiek getest wordt)
  • Chaos injecteren zonder het team te waarschuwen
  • De hypothese stap overslaan
  • Bevindingen negeren

Afbreek Condities

Definieer wanneer direct te stoppen:

  • Error rate overschrijdt X%
  • Latency overschrijdt Y seconden
  • Klantklachten ontvangen
  • Elk onverwacht gedrag
# Afbreken bij hoge error rate
probe:
  - name: "error-rate-check"
    type: "promProbe"
    promProbe/inputs:
      endpoint: "http://prometheus:9090"
      query: "rate(http_requests_total{status=~'5..'}[1m])"
      comparator:
        type: "float"
        criteria: "<"
        value: "0.1"  # Afbreken als > 10% errors

Een Chaos Cultuur Bouwen

Chaos engineering is geen tool. Het is een praktijk.

Begin klein:

  1. Draai één experiment in development
  2. Documenteer wat je leert
  3. Deel met het team
  4. Vergroot geleidelijk de scope

Vragen om te beantwoorden:

  • Wat gebeurt er als een node faalt?
  • Hoe gedraagt het systeem zich onder geheugendruk?
  • Wat als network latency 10x toeneemt?
  • Kunnen we een database replica verliezen zonder downtime?

Elk experiment dat een zwakheid onthult is een productie storing voorkomen.

Mijn Chaos Experimenten

In mijn homelab cluster draai ik regelmatig:

  1. Wekelijkse pod delete: Willekeurige pods in non-kritieke namespaces
  2. Maandelijkse node drain: Simuleer node failure
  3. Kwartaalse volledige game day: Multi-failure scenarios

Wat ik heb geleerd:

  • Longhorn handelt node failures graceful af
  • Sommige workloads hebben geen goede terminationGracePeriod
  • Alerting vuurt vaak te laat
  • Recovery is altijd langzamer dan verwacht

Waarom Dit Ertoe Doet

Productie zal je systemen testen. De enige vraag is of je ze eerst test.

Chaos engineering transformeert “we denken dat het resilient is” naar “we weten dat het X, Y, en Z failures overleeft.” Het verandert hoop in bewijs.

De systemen die echte storingen overleven zijn degene die ervoor geoefend hebben.


Maak dingen opzettelijk kapot, op jouw voorwaarden, overdag. Of wacht tot ze per ongeluk kapot gaan, om 3 uur ’s nachts, tijdens de drukste dag van het jaar. Jouw keuze.