В этой статье мы поговорим об использовании Chaos Mesh — опенсорс-фреймворка для хаос-инжиниринга в Kubernetes. Все развёртывания из этой статьи доступны на GitLab. Клонируйте репозиторий и продолжайте читать.

«Среди хаоса есть и возможности», Сунь-Цзы
«Среди хаоса есть и возможности», Сунь-Цзы

Хаос-инжиниринг

Хаос-инжиниринг — это проведение продуманных и спланированных экспериментов, которые показывают, как система ведёт себя в непредвиденных ситуациях. Мы создаём для системы стрессовые условия и пытаемся заранее найти и исправить возможные сбои, пока не случилось что-то страшное. Сначала мы формулируем гипотезу о том, как должна вести себя система, когда что-то пойдёт не так. Затем мы разрабатываем эксперимент в минимальном масштабе. Наконец, мы на каждом этапе измеряем последствия сбоя, обращая внимание на признаки успеха и неудачи. После эксперимента мы начинаем лучше понимать поведение системы в реальном мире.

Впервые концепцию хаос-инжиниринга предложил Netflix в 2012 году. Они придумали Chaos Monkey — инструмент, который вносит разные ошибки в инфраструктуру и бизнес-систему. С этого началась история хаос-инжиниринга. Netflix создали Chaos Monkey при переходе с физической инфраструктуры в облако Amazon Web Services, чтобы убедиться, что потеря инстанса Amazon не повлияет на стабильность стриминга. Chaos Monkey случайным образом завершает инстансы виртуальных машин и контейнеры в продакшене, чтобы инженеры сразу видели, насколько их сервисы надёжны и устойчивы к незапланированным сбоям.

Chaos Mesh

Chaos Mesh — это облачная опенсорс-платформа для хаос-инжиниринга в Kubernetes. Chaos Mesh включает методы внесения ошибок для сложных систем в Kubernetes на уровне pod’ов, сети, файловой системы и даже ядра. Эксперименты можно проводить прямо в продакшене, не меняя логику развёртывания приложения. Мы в реальном времени видим состояние эксперимента и можем быстро откатывать внесённые ошибки. В Chaos Mesh есть дашборд с пользовательским веб-интерфейсом для проектирования сценариев и визуализации состояния экспериментов.

Chaos Mesh использует Kubernetes CRD (Custom Resource Definition — кастомные определения ресурсов) нескольких типов, в зависимости от места возникновения сбоев: сбои на уровне ресурсов, сбои на уровне платформы и сбои на уровне приложения.

1. Basic resource faults
  1.1. PodChaos: simulates Pod failures, such as Pod node restart, Pod's persistent unavailablility, and certain container failures in a specific Pod.
  1.2. NetworkChaos: simulates network failures, such as network latency, packet loss, packet disorder, and network partitions.
  1.3. DNSChaos: simulates DNS failures, such as the parsing failure of DNS domain name and the wrong IP address returned.
  1.4. HTTPChaos: simulates HTTP communication failures, such as HTTP communication latency.
  1.5. StressChaos: simulates CPU race or memory race.
  1.6. IOChaos: simulates the I/O failure of an application file, such as I/O delays, read and write failures.
  1.7. TimeChaos: simulates the time jump exception.
  1.8. KernelChaos: simulates kernel failures, such as an exception of the application memory allocation.

2. Platform faults:
  2.1. AWSChaos: simulates AWS platform failures, such as the AWS node restart.
  2.2. GCPChaos: simulates GCP platform failures, such as the GCP node restart.

3. Application faults:
  3.1. JVMChaos: simulates JVM application failures, such as the function call delay.

Установка Chaos Mesh

В этом эксперименте мы использовали кластер Kubernetes на базе Minikube в окружении разработки. При установке Chaos Mesh в окружении тестирования (разработки), создаётся пространство имён Kubernetes chaos-testing. Дашборд Chaos Mesh предоставляется через порт 2333 и сервис NodePort.

# install chaos mesh
curl -sSL https://mirrors.chaos-mesh.org/v2.0.3/install.sh | bash

# check pods
kubectl get po -n chaos-testing

>> output
NAME                                        READY   STATUS    RESTARTS   AGE
chaos-controller-manager-68769d9df9-qt2js   1/1     Running   0          8m48s
chaos-daemon-9nhcs                          1/1     Running   0          8m49s
chaos-dashboard-6677f99c44-dfjzg            1/1     Running   0          8m48s

# check services
kubectl get svc -n chaos-testing

>> output
NAME                            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                       AGE
chaos-daemon                    ClusterIP   None            <none>        31767/TCP,31766/TCP           9m27s
chaos-dashboard                 NodePort    10.104.10.190   <none>        2333:31725/TCP                9m27s
chaos-mesh-controller-manager   ClusterIP   10.97.5.226     <none>        443/TCP,10081/TCP,10080/TCP   9m27s

---

# access chaos mesh dashboard via NodePort service
# dashboard run on port 2333 as NodePort service
# dashboard can acess via NodePort port 2333 mapping port, in my case port 31725
http://<minikube ip>:31725
http://192.168.64.17:31725/dashboard

# access dashboard via port forward 3333 -> 2333
# now dashboard can access via localhost:3333
kubectl port-forward -n chaos-testing chaos-dashboard-6677f99c44-dfjzg 8888:2333
http://localhost:3333

Эксперименты в Chaos Mesh

Есть два способа запускать эксперименты в Chaos Mesh: напрямую на дашборде или через YAML. Здесь мы запустили четыре эксперимента: pod-failure, pod-kill, stress, http-abort. В Chaos Mesh их гораздо больше — см. документацию по Chaos Mesh и интерактивные руководства. Эксперименты выполнялись в кластере nginx из трёх нод. Развёртывание кластера nginx:

apiVersion: v1
kind: Namespace
metadata:
  name: chaos

---

apiVersion: v1
kind: Service
metadata:
  name: nginxservice
  labels:
    name: nginxservice
  namespace: chaos
spec:
  ports:
    - port: 80
  selector:
    app: nginx
  type: LoadBalancer

---

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
  namespace: chaos
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
# deploy nginx
# it will create three node nginx cluster under namespace 'chaos'
kubectl apply -f nginx-deployment.yaml

# view pods
kubectl get pods -n chaos

NAME          READY   STATUS    RESTARTS   AGE
nginx-bmgbr   1/1     Running   0          36m
nginx-wlr8x   1/1     Running   0          36m
nginx-z9sl7   1/1     Running   0          36m

# get services
kubectl get svc -n chaos

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
nginxservice   LoadBalancer   10.96.3.122   <pending>     80:30773/TCP   37m

Эксперимент со сбоями pod’а

Эксперименты PodChaos симулируют сценарии сбоя указанных pod’ов или контейнеров. Сейчас в категорию PodChaos входят типы pod-failure, pod-kill, container-kill. В следующем эксперименте Chaos Mesh внедряет pod-failure в указанный pod nginx, и pod становится недоступен на 30 секунд. Для выбора pod’а используется флаг labelSelectors. Эксперимент со сбоями pod’а:

kind: PodChaos
apiVersion: chaos-mesh.org/v1alpha1
metadata:
  name: chaos-failure
  namespace: chaos
spec:
  selector:
    namespaces:
      - chaos
    labelSelectors:
      app: nginx
  mode: one
  action: pod-failure
  duration: 30s
  gracePeriod: 0

Развернуть эксперимент можно командой kubectl apply -f chaos-pod-failure.yaml. После развёртывания мы можем просматривать статус эксперимента на дашборде Chaos Mesh.

Эксперимент с уничтожением pod’а

В следующем эксперименте Chaos Mesh внедряет pod-kill в указанный pod nginx и уничтожает pod. Эксперимент с уничтожением pod’а:

kind: PodChaos
apiVersion: chaos-mesh.org/v1alpha1
metadata:
  name: chaos-kill
  namespace: chaos
spec:
  selector:
    namespaces:
      - chaos
    labelSelectors:
      app: nginx
  mode: one
  action: pod-kill
  duration: 30s
  gracePeriod: 0

Развернуть эксперимент можно командой kubectl apply -f chaos-pod-kill.yaml. После развёртывания мы можем просматривать статус эксперимента на дашборде Chaos Mesh.

Эксперимент с перегрузкой

Эксперименты StressChaos в Chaos Mesh симулируют повышенную нагрузку в контейнерах. Следующий эксперимент создаст процесс в выбранном контейнере (nginx) и будет постоянно выделять память и выполнять чтение и запись, заняв до 256 МБ.

kind: StressChaos
apiVersion: chaos-mesh.org/v1alpha1
metadata:
  name: chaos-stress
  namespace: chaos
spec:
  selector:
    namespaces:
      - chaos
    labelSelectors:
      app: nginx
  mode: one
  containerNames:
    - ''
  stressors:
    memory:
      workers: 4
      size: '256MB'
  duration: 60s

Развернуть эксперимент можно командой kubectl apply -f chaos-stress.yaml. Результаты эксперимента на дашборде Chaos Mesh:

Эксперимент с прерыванием HTTP

HTTPChaos имитирует сбой HTTP-сервера во время обработки HTTP-запросов и ответов. HTTPChaos поддерживает имитацию четырёх действий: abort (прерывание), delay (задержка), replace (замена) и patch (исправление). В этом эксперименте Chaos Mesh каждые 10 минут внедряет abort в указанный pod на 5 минут. В это время запросы GET через порт 80 по пути /api на целевом pod’е будут прерваны.

apiVersion: chaos-mesh.org/v1alpha1
kind: HTTPChaos
metadata:
  name: chaos-http-abort
spec:
  mode: all
  selector:
    labelSelectors:
      app: nginx
  target: Request
  port: 80
  method: GET
  path: /api
  abort: true
  duration: 5m
  scheduler:
    cron: '@every 10m'

Развернуть эксперимент можно командой kubectl apply -f chaos-http-abort.yaml. Результаты эксперимента можно посмотреть на дашборде Chaos Mesh.

Комментарии (0)