
Периодически завершает случайные поды Kubernetes, чтобы проверить, как системы ведут себя при произвольных сбоях подов; поддерживает фильтры по namespace, label, annotation и расписанию для контролируемых хаос-экспериментов.
chaoskube периодически убивает случайные поды в вашем кластере Kubernetes.

Проверьте, как ваша система ведёт себя при произвольных сбоях подов.
При запуске он по умолчанию убивает под в любом namespace каждые 10 минут.
$ chaoskube
INFO[0000] starting up dryRun=true interval=10m0s version=v0.21.0
INFO[0000] connecting to cluster master="https://kube.you.me" serverVersion=v1.10.5+coreos.0
INFO[0000] setting pod filter annotations= labels= minimumAge=0s namespaces=
INFO[0000] setting quiet times daysOfYear="[]" timesOfDay="[]" weekdays="[]"
INFO[0000] setting timezone location=UTC name=UTC offset=0
INFO[0001] terminating pod name=kube-dns-v20-6ikos namespace=kube-system
INFO[0601] terminating pod name=nginx-701339712-u4fr3 namespace=chaoskube
INFO[1201] terminating pod name=kube-proxy-gke-earthcoin-pool-3-5ee87f80-n72s namespace=kube-system
INFO[1802] terminating pod name=nginx-701339712-bfh2y namespace=chaoskube
INFO[2402] terminating pod name=heapster-v1.2.0-1107848163-bhtcw namespace=kube-system
INFO[3003] terminating pod name=l7-default-backend-v1.0-o2hc9 namespace=kube-system
INFO[3603] terminating pod name=heapster-v1.2.0-1107848163-jlfcd namespace=kube-system
INFO[4203] terminating pod name=nginx-701339712-bfh2y namespace=chaoskube
INFO[4804] terminating pod name=nginx-701339712-51nt8 namespace=chaoskube
...
chaoskube позволяет фильтровать целевые поды по namespaces, меткам, аннотациям и возрасту, а также исключать определённые дни недели, время суток и дни года из хаоса.
Вы можете установить chaoskube с помощью Helm. Следуйте краткому руководству Helm и затем установите чарт chaoskube.
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
Обратитесь к chaoskube на kubeapps.com, чтобы узнать, как его настроить, и найти другие полезные Helm-чарты.
Обратитесь к примеру манифеста. Убедитесь, что вы предоставили chaoskube соответствующие разрешения с помощью предоставленного ClusterRole.
По умолчанию chaoskube ведёт себя дружелюбно и ничего не убивает. Когда вы проверите целевой кластер, вы можете отключить режим dry-run, передав флаг --no-dry-run. Вы также можете указать более агрессивный интервал и другие поддерживаемые флаги для вашего развёртывания.
Если вы работаете в кластере Kubernetes и хотите воздействовать на тот же кластер, то этого достаточно.
Если вы хотите воздействовать на другой кластер или запустить его локально, укажите ваш кластер через флаг --master или предоставьте действующий kubeconfig через флаг --kubeconfig. По умолчанию используется стандартный путь kubeconfig в вашем домашнем каталоге. Это означает, что будет выбран текущий контекст.
Если вы хотите увеличить или уменьшить количество хаоса, измените интервал между убийствами с помощью флага --interval. Кроме того, вы можете увеличить количество реплик вашего развёртывания chaoskube.
Помните, что chaoskube по умолчанию убивает любой под во всех ваших namespaces, включая системные поды и сам себя.
chaoskube предоставляет простой HTTP-эндпоинт, который можно использовать для проверки его работы. Его можно использовать для проверок liveness и readiness в Kubernetes. По умолчанию он слушает порт 8080. Чтобы отключить, передайте --metrics-address="" в chaoskube.
Однако вы можете ограничить пространство поиска chaoskube, указав селекторы меток, аннотаций и namespaces, шаблоны включения/исключения имён подов, а также настройку минимального возраста.
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
Это выбирает все поды, у которых метка app установлена в mate, метка chaos установлена в любое значение, а метка stage не установлена в production или не задана.
Вы также можете фильтровать целевые поды по селектору namespace.
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
Это отфильтрует поды в трёх namespaces: default, staging и testing.
Namespaces также можно фильтровать с помощью селектора меток namespace.
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
Это исключит все поды из namespaces с меткой integration.
Вы можете фильтровать целевые поды по селектору kind OwnerReference.
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
Это исключит любые поды DaemonSet и StatefulSet.
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
Это включит только поды DaemonSet.
Обратите внимание: любой фильтр include автоматически исключит все поды, у которых не определён OwnerReference.
Вы можете фильтровать поды по имени:
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
Это приведёт к тому, что целями станут только поды, чьё имя содержит 'foo' или 'bar' и не содержит 'prod'.
Вы также можете исключать namespaces и комбинировать их с селекторами меток и аннотаций.
$ chaoskube \
--labels 'app=mate,chaos,stage!=production' \
--annotations '!scheduler.alpha.kubernetes.io/critical-pod' \
--namespaces '!kube-system,!production'
...
INFO[0000] setting pod filter annotations="!scheduler.alpha.kubernetes.io/critical-pod" labels="app=mate,chaos,stage!=production" namespaces="!kube-system,!production"
Это дополнительно ограничивает пространство поиска вышеуказанного селектора меток, исключая также любые поды в namespaces kube-system и production, а также игнорируя все поды, помеченные как критичные.
Селектор аннотаций также можно использовать для запуска chaoskube как аддона кластера и разрешать подам выбирать участие в завершении так, как вы считаете нужным. Например, вы можете запустить chaoskube так:
$ chaoskube --annotations 'chaos.alpha.kubernetes.io/enabled=true' --debug
...
INFO[0000] setting pod filter annotations="chaos.alpha.kubernetes.io/enabled=true"
DEBU[0000] found candidates count=0
DEBU[0000] no victim found
Если вы ещё нигде не используете эту аннотацию, сначала будут игнорироваться все ваши поды (вы можете увидеть количество кандидатов в режиме debug). Затем вы можете выборочно включать отдельные Deployment в режим хаоса, аннотируя их поды значением chaos.alpha.kubernetes.io/enabled=true.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
template:
metadata:
annotations:
chaos.alpha.kubernetes.io/enabled: "true"
spec:
...
Вы можете исключить недавно запущенные поды с помощью флага --minimum-age.
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter minimumAge=6h0m0s
Вы можете ограничить время, когда вносится хаос, по дням недели, периодам времени в течение суток, дням года или всем им вместе.
Укажите список сокращённых дней недели через запятую с помощью опции --excluded-weekdays, список периодов времени через запятую с помощью опции --excluded-times-of-day и/или список дней года через запятую с помощью опции --excluded-days-of-year, а также укажите --timezone, в котором их интерпретировать.
$ chaoskube \
--excluded-weekdays=Sat,Sun \
--excluded-times-of-day=22:00-08:00,11:00-13:00 \
--excluded-days-of-year=Apr1,Dec24 \
--timezone=Europe/Berlin
...
INFO[0000] setting quiet times daysOfYear="[Apr 1 Dec24]" timesOfDay="[22:00-08:00 11:00-13:00]" weekdays="[Saturday Sunday]"
INFO[0000] setting timezone location=Europe/Berlin name=CET offset=1
Используйте UTC, Local или выберите название часового пояса из (IANA) tz database. Если вы тестируете chaoskube с локальной машины, то Local имеет наибольший смысл. После развёртывания chaoskube в кластере следует развернуть его с конкретным часовым поясом, например, там, где живёт большинство членов вашей команды, чтобы и ваша команда, и chaoskube одинаково понимали, когда начинается и заканчивается конкретный день недели. Если ваша команда распределена по нескольким часовым поясам, вероятно, лучше выбрать UTC, который также используется по умолчанию. Неправильный выбор часового пояса сдвигает значение конкретного дня недели на несколько часов между вами и сервером.
Существует несколько других проектов, которые позволяют создавать хаос в вашем кластере Kubernetes.
chaoskube не хватает. Она также может учитывать группы подов, образующих приложение, чтобы обрабатывать их особым образом, например, убивать все поды приложения сразу. kube-mokey позволяет фильтровать цели глобально через параметры конфигурации, а также позволяет подам opt-in к хаосу через аннотации. Он позволяет отдельным приложениям opt-in своим уникальным способом: например, приложение A может запросить убийство одного пода каждый будний день, тогда как более смелое приложение B может запросить убийство 50% подов. Он понимает конфигурационный файл, аналогичный используемому Netflix ChaosMonkey.Этот проект не был бы таким, каким он является, без идей и помощи нескольких замечательных участников:
Не стесняйтесь создавать issues или отправлять pull requests.
| Option | Environment | Description | Default |
|---|
--interval | CHAOSKUBE_INTERVAL | интервал между завершением подов | 10m |
--labels | CHAOSKUBE_LABELS | селектор меток для фильтрации подов | (соответствует всему) |
--annotations | CHAOSKUBE_ANNOTATIONS | селектор аннотаций для фильтрации подов | (соответствует всему) |
--kinds | CHAOSKUBE_KINDS | селектор kind владельца для фильтрации подов | (все kinds) |
--namespaces | CHAOSKUBE_NAMESPACES | селектор namespace для фильтрации подов | (все namespaces) |
--namespace-labels | CHAOSKUBE_NAMESPACE_LABELS | селектор меток для фильтрации namespaces и их подов | (все namespaces) |
--included-pod-names | CHAOSKUBE_INCLUDED_POD_NAMES | шаблон регулярного выражения для имён подов, которые следует включить | (все включены) |
--excluded-pod-names | CHAOSKUBE_EXCLUDED_POD_NAMES | шаблон регулярного выражения для имён подов, которые следует исключить | (ничего не исключено) |
--excluded-weekdays | CHAOSKUBE_EXCLUDED_WEEKDAYS | дни недели, когда хаос должен быть приостановлен, например "Sat,Sun" | (ни один день недели не исключён) |
--excluded-times-of-day | CHAOSKUBE_EXCLUDED_TIMES_OF_DAY | время суток, когда хаос должен быть приостановлен, например "22:00-08:00" | (ни один период времени не исключён) |
--excluded-days-of-year | CHAOSKUBE_EXCLUDED_DAYS_OF_YEAR | дни года, когда хаос должен быть приостановлен, например "Apr1,Dec24" | (ни один день года не исключён) |
--timezone | CHAOSKUBE_TIMEZONE | часовой пояс из tz database, например "America/New_York", "UTC" или "Local" | (UTC) |
--max-runtime | CHAOSKUBE_MAX_RUNTIME | максимальное время работы до выхода chaoskube | -1s (бесконечное время) |
--max-kill | CHAOSKUBE_MAX_KILL | указывает максимальное количество подов, завершаемых за интервал | 1 |
--minimum-age | CHAOSKUBE_MINIMUM_AGE | минимальный возраст для фильтрации подов | 0s (соответствует каждому поду) |
--dry-run | CHAOSKUBE_DRY_RUN | не убивать поды, только логировать то, что было бы сделано | true |
--log-format | CHAOSKUBE_LOG_FORMAT | задаёт формат сообщений лога. Варианты: text и json | text |
--log-caller | CHAOSKUBE_LOG_CALLER | включать имя и расположение вызывающей функции в сообщения лога | false |
--slack-webhook | CHAOSKUBE_SLACK_WEBHOOK | адрес slack webhook для уведомлений | отключено |
--client-namespace-scope | CHAOSKUBE_CLIENT_NAMESPACE_SCOPE | ограничить вызовы Kubernetes API указанным namespace | (все namespaces) |
kubectl, написанный на паре строк bash. При заданных namespace и интервале он убивает случайный под в этом namespace через каждый интервал. Примерно так chaoskube работал в начале.