Хаос-эксперименты Litmus
Updated Jul 2026
Что такое LitmusChaos?
LitmusChaos — это инкубируемый проект CNCF (Cloud Native Computing Foundation), предоставляющий полноценный фреймворк для практики хаос-инженерии в Kubernetes. Он предлагает богатую библиотеку готовых экспериментов, декларативное определение экспериментов на основе YAML и встроенные пробы для валидации поведения системы во время хаоса.
Для QA-архитекторов, работающих с системами на базе Kubernetes, Litmus является наиболее практичной отправной точкой для хаос-инженерии, поскольку он нативно интегрируется с API Kubernetes и следует привычным паттернам ресурсов Kubernetes.
Архитектура Litmus
+-------------------+
| ChaosCenter UI | Optional web dashboard for experiment management
+--------+----------+
|
v
+--------+----------+
| Chaos Operator | Watches for ChaosEngine resources
| (K8s Controller) |
+--------+----------+
|
v
+--------+----------+
| ChaosEngine | Links an experiment to a target application
+--------+----------+
|
v
+--------+----------+
| ChaosExperiment | Defines WHAT failure to inject (pod-kill, network-loss, etc.)
+--------+----------+
|
v
+--------+----------+
| Runner Pod | Executes the experiment and collects results
+--------+----------+
|
v
+--------+----------+
| ChaosResult | Stores the experiment outcome (Pass/Fail/Awaited)
+------------------+
Написание первого эксперимента: удаление пода
Эксперимент pod-delete проверяет, что ваше приложение переживает завершение пода — самый базовый тест устойчивости. Если ваше приложение не выдерживает уничтожение пода, оно не выдержит ничего.
Шаг 1: Определение ChaosExperiment
# chaos-experiment-pod-delete.yaml
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosExperiment
metadata:
name: pod-delete
namespace: litmus
spec:
definition:
scope: Namespaced
permissions:
- apiGroups: ["", "apps"]
resources: ["pods", "deployments"]
verbs: ["get", "list", "delete"]
args:
- -c
- ./experiments -name pod-delete
env:
- name: TOTAL_CHAOS_DURATION
value: "60" # chaos lasts 60 seconds
- name: CHAOS_INTERVAL
value: "10" # kill a pod every 10 seconds
- name: FORCE
value: "false" # graceful termination (SIGTERM)
- name: TARGET_PODS
value: "" # random pod selection
- name: PODS_AFFECTED_PERC
value: "50" # kill 50% of pods
Шаг 2: Создание ChaosEngine
ChaosEngine связывает эксперимент с целевым приложением и определяет пробы наблюдаемости:
# chaos-engine-checkout.yaml
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: checkout-chaos
namespace: production
spec:
appinfo:
appns: production
applabel: app=checkout-service
appkind: deployment
engineState: active
chaosServiceAccount: litmus-admin
experiments:
- name: pod-delete
spec:
components:
env:
- name: TOTAL_CHAOS_DURATION
value: "120"
- name: PODS_AFFECTED_PERC
value: "50"
probe:
- name: "checkout-availability"
type: httpProbe
mode: Continuous
httpProbe/inputs:
url: "https://checkout.internal/health"
method:
get:
criteria: ==
responseCode: "200"
runProperties:
probeTimeout: 5s
interval: 5s
retry: 2
probePollingInterval: 2s
Шаг 3: Применение и мониторинг
# Apply the experiment and engine
kubectl apply -f chaos-experiment-pod-delete.yaml
kubectl apply -f chaos-engine-checkout.yaml
# Watch experiment progress
kubectl get chaosengine checkout-chaos -n production -w
# Check results when complete
kubectl get chaosresult checkout-chaos-pod-delete -n production -o yaml
Пробы Litmus: валидация поведения во время хаоса
Пробы — это то, что превращает хаос-эксперименты из «ломаем и надеемся» в «ломаем и измеряем». Litmus поддерживает четыре типа проб:
HTTP-проба
Непрерывно проверяет, что HTTP-эндпоинт возвращает ожидаемые ответы во время хаоса:
probe:
- name: "api-health-check"
type: httpProbe
mode: Continuous
httpProbe/inputs:
url: "https://api.internal/health"
method:
get:
criteria: ==
responseCode: "200"
runProperties:
probeTimeout: 10s
interval: 5s
retry: 3
Командная проба
Запускает shell-команду и оценивает её код возврата или вывод:
probe:
- name: "database-connectivity"
type: cmdProbe
mode: Edge # runs at start and end of chaos
cmdProbe/inputs:
command: "pg_isready -h db.internal -p 5432"
comparator:
type: int
criteria: ==
value: "0" # exit code 0 = success
runProperties:
probeTimeout: 15s
Prometheus-проба
Выполняет запросы к Prometheus и проверяет, что значения метрик остаются в допустимых пределах:
probe:
- name: "error-rate-within-slo"
type: promProbe
mode: Continuous
promProbe/inputs:
endpoint: "http://prometheus.monitoring:9090"
query: >
sum(rate(http_requests_total{status=~"5..",service="checkout"}[5m]))
/
sum(rate(http_requests_total{service="checkout"}[5m]))
comparator:
type: float
criteria: <
value: "0.01" # error rate must stay under 1%
runProperties:
probeTimeout: 10s
interval: 30s
Kubernetes-проба
Проверяет состояние ресурсов Kubernetes:
probe:
- name: "min-replicas-available"
type: k8sProbe
mode: Continuous
k8sProbe/inputs:
group: apps
version: v1
resource: deployments
namespace: production
fieldSelector: "metadata.name=checkout-service"
operation: present
runProperties:
probeTimeout: 10s
interval: 10s
Распространённые паттерны экспериментов
Сетевой хаос: моделирование задержки
# network-latency-experiment.yaml
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosExperiment
metadata:
name: pod-network-latency
namespace: litmus
spec:
definition:
scope: Namespaced
env:
- name: TOTAL_CHAOS_DURATION
value: "120"
- name: NETWORK_LATENCY
value: "500" # 500ms additional latency
- name: JITTER
value: "100" # +/- 100ms jitter
- name: DESTINATION_IPS
value: "" # all destinations
- name: DESTINATION_HOSTS
value: "payment-service.production.svc.cluster.local"
DNS-хаос: моделирование сбоев разрешения имён
# dns-chaos-experiment.yaml
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosExperiment
metadata:
name: pod-dns-error
namespace: litmus
spec:
definition:
scope: Namespaced
env:
- name: TOTAL_CHAOS_DURATION
value: "60"
- name: TARGET_HOSTNAMES
value: "external-api.vendor.com"
- name: CHAOS_TYPE
value: "error" # return NXDOMAIN for target hostnames
Заполнение диска: моделирование нагрузки на хранилище
# disk-fill-experiment.yaml
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosExperiment
metadata:
name: disk-fill
namespace: litmus
spec:
definition:
scope: Namespaced
env:
- name: TOTAL_CHAOS_DURATION
value: "120"
- name: FILL_PERCENTAGE
value: "90" # fill disk to 90%
- name: CONTAINER_PATH
value: "/var/log" # target the log directory
Автоматизация Litmus в CI/CD
Интегрируйте хаос-эксперименты в ваш пайплайн деплоя, чтобы устойчивость валидировалась при каждом релизе:
# .github/workflows/chaos-gate.yml
name: Chaos Resilience Gate
on:
push:
branches: [main]
jobs:
chaos-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup kubectl
uses: azure/setup-kubectl@v3
- name: Deploy to staging
run: kubectl apply -f k8s/staging/
- name: Wait for rollout
run: kubectl rollout status deployment/checkout-service -n staging --timeout=300s
- name: Run pod-delete chaos experiment
run: |
kubectl apply -f chaos/experiments/pod-delete.yaml
kubectl apply -f chaos/engines/checkout-pod-delete.yaml
- name: Wait for chaos completion
run: |
kubectl wait --for=condition=complete \
chaosresult/checkout-chaos-pod-delete \
-n staging --timeout=600s
- name: Validate chaos result
run: |
VERDICT=$(kubectl get chaosresult checkout-chaos-pod-delete \
-n staging -o jsonpath='{.status.experimentStatus.verdict}')
echo "Chaos experiment verdict: $VERDICT"
if [ "$VERDICT" != "Pass" ]; then
echo "FAIL: System did not survive chaos experiment"
exit 1
fi
Лучшие практики проектирования экспериментов
- Одна переменная за раз. Не внедряйте сетевую задержку и не уничтожайте поды одновременно в первых экспериментах. Изолируйте переменные, чтобы понять каждый режим отказа независимо.
- Определяйте пробы перед запуском. Если вы запускаете эксперимент без проб, вы просто ломаете вещи без измерения воздействия.
- Начинайте с наименьшего радиуса поражения. Уничтожьте один под, а не 50%. Добавьте 100 мс задержки, а не 5 секунд. Увеличивайте постепенно по мере роста уверенности.
- Документируйте каждый эксперимент. Фиксируйте гипотезу, конфигурацию, результаты и пункты действий. Это создаёт институциональные знания о режимах отказа вашей системы.
- Делайте эксперименты идемпотентными. Повторный запуск одного и того же эксперимента не должен оставлять систему в другом состоянии. Litmus автоматически выполняет очистку, но убедитесь, что ваши пробы не создают побочных эффектов.