
Termina periodicamente pod Kubernetes casuali per testare come i sistemi si comportano in caso di failure arbitrarie dei pod, supportando filtri per namespace, label, annotazioni e pianificazione per esperimenti di chaos controllati.
chaoskube termina periodicamente pod casuali nel tuo cluster Kubernetes.

Verifica come il tuo sistema si comporta in caso di guasti arbitrari dei pod.
Eseguendolo, per impostazione predefinita terminerà un pod in qualsiasi namespace ogni 10 minuti.
$ 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 consente di filtrare i pod target per namespace, label, annotazioni ed età e di escludere determinati giorni della settimana, fasce orarie e giorni dell'anno dal caos.
Puoi installare chaoskube con Helm. Segui la Guida rapida di Helm e poi installa la chart chaoskube.
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
Fai riferimento a chaoskube su kubeapps.com per sapere come configurarlo e trovare altre utili chart Helm.
Fai riferimento al manifesto di esempio. Assicurati di concedere a chaoskube le autorizzazioni appropriate utilizzando il ClusterRole fornito.
Per impostazione predefinita, chaoskube è innocuo e non termina nulla. Una volta convalidato il cluster target, puoi disattivare la modalità dry-run passando il flag --no-dry-run. Puoi anche specificare un intervallo più aggressivo e altri flag supportati per il tuo deployment.
Se stai eseguendo in un cluster Kubernetes e vuoi avere come target lo stesso cluster, tutto ciò che devi fare è questo.
Se vuoi avere come target un cluster diverso o eseguirlo in locale, specifica il cluster tramite il flag --master o fornisci un kubeconfig valido tramite il flag --kubeconfig. Per impostazione predefinita, utilizza il percorso kubeconfig standard nella tua home. Ciò significa che verrà preso di mira qualunque contesto sia attualmente presente lì.
Se vuoi aumentare o diminuire la quantità di caos, modifica l'intervallo tra le terminazioni con il flag --interval. In alternativa, puoi aumentare il numero di repliche del tuo deployment chaoskube.
Ricorda che chaoskube, per impostazione predefinita, termina qualsiasi pod in tutti i tuoi namespace, inclusi i pod di sistema e sé stesso.
chaoskube fornisce un semplice endpoint HTTP che può essere utilizzato per verificare che sia in esecuzione. Può essere usato per i probe di liveness e readiness di Kubernetes. Per impostazione predefinita, ascolta sulla porta 8080. Per disattivarlo, passa --metrics-address="" a chaoskube.
Tuttavia, puoi limitare lo spazio di ricerca di chaoskube fornendo selettori di label, annotazioni e namespace, pattern di inclusione/esclusione per i nomi dei pod, oltre a un'impostazione di età minima.
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
Questo seleziona tutti i pod che hanno la label app impostata su mate, la label chaos impostata su qualsiasi valore e la label stage non impostata su production o non impostata.
Puoi filtrare i pod target anche tramite un selettore di namespace.
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
Questo filtrerà i pod nei tre namespace default, staging e testing.
I namespace possono inoltre essere filtrati tramite un selettore di label dei namespace.
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
Questo escluderà tutti i pod dai namespace con la label integration.
Puoi filtrare i pod target tramite il selettore di kind degli OwnerReference.
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
Questo escluderà qualsiasi pod DaemonSet e StatefulSet.
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
Questo includerà solo i pod DaemonSet.
Nota: qualsiasi filtro di inclusione escluderà automaticamente tutti i pod senza un OwnerReference definito.
Puoi filtrare i pod per nome:
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
Ciò farà sì che vengano presi di mira solo i pod il cui nome contiene 'foo' o 'bar' e non contiene 'prod'.
Puoi anche escludere namespace e combinarli con i selettori di label e annotazioni.
$ 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"
Questo limita ulteriormente lo spazio di ricerca del selettore di label precedente, escludendo anche i pod nei namespace kube-system e production e ignorando tutti i pod contrassegnati come critici.
Il selettore di annotazioni può essere utilizzato anche per eseguire chaoskube come componente aggiuntivo del cluster e consentire ai pod di aderire volontariamente alla terminazione come meglio credi. Ad esempio, potresti eseguire chaoskube in questo modo:
$ 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
A meno che tu non utilizzi già quell'annotazione da qualche parte, inizialmente ignorerà tutti i tuoi pod (puoi vedere il numero di candidati in modalità debug). Potresti quindi far aderire selettivamente singoli deployment alla modalità caos annotando i loro pod con 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:
...
Puoi escludere i pod avviati di recente utilizzando il flag --minimum-age.
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter minimumAge=6h0m0s
Puoi limitare il momento in cui viene introdotto il caos in base ai giorni della settimana, alle fasce orarie del giorno, ai giorni dell'anno o a tutti questi insieme.
Aggiungi un elenco separato da virgole di giorni della settimana abbreviati tramite l'opzione --excluded-weekdays, un elenco separato da virgole di fasce orarie tramite l'opzione --excluded-times-of-day e/o un elenco separato da virgole di giorni dell'anno tramite l'opzione --excluded-days-of-year e specifica un --timezone in base al quale interpretarli.
$ 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
Usa UTC, Local o scegli un nome di fuso orario dal (database tz (IANA). Se stai testando chaoskube dalla tua macchina locale, Local è la scelta più sensata. Una volta distribuito chaoskube nel tuo cluster, dovresti eseguirlo con un fuso orario specifico, ad esempio quello in cui vive la maggior parte dei membri del tuo team, così che il team e chaoskube abbiano una comprensione comune di quando un determinato giorno della settimana inizia e finisce, per esempio. Se il tuo team è distribuito su più fusi orari, probabilmente è meglio scegliere UTC, che è anche il valore predefinito. Scegliere il fuso orario sbagliato sposta il significato di un determinato giorno della settimana di un paio d'ore tra te e il server.
Esistono diversi altri progetti che ti consentono di creare un po' di caos nel tuo cluster Kubernetes.
chaoskube non ha. Può inoltre essere reso consapevole di gruppi di pod che formano un'applicazione, così da poterli trattare in modo speciale, ad esempio terminare tutti i pod di un'applicazione contemporaneamente. kube-mokey consente di filtrare i target a livello globale tramite opzioni di configurazione e di consentire ai pod di aderire al caos tramite annotazioni; permette alle singole app di aderire in modo unico, ad esempio l'app-a può richiedere di terminare un pod ogni giorno della settimana, mentre l'app-b, più coraggiosa, può richiedere di terminare il 50% dei pod. Comprende un file di configurazione simile a quello usato dalla ChaosMonkey di Netflix.Questo progetto non sarebbe dove è senza le idee e l'aiuto di diversi fantastici collaboratori:
Sentiti libero di aprire issue o inviare pull request.
| Opzione | Variabile d'ambiente | Descrizione | Predefinito |
|---|
--interval | CHAOSKUBE_INTERVAL | intervallo tra le terminazioni dei pod | 10m |
--labels | CHAOSKUBE_LABELS | selettore di label per filtrare i pod | (corrisponde a tutto) |
--annotations | CHAOSKUBE_ANNOTATIONS | selettore di annotazioni per filtrare i pod | (corrisponde a tutto) |
--kinds | CHAOSKUBE_KINDS | selettore di kind del proprietario per filtrare i pod | (tutti i kind) |
--namespaces | CHAOSKUBE_NAMESPACES | selettore di namespace per filtrare i pod | (tutti i namespace) |
--namespace-labels | CHAOSKUBE_NAMESPACE_LABELS | selettore di label per filtrare i namespace e i relativi pod | (tutti i namespace) |
--included-pod-names | CHAOSKUBE_INCLUDED_POD_NAMES | pattern di espressione regolare per i nomi dei pod da includere | (tutti inclusi) |
--excluded-pod-names | CHAOSKUBE_EXCLUDED_POD_NAMES | pattern di espressione regolare per i nomi dei pod da escludere | (nessuno escluso) |
--excluded-weekdays | CHAOSKUBE_EXCLUDED_WEEKDAYS | giorni della settimana in cui il caos deve essere sospeso, es. "Sat,Sun" | (nessun giorno della settimana escluso) |
--excluded-times-of-day | CHAOSKUBE_EXCLUDED_TIMES_OF_DAY | fasce orarie in cui il caos deve essere sospeso, es. "22:00-08:00" | (nessuna fascia oraria esclusa) |
--excluded-days-of-year | CHAOSKUBE_EXCLUDED_DAYS_OF_YEAR | giorni dell'anno in cui il caos deve essere sospeso, es. "Apr1,Dec24" | (nessun giorno dell'anno escluso) |
--timezone | CHAOSKUBE_TIMEZONE | fuso orario dal database tz, es. "America/New_York", "UTC" o "Local" | (UTC) |
--max-runtime | CHAOSKUBE_MAX_RUNTIME | Durata massima di esecuzione prima che chaoskube termini | -1s (tempo infinito) |
--max-kill | CHAOSKUBE_MAX_KILL | Specifica il numero massimo di pod da terminare per intervallo | 1 |
--minimum-age | CHAOSKUBE_MINIMUM_AGE | Età minima per filtrare i pod | 0s (corrisponde a ogni pod) |
--dry-run | CHAOSKUBE_DRY_RUN | non terminare i pod, registra solo cosa sarebbe stato fatto | true |
--log-format | CHAOSKUBE_LOG_FORMAT | specifica il formato dei messaggi di log. Le opzioni sono text e json | text |
--log-caller | CHAOSKUBE_LOG_CALLER | include il nome della funzione chiamante e la posizione nei messaggi di log | false |
--slack-webhook | CHAOSKUBE_SLACK_WEBHOOK | L'indirizzo del webhook di Slack per le notifiche | disabilitato |
--client-namespace-scope | CHAOSKUBE_CLIENT_NAMESPACE_SCOPE | Limita le chiamate API di Kubernetes al namespace specificato | (tutti i namespace) |
kubectl, scritto in un paio di righe di bash. Dato un namespace e un intervallo, termina un pod casuale in quel namespace a ogni intervallo. Più o meno come funzionava chaoskube all'inizio.