
Beendet regelmäßig zufällige Kubernetes-Pods, um zu testen, wie sich Systeme unter beliebigen Pod-Ausfällen verhalten. Unterstützt Filter nach Namespace, Label, Annotation und Zeitplan für kontrollierte Chaos-Experimente.
chaoskube beendet regelmäßig zufällige Pods in deinem Kubernetes-Cluster.

Teste, wie sich dein System unter beliebigen Pod-Ausfällen verhält.
Beim Ausführen wird standardmäßig alle 10 Minuten ein Pod in einem beliebigen Namespace beendet.
$ 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 ermöglicht das Filtern der Ziel-Pods nach Namespaces, Labels, Annotationen und Alter sowie das Ausschließen bestimmter Wochentage, Tageszeiten und Tage eines Jahres vom Chaos.
Du kannst chaoskube mit Helm installieren. Folge Helms Quickstart-Guide und installiere dann das chaoskube-Chart.
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
Siehe chaoskube auf kubeapps.com, um zu erfahren, wie du es konfigurierst und andere nützliche Helm-Charts findest.
Siehe Beispiel-Manifest. Stelle sicher, dass du chaoskube mit der bereitgestellten ClusterRole die entsprechenden Berechtigungen erteilst.
Standardmäßig ist chaoskube freundlich und beendet nichts. Wenn du deinen Ziel-Cluster validiert hast, kannst du den Dry-Run-Modus deaktivieren, indem du das Flag --no-dry-run übergibst. Du kannst auch ein aggressiveres Intervall und andere unterstützte Flags für deine Bereitstellung angeben.
Wenn du in einem Kubernetes-Cluster läufst und denselben Cluster anvisieren möchtest, ist das alles, was du tun musst.
Wenn du einen anderen Cluster anvisieren oder ihn lokal ausführen möchtest, gib deinen Cluster über das --master-Flag an oder stelle eine gültige kubeconfig über das --kubeconfig-Flag bereit. Standardmäßig wird der Standardpfad der kubeconfig in deinem Home-Verzeichnis verwendet. Das bedeutet, dass der aktuelle Kontext dort anvisiert wird.
Wenn du das Ausmaß des Chaos erhöhen oder verringern möchtest, ändere das Intervall zwischen den Beendigungen mit dem --interval-Flag. Alternativ kannst du die Anzahl der Repliken deiner chaoskube-Bereitstellung erhöhen.
Denke daran, dass chaoskube standardmäßig jeden Pod in all deinen Namespaces beendet, einschließlich System-Pods und sich selbst.
chaoskube stellt einen einfachen HTTP-Endpunkt bereit, mit dem überprüft werden kann, ob es läuft. Dieser kann für Kubernetes-Liveness- und Readiness-Probes verwendet werden. Standardmäßig lauscht dieser auf Port 8080. Zum Deaktivieren übergib --metrics-address="" an chaoskube.
Du kannst den Suchraum von chaoskube jedoch einschränken, indem du Label-, Annotation- und Namespace-Selektoren, Pod-Namen-Ein-/Ausschlussmuster sowie eine Mindestalter-Einstellung angibst.
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
Dies wählt alle Pods aus, deren Label app auf mate gesetzt ist, deren Label chaos auf einen beliebigen Wert gesetzt ist und deren Label stage nicht auf production gesetzt oder nicht gesetzt ist.
Du kannst Ziel-Pods auch nach Namespace-Selektor filtern.
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
Dies filtert nach Pods in den drei Namespaces default, staging und testing.
Namespaces können zusätzlich über einen Namespace-Label-Selektor gefiltert werden.
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
Dies schließt alle Pods aus Namespaces mit dem Label integration aus.
Du kannst Ziel-Pods nach dem Kind-Selektor der OwnerReference filtern.
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
Dies schließt alle DaemonSet- und StatefulSet-Pods aus.
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
Dies schließt nur DaemonSet-Pods ein.
Bitte beachte: Jeder include-Filter schließt automatisch alle Pods ohne definierte OwnerReference aus.
Du kannst Pods nach Namen filtern:
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
Dadurch werden nur Pods anvisiert, deren Name 'foo' oder 'bar' enthält und nicht 'prod' enthält.
Du kannst auch Namespaces ausschließen und sie mit den Label- und Annotation-Selektoren kombinieren.
$ 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"
Dies schränkt den Suchraum des obigen Label-Selektors weiter ein, indem auch alle Pods in den Namespaces kube-system und production ausgeschlossen sowie alle Pods ignoriert werden, die als kritisch markiert sind.
Der Annotation-Selektor kann auch verwendet werden, um chaoskube als Cluster-Addon auszuführen und Pods nach Belieben zu erlauben, sich für die Beendigung zu entscheiden. Du könntest chaoskube zum Beispiel so ausführen:
$ 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
Sofern du diese Annotation nicht bereits irgendwo verwendest, ignoriert dies zunächst alle deine Pods (du kannst die Anzahl der Kandidaten im Debug-Modus sehen). Du kannst dann einzelne Deployments gezielt für den Chaos-Modus anmelden, indem du ihre Pods mit chaos.alpha.kubernetes.io/enabled=true annotierst.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
template:
metadata:
annotations:
chaos.alpha.kubernetes.io/enabled: "true"
spec:
...
Du kannst Pods, die vor kurzem gestartet wurden, mit dem --minimum-age-Flag ausschließen.
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter minimumAge=6h0m0s
Du kannst die Zeit, in der Chaos erzeugt wird, nach Wochentagen, Tageszeiten, Tagen eines Jahres oder allen zusammen begrenzen.
Füge eine kommagetrennte Liste abgekürzter Wochentage über die Option --excluded-weekdays, eine kommagetrennte Liste von Zeiträumen über die Option --excluded-times-of-day und/oder eine kommagetrennte Liste von Tagen eines Jahres über die Option --excluded-days-of-year hinzu und gib eine --timezone an, anhand derer sie interpretiert werden.
$ 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
Verwende UTC, Local oder wähle einen Zeitzonennamen aus der (IANA) tz-Datenbank. Wenn du chaoskube von deinem lokalen Rechner aus testest, ist Local am sinnvollsten. Sobald du chaoskube in deinem Cluster bereitstellst, solltest du es mit einer bestimmten Zeitzone bereitstellen, z. B. dort, wo die meisten deiner Teammitglieder leben, damit dein Team und chaoskube ein gemeinsames Verständnis darüber haben, wann ein bestimmter Wochentag beginnt und endet. Wenn dein Team über mehrere Zeitzonen verteilt ist, ist es wahrscheinlich am besten, UTC zu wählen, was auch die Standardeinstellung ist. Die Wahl der falschen Zeitzone verschiebt die Bedeutung eines bestimmten Wochentags zwischen dir und dem Server um einige Stunden.
Es gibt mehrere andere Projekte, mit denen du etwas Chaos in deinem Kubernetes-Cluster erzeugen kannst.
chaoskube fehlt. Er kann auch Gruppen von Pods erkennen, die eine Anwendung bilden, um sie speziell zu behandeln, z. B. alle Pods einer Anwendung auf einmal zu beenden. kube-mokey ermöglicht das globale Filtern von Zielen über Konfigurationsoptionen und erlaubt Pods, sich per Annotationen für Chaos anzumelden. Es erlaubt einzelnen Apps, sich auf ihre eigene Art anzumelden: Beispielsweise kann App A anfordern, jeden Wochentag einen Pod zu beenden, während App B, die mutiger ist, die Beendigung von 50 % der Pods anfordern kann. Es versteht eine ähnliche Konfigurationsdatei, wie sie auch von Netflix' ChaosMonkey verwendet wird.Dieses Projekt wäre nicht dort, wo es ist, ohne die Ideen und die Hilfe mehrerer großartiger Mitwirkender:
Zögere nicht, Issues zu erstellen oder Pull Requests einzureichen.
| Option | Environment | Description | Default |
|---|
--interval | CHAOSKUBE_INTERVAL | Intervall zwischen Pod-Beendigungen | 10m |
--labels | CHAOSKUBE_LABELS | Label-Selektor zum Filtern von Pods | (passt auf alles) |
--annotations | CHAOSKUBE_ANNOTATIONS | Annotation-Selektor zum Filtern von Pods | (passt auf alles) |
--kinds | CHAOSKUBE_KINDS | Kind-Selektor des Besitzers zum Filtern von Pods | (alle Kinds) |
--namespaces | CHAOSKUBE_NAMESPACES | Namespace-Selektor zum Filtern von Pods | (alle Namespaces) |
--namespace-labels | CHAOSKUBE_NAMESPACE_LABELS | Label-Selektor zum Filtern von Namespaces und deren Pods | (alle Namespaces) |
--included-pod-names | CHAOSKUBE_INCLUDED_POD_NAMES | Regulärer Ausdruck für einzuschließende Pod-Namen | (alle eingeschlossen) |
--excluded-pod-names | CHAOSKUBE_EXCLUDED_POD_NAMES | Regulärer Ausdruck für auszuschließende Pod-Namen | (keine ausgeschlossen) |
--excluded-weekdays | CHAOSKUBE_EXCLUDED_WEEKDAYS | Wochentage, an denen Chaos ausgesetzt werden soll, z. B. "Sat,Sun" | (kein Wochentag ausgenommen) |
--excluded-times-of-day | CHAOSKUBE_EXCLUDED_TIMES_OF_DAY | Tageszeiten, zu denen Chaos ausgesetzt werden soll, z. B. "22:00-08:00" | (keine Tageszeiten ausgenommen) |
--excluded-days-of-year | CHAOSKUBE_EXCLUDED_DAYS_OF_YEAR | Tage eines Jahres, an denen Chaos ausgesetzt werden soll, z. B. "Apr1,Dec24" | (keine Tage des Jahres ausgenommen) |
--timezone | CHAOSKUBE_TIMEZONE | Zeitzone aus der tz-Datenbank, z. B. "America/New_York", "UTC" oder "Local" | (UTC) |
--max-runtime | CHAOSKUBE_MAX_RUNTIME | Maximale Laufzeit, bevor chaoskube beendet wird | -1s (unbegrenzte Zeit) |
--max-kill | CHAOSKUBE_MAX_KILL | Gibt die maximale Anzahl von Pods an, die pro Intervall beendet werden | 1 |
--minimum-age | CHAOSKUBE_MINIMUM_AGE | Mindestalter zum Filtern von Pods | 0s (passt auf jeden Pod) |
--dry-run | CHAOSKUBE_DRY_RUN | Pods nicht beenden, nur protokollieren, was getan worden wäre | true |
--log-format | CHAOSKUBE_LOG_FORMAT | Format der Protokollmeldungen angeben. Optionen sind text und json | text |
--log-caller | CHAOSKUBE_LOG_CALLER | Name und Ort der aufrufenden Funktion in die Protokollmeldungen aufnehmen | false |
--slack-webhook | CHAOSKUBE_SLACK_WEBHOOK | Adresse des Slack-Webhooks für Benachrichtigungen | deaktiviert |
--client-namespace-scope | CHAOSKUBE_CLIENT_NAMESPACE_SCOPE | Kubernetes-API-Aufrufe auf den angegebenen Namespace beschränken | (alle Namespaces) |
kubectl, geschrieben in ein paar Zeilen Bash. Bei einem Namespace und einem Intervall beendet er bei jedem Intervall einen zufälligen Pod in diesem Namespace. So ähnlich, wie chaoskube am Anfang funktionierte.