В этой статье мы поговорим об использовании Chaos Mesh — опенсорс-фреймворка для хаос-инжиниринга в Kubernetes. Все развёртывания из этой статьи доступны на GitLab. Клонируйте репозиторий и продолжайте читать. Хаос-инжиниринг — это проведение продуманных и спланированных экспериментов, которые показывают, как система ведёт себя в непредвиденных ситуациях. Мы создаём для системы стрессовые условия и пытаемся заранее найти и исправить возможные сбои, пока не случилось что-то страшное. Сначала мы формулируем гипотезу о том, как должна вести себя система, когда что-то пойдёт не так. Затем мы разрабатываем эксперимент в минимальном масштабе. Наконец, мы на каждом этапе измеряем последствия сбоя, обращая внимание на признаки успеха и неудачи. После эксперимента мы начинаем лучше понимать поведение системы в реальном мире. Впервые концепцию хаос-инжиниринга предложил Netflix в 2012 году. Они придумали Chaos Monkey — инструмент, который вносит разные ошибки в инфраструктуру и бизнес-систему. С этого началась история хаос-инжиниринга. Netflix создали Chaos Monkey при переходе с физической инфраструктуры в облако Amazon Web Services, чтобы убедиться, что потеря инстанса Amazon не повлияет на стабильность стриминга. Chaos Monkey случайным образом завершает инстансы виртуальных машин и контейнеры в продакшене, чтобы инженеры сразу видели, насколько их сервисы надёжны и устойчивы к незапланированным сбоям. Chaos Mesh — это облачная опенсорс-платформа для хаос-инжиниринга в Kubernetes. Chaos Mesh включает методы внесения ошибок для сложных систем в Kubernetes на уровне pod’ов, сети, файловой системы и даже ядра. Эксперименты можно проводить прямо в продакшене, не меняя логику развёртывания приложения. Мы в реальном времени видим состояние эксперимента и можем быстро откатывать внесённые ошибки. В Chaos Mesh есть дашборд с пользовательским веб-интерфейсом для проектирования сценариев и визуализации состояния экспериментов. Chaos Mesh использует Kubernetes CRD (Custom Resource Definition — кастомные определения ресурсов) нескольких типов, в зависимости от места возникновения сбоев: сбои на уровне ресурсов, сбои на уровне платформы и сбои на уровне приложения. В этом эксперименте мы использовали кластер Kubernetes на базе Minikube в окружении разработки. При установке Chaos Mesh в окружении тестирования (разработки), создаётся пространство имён Kubernetes chaos-testing. Дашборд Chaos Mesh предоставляется через порт 2333 и сервис NodePort. Есть два способа запускать эксперименты в Chaos Mesh: напрямую на дашборде или через YAML. Здесь мы запустили четыре эксперимента: pod-failure, pod-kill, stress, http-abort. В Chaos Mesh их гораздо больше — см. документацию по Chaos Mesh и интерактивные руководства. Эксперименты выполнялись в кластере nginx из трёх нод. Развёртывание кластера nginx: Эксперименты PodChaos симулируют сценарии сбоя указанных pod’ов или контейнеров. Сейчас в категорию PodChaos входят типы pod-failure, pod-kill, container-kill. В следующем эксперименте Chaos Mesh внедряет pod-failure в указанный pod nginx, и pod становится недоступен на 30 секунд. Для выбора pod’а используется флаг labelSelectors. Эксперимент со сбоями pod’а: Развернуть эксперимент можно командой kubectl apply -f chaos-pod-failure.yaml. После развёртывания мы можем просматривать статус эксперимента на дашборде Chaos Mesh.   В следующем эксперименте Chaos Mesh внедряет pod-kill в указанный pod nginx и уничтожает pod. Эксперимент с уничтожением pod’а: Развернуть эксперимент можно командой kubectl apply -f chaos-pod-kill.yaml. После развёртывания мы можем просматривать статус эксперимента на дашборде Chaos Mesh. Эксперименты StressChaos в Chaos Mesh симулируют повышенную нагрузку в контейнерах. Следующий эксперимент создаст процесс в выбранном контейнере (nginx) и будет постоянно выделять память и выполнять чтение и запись, заняв до 256 МБ. Развернуть эксперимент можно командой kubectl apply -f chaos-stress.yaml. Результаты эксперимента на дашборде Chaos Mesh: HTTPChaos имитирует сбой HTTP-сервера во время обработки HTTP-запросов и ответов. HTTPChaos поддерживает имитацию четырёх действий: abort (прерывание), delay (задержка), replace (замена) и patch (исправление). В этом эксперименте Chaos Mesh каждые 10 минут внедряет abort в указанный pod на 5 минут. В это время запросы GET через порт 80 по пути /api на целевом pod’е будут прерваны. Развернуть эксперимент можно командой kubectl apply -f chaos-http-abort.yaml. Результаты эксперимента можно посмотреть на дашборде Chaos Mesh.