Chaos Engineering и проверка отказоустойчивости
↑ Этап 8 · Senior: надёжность, безопасность, платформа
Зачем это на собесе
Проверка отказоустойчивости не на бумаге, а экспериментами: методология и инструменты.
Что это
Chaos Engineering — дисциплина экспериментов над системой для выявления слабых мест и повышения уверенности в её способности выдерживать турбулентные условия в продакшне (Netflix Chaos Monkey → Principles of Chaos). Цель — не «сломать», а научиться и улучшить устойчивость до реального инцидента.
Принципы
- Определить устойчивое состояние (steady state): измеримые показатели нормального поведения (SLI: успешность, латентность, бизнес-метрики).
- Сформулировать гипотезу: «при отказе одного пода/зоны/зависимости steady state сохранится (ошибки < 1%, p95 < 500 мс)».
- Внести реалистичные события (отказ инстанса, задержка сети, недоступность зависимости, нехватка ресурсов, сбой DNS/времени).
- Наблюдать метрики и сравнивать с контрольной группой/базой.
- Опровергнуть гипотезу — значит найти уязвимость; исправить.
- Минимизировать радиус поражения (blast radius): начинать с малого (один под, 1% трафика, staging), автоматическая остановка (abort conditions) при превышении порогов.
- Автоматизировать и повторять (в CI/по расписанию), расширять на прод по мере зрелости.
Цикл эксперимента
Steady state → Гипотеза → План (масштаб, условия остановки, откат, оповещения) → Запуск → Наблюдение → Анализ → Улучшения → ПовторПодготовка: мониторинг и алерты работают (иначе ничего не увидим), есть откат/кнопка остановки, заинтересованные предупреждены (game day), выбрано безопасное окно, проверены зависимости.
Типы экспериментов
| Категория | Примеры |
|---|---|
| Инфраструктура | убить ВМ/ноду, отключить зону доступности, заполнить диск, CPU/память-стресс, потеря сетевого интерфейса |
| Kubernetes | удаление подов, отказ ноды (drain/kill), эвикция, сбой kubelet/CNI, нехватка ресурсов, отказ etcd/API-сервера |
| Сеть | задержка (latency), потери пакетов, дублирование, разрыв соединений, партиции (split-brain), ограничение пропускной способности, DNS-сбои, блокировка портов |
| Приложение/зависимости | недоступность БД/кэша/очереди/внешнего API, медленные ответы (latency injection), ошибки HTTP 5xx (fault injection), истечение сертификата, исчерпание пула соединений/потоков |
| Состояние и данные | потеря реплики БД, failover, отставание репликации, повреждение/потеря сообщений, сбой бэкапа и восстановление |
| Время и часы | сдвиг времени (clock skew) — ломает токены, сертификаты, кворумы |
| Процессы/люди | отказ дежурного, недоступность системы доступа (учения реагирования), потеря runbook |
| Безопасность | компрометация учётной записи (red team), отзыв секретов/ключей |
Инструменты
| Инструмент | Особенности |
|---|---|
| Chaos Mesh (CNCF) | Kubernetes: PodChaos, NetworkChaos, IOChaos, StressChaos, TimeChaos, DNSChaos, HTTPChaos, Workflow, Dashboard |
| LitmusChaos (CNCF) | Kubernetes, ChaosHub экспериментов, ChaosCenter |
| Gremlin | коммерческая платформа (SaaS), широкий набор, безопасность |
| AWS FIS, Azure Chaos Studio, GCP | облачные сервисы внедрения сбоев |
| Chaos Monkey / Simian Army | Netflix (случайное завершение инстансов) |
| Toxiproxy | прокси для внедрения сетевых сбоев между сервисами (тесты) |
| Pumba | Docker: kill, pause, netem |
tc/netem, stress-ng, iptables, kill | ручные эксперименты на Linux |
| Istio/Linkerd fault injection, Envoy | задержки и ошибки на уровне mesh |
| k6 + xk6-disruptor | нагрузка + внедрение сбоев |
| Steadybit, ChaosToolkit | оркестрация экспериментов как код |
# Chaos Mesh: задержка сети 200 мс для подов api на 5 минут
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata: { name: api-latency, namespace: chaos-testing }
spec:
action: delay
mode: fixed-percent
value: "50"
selector: { namespaces: [clinic], labelSelectors: { app: api } }
delay: { latency: 200ms, jitter: 50ms, correlation: "50" }
duration: 5m
---
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata: { name: kill-one-api, namespace: chaos-testing }
spec:
action: pod-kill
mode: one
selector: { namespaces: [clinic], labelSelectors: { app: api } }Простейший ручной эксперимент: kubectl delete pod -l app=api --field-selector ... при нагрузке k6, наблюдая дашборд SLI и проверка, что PDB/реплики/readiness справились.
Game Days
Плановое учение: команда собирается, проводит серию экспериментов/сценариев по заранее подготовленному плану, отрабатывает реакцию (мониторинг, эскалации, runbooks, коммуникации, откат), фиксирует выводы.
Структура: цели и гипотезы → роли (руководитель, наблюдатели, «хаос»-оператор, дежурные) → сценарии (с нарастающей сложностью) → правила безопасности (стоп-слово, условия остановки) → выполнение → разбор (blameless) → задачи на улучшение.
Сценарии: потеря зоны доступности (проверка multi-AZ и запаса ёмкости), отказ БД/failover (Patroni), истечение сертификата, недоступность IdP, удаление секрета, отказ реестра образов, деградация внешнего API, шторм ретраев, массовый рестарт, восстановление из бэкапа, отказ мониторинга («слепой» режим).
Что проверять
- HA и восстановление: реплики, PDB, anti-affinity, авто-перезапуск, время failover (фактический RTO);
- таймауты/ретраи/circuit breaker/bulkhead: корректны ли, не создают ли шторм повторов;
- graceful degradation: функциональность при недоступности зависимости;
- автомасштабирование: реагирует ли вовремя (HPA, CA);
- Мониторинг и алерты: сработали ли, вовремя ли, понятны ли runbook;
- Данные: отсутствие потерь (RPO), идемпотентность, консистентность после восстановления;
- Безопасность: ограничения RBAC/NetworkPolicy при сбоях, реакция на компрометацию;
- Людские процессы: эскалации, коммуникации, знание runbook;
- Ёмкость: хватает ли запаса при потере N%.
Безопасность экспериментов
- начинать в dev/staging, затем canary-срез продакшна (1–5% трафика/одна ячейка) в рабочее время, при наличии дежурных;
- автоматические условия остановки (SLO burn, ошибки > порога), кнопка аварийной остановки, ограниченная длительность;
- явные разрешения и календарь экспериментов, уведомления (чтобы не путать с реальными инцидентами);
- не проверять то, что заведомо сломает (сначала тесты и статический анализ); эксперимент с гипотезой, а не случайное разрушение;
- защита данных: не портить реальные данные клиентов, использовать тестовые/теневые наборы;
- соответствие требованиям (регуляторика), согласование с бизнесом;
- RBAC для инструмента хаоса (строго ограничить namespaces и действия), аудит запусков.
Внедрение и зрелость
| Уровень | Практика |
|---|---|
| 0 | нет экспериментов |
| 1 | ручные эксперименты в dev/staging, game day раз в полгода |
| 2 | автоматизированные эксперименты в CI/staging (после деплоя), регулярные game days |
| 3 | эксперименты в проде в малом масштабе (canary), условия остановки по SLO |
| 4 | непрерывный хаос как часть платформы (continuous verification), интеграция с SLO, автоматические регрессии устойчивости |
Первые шаги: выбрать критичный сервис и самый вероятный сбой («падение одной реплики», «недоступен кэш», «задержка БД»), сформулировать гипотезу по SLI, провести на staging под нагрузкой, исправить найденное, автоматизировать. Результаты фиксировать в реестре (что проверили, что нашли, что исправили).
Связь с другими практиками
- SRE/SLO: хаос проверяет, выдерживает ли система SLO при отказах; error budget определяет, когда можно экспериментировать;
- HA и DR: проверка на практике (failover, восстановление);
- Observability: без хороших метрик/логов/трейсов эксперименты бесполезны;
- Incident Management: game days тренируют on-call;
- Performance/load testing: совместно (нагрузка + сбой);
- Security: red team/purple team — хаос для безопасности.
Частые находки
- отсутствующие таймауты и бесконечные ретраи → каскад;
- readiness/liveness не отражают реальность;
- одна реплика «на всякий случай» или все реплики в одной зоне;
- кэш упал → БД не выдержала (нет защиты/деградации);
- секреты/сертификаты истекли без алертов;
- runbook устарел, доступы отсутствуют, мониторинг «слеп» при отказе;
- автомасштабирование слишком медленное, лимиты квот;
- зависимость от единого DNS/реестра/CI/Vault;
- неверные PodDisruptionBudget блокируют обновления.
Вопросы с ответами
С чего начать внедрение Chaos Engineering?
Определить steady state по SLI критичного сервиса, сформулировать гипотезу (например, падение одной реплики не влияет на ошибки), выполнить небольшой эксперимент на staging под нагрузкой с условиями остановки, исправить найденное и автоматизировать повторение.
Что такое blast radius и как его ограничить?
Масштаб воздействия эксперимента. Ограничивают началом с малого (один под, 1% трафика, staging), селекторами, лимитом времени, автоматическим прерыванием при нарушении порогов и наличием откатa.
Чем game day отличается от автоматических экспериментов?
Game day — плановое совместное учение людей и процессов (реакция, коммуникации, runbooks), а автоматические эксперименты регулярно проверяют устойчивость технической системы без участия всей команды.