
Расширение драйвера Kubernetes для API проверок и действий Chaos Toolkit
Этот проект содержит активности, такие как пробы (probes) и действия (actions), которые вы можете вызывать из своего эксперимента через Chaos Toolkit для проведения Chaos Engineering против API Kubernetes: уничтожение пода, удаление statefulset или узла...
Чтобы использовать этот пакет в своих экспериментах, он должен быть установлен в Python-окружении, где уже находится chaostoolkit.
$ pip install chaostoolkit-kubernetes
Чтобы использовать пробы и действия из этого пакета, добавьте следующее в файл вашего эксперимента:
{
"title": "Do we remain available in face of pod going down?",
"description": "We expect Kubernetes to handle the situation gracefully when a pod goes down",
"tags": ["kubernetes"],
"steady-state-hypothesis": {
"title": "Verifying service remains healthy",
"probes": [
{
"name": "all-our-microservices-should-be-healthy",
"type": "probe",
"tolerance": true,
"provider": {
"type": "python",
"module": "chaosk8s.probes",
"func": "microservice_available_and_healthy",
"arguments": {
"name": "myapp"
}
}
}
]
},
"method": [
{
"type": "action",
"name": "terminate-db-pod",
"provider": {
"type": "python",
"module": "chaosk8s.pod.actions",
"func": "terminate_pods",
"arguments": {
"label_selector": "app=my-app",
"name_pattern": "my-app-[0-9]$",
"rand": true
}
},
"pauses": {
"after": 5
}
}
]
}
Вот и всё! Обратите внимание, как действие даёт вам возможность случайным образом убить один под.
Пожалуйста, изучите документацию, чтобы узнать о существующих пробах и действиях.
Обратите внимание, что для стрессоров сети, CPU и памяти мы полагаемся на замечательный проект Chaos Mesh, который предоставляет отличный интерфейс для инъекции этих отказов.
Чтобы использовать их, вам сначала нужно установить Chaos Mesh в ваш кластер.
Если в вашем файле ~/.kube/config есть корректная запись для кластера, на который вы хотите воздействовать, то ничего делать не нужно.
Вы можете указать KUBECONFIG, чтобы задать другое местоположение.
$ export KUBECONFIG=/tmp/my-config
Довольно часто ваша конфигурация Kubernetes содержит несколько записей, и вам нужно определить ту, которая будет использоваться как контекст по умолчанию, когда он не указан явно.
Вы, конечно, можете изменить контекст по умолчанию с помощью kubectl config use-context KUBERNETES_CONTEXT, но также можете указать его явно в эксперименте следующим образом:
{
"title": "Do we remain available in face of pod going down?",
"description": "We expect Kubernetes to handle the situation gracefully when a pod goes down",
"tags": ["kubernetes"],
"secrets": {
"k8s": {
"KUBERNETES_CONTEXT": "..."
}
},
"steady-state-hypothesis": {
"title": "Verifying service remains healthy",
"probes": [
{
"name": "all-our-microservices-should-be-healthy",
"type": "probe",
"tolerance": true,
"secrets": ["k8s"],
"provider": {
"type": "python",
"module": "chaosk8s.probes",
"func": "microservice_available_and_healthy",
"arguments": {
"name": "myapp"
}
}
}
]
},
"method": [
{
"type": "action",
"name": "terminate-db-pod",
"secrets": ["k8s"],
"provider": {
"type": "python",
"module": "chaosk8s.pod.actions",
"func": "terminate_pods",
"arguments": {
"label_selector": "app=my-app",
"name_pattern": "my-app-[0-9]$",
"rand": true
}
},
"pauses": {
"after": 5
}
}
]
}
Вам нужно указать секретный ключ KUBERNETES_CONTEXT с именем контекста, который вы хотите использовать в эксперименте. Убедитесь, что вы также передаёте действиям и пробам записи секретов, которые им нужны: "secrets": ["k8s"].
При запуске из пода (а не с вашей локальной машины или, например, из CI) файл ./.kube/config не существует. Вместо этого учётные данные можно найти в /var/run/secrets/kubernetes.io/serviceaccount/token.
Чтобы расширение узнало об этом, просто установите CHAOSTOOLKIT_IN_POD через переменную окружения в спецификации пода:
env:
- name: CHAOSTOOLKIT_IN_POD
value: "true"
При использовании этой переменной окружения предполагается, что эксперимент воздействует на тот же кластер, из которого он запускается. Если ваш эксперимент воздействует на другой кластер, вам не следует устанавливать эту переменную. Вместо этого вы можете смонтировать том с конфигурацией Kubernetes для целевого кластера и указать KUBECONFIG, чтобы он указывал на неё.
Наконец, вы можете явно передать всю необходимую информацию об учётных данных в эксперимент следующим образом:
{
"secrets": {
"kubernetes": {
"KUBERNETES_HOST": "http://somehost",
"KUBERNETES_API_KEY": {
"type": "env",
"key": "SOME_ENV_VAR"
}
}
}
}
{
"secrets": {
"kubernetes": {
"KUBERNETES_HOST": "http://somehost",
"KUBERNETES_USERNAME": {
"type": "env",
"key": "SOME_ENV_VAR"
},
"KUBERNETES_PASSWORD": {
"type": "env",
"key": "SOME_ENV_VAR"
}
}
}
}
{
"secrets": {
"kubernetes": {
"KUBERNETES_HOST": "http://somehost",
"KUBERNETES_CERT_FILE": {
"type": "env",
"key": "SOME_ENV_VAR"
},
"KUBERNETES_KEY_FILE": {
"type": "env",
"key": "SOME_ENV_VAR"
}
}
}
}
В некоторых управляемых кластерах Kubernetes вам также необходимо аутентифицироваться на самой платформе, поскольку аутентификация Kubernetes делегируется ей.