
Termine périodiquement des pods Kubernetes aléatoires pour tester le comportement des systèmes face à des pannes de pods arbitraires, avec prise en charge des filtres par namespace, label, annotation et planification pour des expériences de chaos contrôlées.
chaoskube tue périodiquement des pods aléatoires dans votre cluster Kubernetes.

Tester comment votre système se comporte lors de défaillances de pods arbitraires.
Par défaut, son exécution tue un pod dans chaque namespace toutes les 10 minutes.
$ 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 permet de filtrer les pods cibles par namespaces, labels, annotations et âge ainsi que d'exclure certains jours de la semaine, certaines heures de la journée et certains jours de l'année du chaos.
Vous pouvez installer chaoskube avec Helm. Suivez le Guide de démarrage rapide de Helm puis installez le chart chaoskube.
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
Référez-vous à chaoskube sur kubeapps.com pour apprendre comment le configurer et pour trouver d'autres charts Helm utiles.
Référez-vous au manifest d'exemple. Assurez-vous de donner à chaoskube les permissions appropriées en utilisant le ClusterRole fourni.
Par défaut, chaoskube est inoffensif et ne tue rien. Lorsque vous avez validé votre cluster cible, vous pouvez désactiver le mode dry-run en passant l'option --no-dry-run. Vous pouvez également spécifier un intervalle plus agressif et d'autres options prises en charge pour votre déploiement.
Si vous exécutez dans un cluster Kubernetes et que vous voulez cibler ce même cluster, c'est tout ce que vous avez à faire.
Si vous voulez cibler un autre cluster ou l'exécuter localement, spécifiez votre cluster via l'option --master ou fournissez un kubeconfig valide via l'option --kubeconfig. Par défaut, il utilise le chemin standard de votre kubeconfig dans votre répertoire personnel. Cela signifie que le contexte actuel qui s'y trouve sera ciblé.
Si vous voulez augmenter ou diminuer la quantité de chaos, modifiez l'intervalle entre les mises à mort avec l'option --interval. Vous pouvez également augmenter le nombre de réplicas de votre déploiement chaoskube.
Rappelez-vous que chaoskube, par défaut, tue tous les pods dans tous vos namespaces, y compris les pods système et lui-même.
chaoskube fournit un simple point de terminaison HTTP qui peut être utilisé pour vérifier qu'il est en cours d'exécution. Cela peut être utilisé pour les sondes de liveness et de readiness Kubernetes. Par défaut, il écoute sur le port 8080. Pour le désactiver, passez --metrics-address="" à chaoskube.
Cependant, vous pouvez limiter l'espace de recherche de chaoskube en fournissant des sélecteurs de labels, d'annotations et de namespaces, des motifs d'inclusion/exclusion de noms de pods, ainsi qu'un réglage d'âge minimum.
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
Cela sélectionne tous les pods qui ont le label app défini sur mate, le label chaos défini sur n'importe quelle valeur et le label stage non défini sur production ou non défini.
Vous pouvez également filtrer les pods cibles par sélecteur de namespaces.
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
Cela filtrera les pods dans les trois namespaces default, staging et testing.
Les namespaces peuvent en outre être filtrés par un sélecteur de labels sur les namespaces.
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
Cela exclura tous les pods des namespaces ayant le label integration.
Vous pouvez filtrer les pods cibles par un sélecteur de type d'OwnerReference.
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
Cela exclura tous les pods de DaemonSet et StatefulSet.
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
Cela n'inclura que les pods de DaemonSet.
Veuillez noter : tout filtre include exclura automatiquement tous les pods sans OwnerReference défini.
Vous pouvez filtrer les pods par nom :
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
Cela fera en sorte que seuls les pods dont le nom contient 'foo' ou 'bar' et ne contient pas 'prod' soient ciblés.
Vous pouvez également exclure des namespaces et combiner cela avec les sélecteurs de labels et d'annotations.
$ 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"
Cela limite davantage l'espace de recherche du sélecteur de labels ci-dessus en excluant également tous les pods des namespaces kube-system et production, ainsi qu'en ignorant tous les pods marqués comme critiques.
Le sélecteur d'annotations peut également être utilisé pour exécuter chaoskube en tant qu'addon de cluster et permettre aux pods de choisir d'être terminés comme bon vous semble. Par exemple, vous pourriez exécuter chaoskube comme ceci :
$ 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
Sauf si vous utilisez déjà cette annotation quelque part, cela ignorera initialement tous vos pods (vous pouvez voir le nombre de candidats en mode debug). Vous pourriez ensuite activer sélectivement certains déploiements en mode chaos en annotant leurs pods avec 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:
...
Vous pouvez exclure les pods qui ont récemment démarré en utilisant l'option --minimum-age.
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter minimumAge=6h0m0s
Vous pouvez limiter le moment où le chaos est introduit par jours de la semaine, périodes de la journée, jours de l'année ou tous ensemble.
Ajoutez une liste séparée par des virgules de jours de la semaine abrégés via l'option --excluded-weekdays, une liste séparée par des virgules de périodes de la journée via l'option --excluded-times-of-day et/ou une liste séparée par des virgules de jours de l'année via l'option --excluded-days-of-year, et spécifiez un --timezone pour les interpréter.
$ 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
Utilisez UTC, Local ou choisissez un nom de fuseau horaire dans la base de données tz (IANA). Si vous testez chaoskube depuis votre machine locale, Local est le plus logique. Une fois que vous déployez chaoskube dans votre cluster, vous devriez le déployer avec un fuseau horaire spécifique, par exemple là où vit la plupart des membres de votre équipe, afin que votre équipe et chaoskube aient une compréhension commune du début et de la fin d'un jour de la semaine particulier, par exemple. Si votre équipe est répartie sur plusieurs fuseaux horaires, il est probablement préférable de choisir UTC, qui est également la valeur par défaut. Choisir le mauvais fuseau horaire décale la signification d'un jour de la semaine particulier de quelques heures entre vous et le serveur.
Il existe plusieurs autres projets qui vous permettent de créer du chaos dans votre cluster Kubernetes.
chaoskube. Il peut également être rendu conscient de groupes de pods formant une application afin de les traiter spécialement, par exemple tuer tous les pods d'une application en une seule fois. kube-mokey permet de filtrer les cibles globalement via des options de configuration et permet également aux pods de choisir le chaos via des annotations ; il permet à chaque application de choisir à sa manière unique, par exemple, l'application A peut demander de tuer un pod chaque jour de la semaine, tandis que l'application B, plus courageuse, peut demander de tuer 50 % des pods. Il comprend un fichier de configuration similaire à celui utilisé par ChaosMonkey de Netflix.Ce projet ne serait pas là où il est sans les idées et l'aide de plusieurs contributeurs formidables :
N'hésitez pas à créer des issues ou à soumettre des pull requests.
| Option | Environnement | Description | Défaut |
|---|
--interval | CHAOSKUBE_INTERVAL | intervalle entre les terminaisons de pods | 10m |
--labels | CHAOSKUBE_LABELS | sélecteur de labels pour filtrer les pods | (correspond à tout) |
--annotations | CHAOSKUBE_ANNOTATIONS | sélecteur d'annotations pour filtrer les pods | (correspond à tout) |
--kinds | CHAOSKUBE_KINDS | sélecteur de type de propriétaire pour filtrer les pods | (tous les types) |
--namespaces | CHAOSKUBE_NAMESPACES | sélecteur de namespaces pour filtrer les pods | (tous les namespaces) |
--namespace-labels | CHAOSKUBE_NAMESPACE_LABELS | sélecteur de labels pour filtrer les namespaces et leurs pods | (tous les namespaces) |
--included-pod-names | CHAOSKUBE_INCLUDED_POD_NAMES | expression régulière pour les noms de pods à inclure | (tous inclus) |
--excluded-pod-names | CHAOSKUBE_EXCLUDED_POD_NAMES | expression régulière pour les noms de pods à exclure | (aucun exclu) |
--excluded-weekdays | CHAOSKUBE_EXCLUDED_WEEKDAYS | jours de la semaine où le chaos est suspendu, p. ex. "Sat,Sun" | (aucun jour exclu) |
--excluded-times-of-day | CHAOSKUBE_EXCLUDED_TIMES_OF_DAY | heures de la journée où le chaos est suspendu, p. ex. "22:00-08:00" | (aucune heure exclue) |
--excluded-days-of-year | CHAOSKUBE_EXCLUDED_DAYS_OF_YEAR | jours de l'année où le chaos est suspendu, p. ex. "Apr1,Dec24" | (aucun jour exclu) |
--timezone | CHAOSKUBE_TIMEZONE | fuseau horaire de la base tz, p. ex. "America/New_York", "UTC" ou "Local" | (UTC) |
--max-runtime | CHAOSKUBE_MAX_RUNTIME | durée d'exécution maximale avant la sortie de chaoskube | -1s (durée infinie) |
--max-kill | CHAOSKUBE_MAX_KILL | nombre maximum de pods à terminer par intervalle | 1 |
--minimum-age | CHAOSKUBE_MINIMUM_AGE | âge minimum pour filtrer les pods | 0s (correspond à chaque pod) |
--dry-run | CHAOSKUBE_DRY_RUN | ne pas tuer les pods, seulement journaliser ce qui aurait été fait | true |
--log-format | CHAOSKUBE_LOG_FORMAT | format des messages de journal. Options : text et json | text |
--log-caller | CHAOSKUBE_LOG_CALLER | inclure le nom de la fonction appelante et son emplacement dans les journaux | false |
--slack-webhook | CHAOSKUBE_SLACK_WEBHOOK | adresse du webhook Slack pour les notifications | désactivé |
--client-namespace-scope | CHAOSKUBE_CLIENT_NAMESPACE_SCOPE | limite les appels API Kubernetes au namespace donné | (tous les namespaces) |
kubectl écrit en quelques lignes de bash. Étant donné un namespace et un intervalle, il tue un pod aléatoire dans ce namespace à chaque intervalle. À peu près comme chaoskube au début.