Рубрики
Uncategorized

K8S Chaos Dive: Часть Chaos-Mesh

В этой серии я прогуляю несколько разных предложений с открытым исходным кодом для выполнения тестирования хаоса / … Помечено с Куберовщиком, тестированием, учебным пособием, DEVOPS.

K8S Chaos Dive (3 части серии)

В этой серии я прогуляю несколько различных предложений с открытым исходным кодом для проведения тестирования/инженерии хаоса в кластерах Kubernetes.

В K8S Chaos Dive: Часть Chaos-Mesh 1 Я охватил введение в Хаос-сетка В котором мы установили инструментарий в наш кластер и использовали Подчаос Эксперимент по убру случайного процента PODS Nginx в расписании.

K8S Chaos Dive: Kube-обезьяна

Крейг Мортен · 19 августа20 · 10 мин читать

Убийство стручков может быть отличным упражнением для проверки устойчивости к смерти под струпу, что может произойти для списка причин в Кубернетах. Решения, как правило, вращаются вокруг горизонтального масштабирования (в зависимости от вашей целевой SLA):

  1. Убедитесь, что у вас есть достаточные реплики для вашего приложения для обработки <100% сбоев — E.g. Узел перезапускается, нарушение сетевого узла приводит к проваливанию, проверки здоровья. Для тех, кто хочет добиться ~ 99,9% SLA SLA (в зависимости от облачного провайдера).
  2. Убедитесь, что у вас есть множество настроек наличия в зонах доступности для обработки сбоев на 100% в одном центре данных — E.g. Паспортное отключение центра. Для тех, кто желая достичь ~ 99,99% SLA SLA (в зависимости от облачного провайдера).
  3. Убедитесь, что у вас есть многоразонный настроек для обработки сбоев на 100% в одном регионе. Для тех, кто хочет достичь ~ 99,999% SLA SLA (в зависимости от облачного провайдера).

Тем не менее, не хватает запланированных перезапусков самостоятельно или вашего поставщика облака, вообще полезно пытаться и избежать своих стручков повсюду! Смерть стручка, как правило, является вторичным эффектом какой-либо другой причины корневой причины в кластере, и может быть, что находка и фиксация корневой проблемы может сэкономить от необходимости заплатить за чрезмерную избыточность в вычислении.

В этом посту мы посмотрим на Стрессчаос Эксперименты в Toolkit Chaos-Mesh, чтобы увидеть, как мы можем проверить наш CPU и ресурс памяти.

Введение

Хаос-сетка Предлагает две основные поддерживаемые формы стресса Хаоса:

  • CPU-Burn — Имитация стресса CPU POD.
  • память-ожог — Имитация стресса памяти POD.

Например, чтобы генерировать Стрессчаос который будет сжечь 100% от 1 процессора в течение 30 секунд, каждые 5 минут, для одного из ваших стручков в My-App Пространство имен, вы можете написать:

apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
  name: burn-cpu
  namespace: chaos-mesh
spec:
  mode: one
  selector:
    namespaces:
      - my-app
  stressors:
    cpu:
      workers: 1
      load: 100
  duration: "30s"
  scheduler:
    cron: "@every 5m"

Одинаково, чтобы генерировать Стрессчаос Которые будут постоянно выращивать использование памяти на 30-е годы, каждые 5 минут, для одного из ваших стручков в My-App Пространство имен, вы можете написать:

apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
  name: burn-memory
  namespace: chaos-mesh
spec:
  mode: one
  selector:
    namespaces:
      - my-app
  stressors:
    memory:
      workers: 1
  duration: "30s"
  scheduler:
    cron: "@every 5m"

Chaos-Mesh впрыскивает эти желаемые стрессоры непосредственно в целевые стручки через хаос-демон, который использует некоторые Nsenter магия, чтобы пройти соответствующие Стресс-NG команды.

Вы можете дополнительно настроить ваши стрессовы следующим образом:

  • Вы можете предоставить как ЦП и память и стрессор на вашем конфиге.
  • Оба ЦП и память Стрессоры поддерживают дополнительные Варианты поле, где вы можете пройти дополнительные флаги/аргументы в Стресс-NG команда.
  • Кроме того, вы можете определить полностью пользовательские стрессоры, предоставляя Стресс resignngstressors строка вместо Стрессоры объект. Это ожидает строку Стресс-NG Флаги/аргументы.

Обратите внимание, что предоставление пользовательских опций (последних двух точек) не полностью проверены, так что следует рассматривать как экспериментальный!

Так что без дальнейшего ADO давайте попробуем немного стресс хаос!

Прохождение

Дополнительные детали на Chaos-Mesh можно найти на этом Репозиторий GitHub и в Документация Отказ

Здесь мы будем проходить через настройку и выполнение следующих двух тестов:

  1. Тест на стресс ЦП с использованием файлов манифеста Kubernetes.
  2. Тест на стресс памяти с использованием файлов манифеста Kubernetes.

Настройка кластера

Пожалуйста, обратитесь к предыдущему руководству по подробным инструкциям! В конечном итоге мы запускаем следующие две команды:

minikube start --driver=virtualbox
minikube addons enable metrics-server

Развертывание целевого приложения и Chaos-Mesh

Если вы следуете на части 1 серии CHAOS-MESH, то вам не придется ничего делать! Мы повторно используем наши развертывания Nginx и Chaos-Mesh от ранее.

Если вы пропустили предыдущий учебник, я рекомендую использовать ее настроек приложения и развертывания инструкций Chaos-Mesh. Если вы следили за очисткой в предыдущем уроке, вы можете восстановить настройку со следующими командами:

# Create Nginx Helm charts
helm create nginx

# Deploy Nginx to the cluster
kubectl create ns nginx
helm upgrade --install nginx ./nginx \
  -n nginx \
  --set replicaCount=10

# Check the Nginx deployment is successful
helm ls -n nginx
kubectl get pod -n nginx

# Pull down the Chaos-Mesh repo
git clone https://github.com/chaos-mesh/chaos-mesh

# Apply Chaos-Mesh Custom Resource Definitions
kubectl apply -f ./chaos-mesh/manifests/crd.yaml

# Deploy Chaos-Mesh to the cluster
kubectl create ns chaos-mesh
helm upgrade --install chaos-mesh ./chaos-mesh/helm/chaos-mesh \
  -n chaos-mesh \
  --set dashboard.create=true

# Check the Chaos-Mesh deployment is successful
helm ls -n chaos-mesh
kubectl get pods -n chaos-mesh -l app.kubernetes.io/instance=chaos-mesh

# Load the Chaos-Mesh dashboard
minikube service chaos-dashboard -n chaos-mesh

Эксперимент 2: CPU Chaos

Давайте начнем с создания нового Стресс-CPU.YAML Файл со следующим содержимым:

apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
  name: stress-cpu
  namespace: chaos-mesh
spec:
  mode: all
  selector:
    labelSelectors:
      "app.kubernetes.io/name": nginx
    namespaces:
    - nginx
  stressors:
    cpu: 
      workers: 1
      load: 100
  duration: "30s"
  scheduler:
    cron: "@every 5m"

Это добавит один работник стресса процессора для каждого из наших nginx стручки, которые будут загружать стручки 100% запланированного времени. Проверьте Стресс-NG Manpage для --cpu и --cpu-load Флаги Для получения дополнительной информации.

Эти рабочие будут запланированы каждые 5 минут и запланированы на 30-е годы в POD, прежде чем быть остановленным, означает, что мы должны ожидать, что мы должны ожидать, что мы должны ожидать, что мы должны увидеть наш CPU CPU NGINX PODS для 30-х годов, а затем откидываться до 0 для оставшихся 4,5 минут.

Давайте установим наш эксперимент и посмотрите, что произойдет!

$ kubectl apply -f stress-cpu.yaml

stresschaos.chaos-mesh.org/stress-cpu created

Если мы проверяем приборную панель Chaos-Mesh, мы видим, что эксперимент был развернут и работает:

minikube service chaos-dashboard -n chaos-mesh

Приборная панель показывает нам, что тест успешно работает в течение 30 секунд каждые 5 минут 🎉.

Допустим, мы не доверяем приборной панели? Давайте проверим, что уровни ЦП на самом деле нравятся в кластере!

Во-первых в окне терминала установите смотреть команда Если у вас еще нет, и запустите:

watch kubectl top pods -n nginx

Это должно выводить что-то вроде:

Every 2.0s: kubectl top pods -n nginx              c-machine: Tue Aug 25 14:16:40 2020

NAME                     CPU(cores)   MEMORY(bytes)
nginx-5c96c8f58b-2l85d   0m           25Mi
nginx-5c96c8f58b-btws8   0m           2Mi
nginx-5c96c8f58b-c28ws   0m           2Mi
nginx-5c96c8f58b-gmnkc   0m           2Mi
nginx-5c96c8f58b-hzgx5   0m           2Mi
nginx-5c96c8f58b-jzk2p   0m           2Mi
nginx-5c96c8f58b-vhmqm   0m           2Mi
nginx-5c96c8f58b-vs2cr   0m           21Mi
nginx-5c96c8f58b-zc9qf   0m           2Mi
nginx-5c96c8f58b-zjfc4   0m           2Mi

Который будет обновлять каждые 2 секунды. Там может быть немного отставания, получая метрики обратно из метрики кластера-сервера, но мы должны увидеть, что каждые 5 минут эти значения прыгают на ~ 30 секунд, а затем вернуться к 0. В ожидании следующего запланированного стресс-теста мы можем видеть это:

Every 2.0s: kubectl top pods -n nginx       c-machine: Tue Aug 25 14:19:11 2020

NAME                     CPU(cores)   MEMORY(bytes)
nginx-5c96c8f58b-2l85d   110m         25Mi
nginx-5c96c8f58b-btws8   80m          2Mi
nginx-5c96c8f58b-c28ws   94m          2Mi
nginx-5c96c8f58b-gmnkc   89m          2Mi
nginx-5c96c8f58b-hzgx5   70m          2Mi
nginx-5c96c8f58b-jzk2p   132m         2Mi
nginx-5c96c8f58b-vhmqm   63m          2Mi
nginx-5c96c8f58b-vs2cr   115m         21Mi
nginx-5c96c8f58b-zc9qf   80m          2Mi
nginx-5c96c8f58b-zjfc4   94m          2Mi

Потрясающий! Одиночный работник процессора в каждом POD, похоже, использует около 100 м (100 миллионов или 0,1 процессора) 💥.

Если вы хотите применить больше нагрузки на свои стручки, вы можете просто понять количество работников в Стрессчаос Ямл соответственно 🙃.

Если вы хотите пойти глубже, мы даже можем проверить, что происходит в самом Pod! 😲 Сначала мы находим цель Nginx POD:

$ kubectl get pods -n nginx

NAME                     READY   STATUS    RESTARTS   AGE
nginx-5c96c8f58b-2l85d   1/1     Running   0          23m
nginx-5c96c8f58b-btws8   1/1     Running   0          23m
nginx-5c96c8f58b-c28ws   1/1     Running   0          23m
nginx-5c96c8f58b-gmnkc   1/1     Running   0          23m
nginx-5c96c8f58b-hzgx5   1/1     Running   0          23m
nginx-5c96c8f58b-jzk2p   1/1     Running   0          23m
nginx-5c96c8f58b-vhmqm   1/1     Running   0          23m
nginx-5c96c8f58b-vs2cr   1/1     Running   0          23m
nginx-5c96c8f58b-zc9qf   1/1     Running   0          23m
nginx-5c96c8f58b-zjfc4   1/1     Running   0          23m

Мы будем использовать первый в списке nginx-5C96C8F58B-2L85D Отказ Далее мы можем на самом деле открыть оболочку внутри POD следующим образом:

$ kubectl exec -it nginx-5c96c8f58b-2l85d -n nginx -- bash

root@nginx-5c96c8f58b-2l85d:/#

Отсюда мы можем установить некоторые утилиты:

root@nginx-5c96c8f58b-2l85d:/# apt-get update && apt-get install -y procps

Что позволит нам использовать PS и верх Команды, чтобы допросить процессы, работающие внутри стручка. Если мы ждем, пока не произойдет нагрузка, мы видим Стресс-NG Процессы начинают бегать внутри контейнера с:

root@nginx-5c96c8f58b-2l85d:/# watch ps aux

Every 2.0s: ps aux                                                                                 nginx-5c96c8f58b-9npqq: Tue Aug 25 13:48:56 2020

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  32656  5204 ?        Ss   13:36   0:00 nginx: master process nginx -g daemon off;
nginx        6  0.0  0.1  33112  3072 ?        S    13:36   0:00 nginx: worker process
root        27  0.0  0.1  18136  3284 pts/0    Ss   13:46   0:00 bash
root       355  0.1  0.1  11104  2520 pts/0    S+   13:48   0:00 watch ps aux
root       383  0.0  0.1  18700  3696 ?        SL   13:48   0:00 stress-ng --cpu 1 --cpu-load 100
root       384 21.0  0.2  19348  4668 ?        R    13:48   0:01 stress-ng --cpu 1 --cpu-load 100
root       397  0.0  0.0  11104   652 pts/0    S+   13:48   0:00 watch ps aux
root       398  0.0  0.0   4280   772 pts/0    S+   13:48   0:00 sh -c ps aux
root       399  0.0  0.1  36636  2804 pts/0    R+   13:48   0:00 ps aux

Или в равной степени мы можем использовать верх Чтобы увидеть наши процессы и их использование ресурсов с немного приятным пользовательским интерфейсом:

root@nginx-5c96c8f58b-2l85d:/# top

Из этой команды мы можем увидеть список процессов, который показывает Стресс-NG родительский процесс и Стресс-NG-CPU Рабочий процесс, который потребляет около 18% процессора. После 30-х годов эти процессы исчезают, и ЦП возвращается к около 0%.

Давайте остановим наш эксперимент, удалив Стрессчаос Объект Kubernetes, который мы добавили ранее:

kubectl delete -f stress-cpu.yaml

Таким образом, мы у нас есть, мы можем успешно подчеркивать наши стручки с повышенным уровнем процессора! 🍾

Эксперимент 3: Чаоос памяти

Теперь давайте выполним аналогичный эксперимент, но на этот раз мы загрузим память одного POD.

Создать новый Стрессчаос Манифест под названием Стресс-память.yaml :

apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
  name: stress-memory
  namespace: chaos-mesh
spec:
  mode: one
  selector:
    labelSelectors:
      "app.kubernetes.io/name": nginx
    namespaces:
    - nginx
  stressors:
    memory: 
      workers: 1
  duration: "10s"
  scheduler:
    cron: "@every 2m"

Это добавит один работник нагрузки на память в один из наших nginx стручки, которые будут работать на 10 секунд каждые 2 минуты. Работник вырастет его кучу путем перераспределения памяти со скоростью 64 к на итерацию. Проверьте Стресс-NG Manpage для --bigheap Флаг Для получения дополнительной информации.

Давайте установим наш эксперимент и посмотрите, что произойдет!

$ kubectl apply -f stress-memory.yaml

stresschaos.chaos-mesh.org/stress-memory created

Наблюдение за нашими стручками Nginx, мы видим, что каждые 5 минут один из стручков имеет вспышку в использовании памяти:

$ watch kubectl top pods -n nginx
Every 2.0s...  c-machine: Tue Aug 25 15:12:52 2020

NAME                     CPU(cores)   MEMORY(bytes)
nginx-5c96c8f58b-5tvz5   0m           3Mi
nginx-5c96c8f58b-6fb9h   0m           2Mi
nginx-5c96c8f58b-bjzd2   0m           2Mi
nginx-5c96c8f58b-gfqww   0m           3Mi
nginx-5c96c8f58b-jtn5f   0m           2Mi
nginx-5c96c8f58b-rdlgk   145m         3Mi
nginx-5c96c8f58b-sgx4s   0m           2Mi
nginx-5c96c8f58b-szffx   0m           3Mi
nginx-5c96c8f58b-ttlhr   65m          621Mi
nginx-5c96c8f58b-xgh7j   0m           2Mi

Точно так же, если мы быстрым и будем нацелены на целенаправленное POD и установить верхняя Мы видим, что работник памяти очень быстро начинает потреблять много Память!

Изображение выше показывает наш целевой POD NGINX, ударяющий на 30,4% доступной памяти. Учитывая, что мы не установили никаких ограничений ресурсов на наше развертывание Nginx, то есть на самом деле 30,4% памяти кластера, выделенной Minikube !!

Вот почему в этом эксперименте я установил Режим к один И не все Отказ Это, вероятно, потребляет все ресурсы памяти в вашем кластере и очень потенциально сломают его — я попробовал это изначально и пришлось полностью удалить кластер Minikube и начать снова, как он стал 100% без адаптации! 😱.

Давайте удалим наш эксперимент:

kubectl delete -f stress-memory.yaml

Уборка

Давайте убрать и удалите все, что мы создали сегодня:

helm delete chaos-mesh -n chaos-mesh
kubectl delete ns chaos-mesh
kubectl delete crd iochaos.chaos-mesh.org
kubectl delete crd kernelchaos.chaos-mesh.org 
kubectl delete crd networkchaos.chaos-mesh.org
kubectl delete crd podchaos.chaos-mesh.org 
kubectl delete crd podnetworkchaos.chaos-mesh.org
kubectl delete crd stresschaos.chaos-mesh.org
kubectl delete crd timechaos.chaos-mesh.org
helm delete nginx -n nginx
kubectl delete ns nginx
minikube stop
minikube delete

Учащиеся

Так что же научили эти два экспериментами сегодня?

Наш первый эксперимент показал, что очень просто применить дополнительное напряжение CPU на наши стручки, но в конечном итоге 1 работник не применил слишком много давления. Учитывая мы на самом деле не пытались воспользоваться нашими стручками Nginx, каким-либо образом эксперимент немного бота, и там, вероятно, мало будет получено.

Однако, учитывая ЦП очень важен в кластере, и для многих приложений профиль CPU может напрямую влиять на индикаторы эффективности ключевых показателей, таких как задержка. Наблюдая инструменты для создания искусственного напряжения на ваших стручках (и кластере), вы можете измерить, как ваши приложения работают, когда под видом давления вы видите во время пикового периода нагрузки.

Учитывая влияние на задержку, стресс ЦП также может быть хорошим способом подтверждения здоровья вашего развертывания, где цель должна заключаться в том, чтобы гарантировать, что ваше приложение очень доступно, и этот трафик направляется на счастливо, работающие против тех, кто имеет расплавов CPU! Это может быть проверено с использованием одного из доступных процентных режимов.

Мониторинг вашего приложения под стрессом COD CPU также может быть полезным способом подтверждения вашего Ресурс POD и лимитные значения Отказ Применение слишком маленького значения ресурса для ЦП, вероятно, приведет к дросселированию CPU, что может иметь разрушительные воздействия на приложения, особенно многопоточные приложения.

Наш второй эксперимент показал, что стрессор памяти, безусловно, довольно агрессивен! На самом деле, оставив его слишком долго на слишком много стручков, может привести к довольно сложному выручению памяти.

Fine-Tuning Memory Stressor с использованием Варианты Значение, вероятно, рекомендуется, но ключ отнимает, что ни один из них ни один POD (или коллекция стручков) не должен иметь возможность потреблять целую распределение памяти кластера! Строгий Запрос ресурсов памяти и ограничения должны быть установлены на развертываниях, чтобы убедиться, что они убиты, прежде чем они будут иметь возможность нарушить другие стручки или фундаментальные кластерные процессы 🔥.

Спасибо за чтение людей!

Наслаждайтесь уроком? Есть вопросы или комментарии? Или у вас есть потрясающий способ управлять экспериментами Chaos в ваших кластерах Kubernetes? Оставьте мне сообщение в разделе ниже или Tweet Me @Craigmorten Действительно

До следующего раза 💥

K8S Chaos Dive (3 части серии)

Оригинал: «https://dev.to/craigmorten/k8s-chaos-dive-chaos-mesh-part-2-536m»