
Termina periódicamente pods aleatorios de Kubernetes para probar cómo se comportan los sistemas ante fallos arbitrarios de pods, con soporte de filtros por namespace, etiquetas, anotaciones y programación para experimentos de caos controlados.
chaoskube mata periódicamente pods aleatorios en tu clúster de Kubernetes.

Prueba cómo se comporta tu sistema ante fallos arbitrarios de pods.
Al ejecutarlo, matará un pod en cualquier namespace cada 10 minutos por defecto.
$ 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 permite filtrar los pods objetivo por namespaces, labels, annotations y edad, así como excluir ciertos días de la semana, horas del día y días del año del caos.
Puedes instalar chaoskube con Helm. Sigue la Guía de inicio rápido de Helm y luego instala el chart de chaoskube.
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
Consulta chaoskube en kubeapps.com para aprender cómo configurarlo y encontrar otros charts de Helm útiles.
Consulta el manifest de ejemplo. Asegúrate de otorgar a chaoskube los permisos apropiados utilizando el ClusterRole proporcionado.
Por defecto, chaoskube será amigable y no matará nada. Cuando hayas validado tu clúster objetivo, puedes desactivar el modo dry-run pasando la flag --no-dry-run. También puedes especificar un intervalo más agresivo y otras flags soportadas para tu despliegue.
Si te estás ejecutando en un clúster de Kubernetes y quieres apuntar al mismo clúster, esto es todo lo que necesitas hacer.
Si quieres apuntar a un clúster diferente o ejecutarlo localmente, especifica tu clúster mediante la flag --master o proporciona un kubeconfig válido mediante la flag --kubeconfig. Por defecto, usa la ruta estándar de tu kubeconfig en tu directorio personal. Eso significa que se apuntará al contexto que esté actualmente activo allí.
Si quieres aumentar o disminuir la cantidad de caos, cambia el intervalo entre muertes con la flag --interval. Alternativamente, puedes aumentar el número de réplicas de tu despliegue de chaoskube.
Recuerda que chaoskube por defecto mata cualquier pod en todos tus namespaces, incluidos los pods del sistema y él mismo.
chaoskube proporciona un endpoint HTTP simple que se puede usar para comprobar que está ejecutándose. Esto se puede utilizar para sondas de liveness y readiness de Kubernetes. Por defecto, escucha en el puerto 8080. Para deshabilitarlo, pasa --metrics-address="" a chaoskube.
Sin embargo, puedes limitar el espacio de búsqueda de chaoskube proporcionando selectores de labels, annotations y namespaces, patrones de inclusión/exclusión de nombres de pods, así como una configuración de edad mínima.
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
Esto selecciona todos los pods que tengan la label app establecida a mate, la label chaos establecida a cualquier valor y la label stage no establecida a production o no establecida.
También puedes filtrar los pods objetivo mediante un selector de namespaces.
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
Esto filtrará los pods en los tres namespaces default, staging y testing.
Los namespaces también se pueden filtrar mediante un selector de labels de namespace.
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
Esto excluirá todos los pods de namespaces con la label integration.
Puedes filtrar los pods objetivo mediante un selector de tipo de OwnerReference.
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
Esto excluirá cualquier pod de DaemonSet y StatefulSet.
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
Esto solo incluirá cualquier pod de DaemonSet.
Ten en cuenta: cualquier filtro de include excluirá automáticamente todos los pods sin OwnerReference definida.
Puedes filtrar los pods por nombre:
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
Esto hará que solo se ataquen los pods cuyo nombre contenga 'foo' o 'bar' y no contenga 'prod'.
También puedes excluir namespaces y combinarlos con los selectores de labels y 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"
Esto limita aún más el espacio de búsqueda del selector de labels anterior, excluyendo también cualquier pod en los namespaces kube-system y production, además de ignorar todos los pods marcados como críticos.
El selector de annotations también se puede utilizar para ejecutar chaoskube como un addon del clúster y permitir que los pods opten por ser terminados como mejor te parezca. Por ejemplo, podrías ejecutar chaoskube así:
$ 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 menos que ya utilices esa annotation en algún lugar, esto inicialmente ignorará todos tus pods (puedes ver el número de candidatos en modo debug). Luego podrías optar selectivamente por incluir despliegues individuales en modo caos anotando sus pods 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:
...
Puedes excluir pods que se hayan iniciado recientemente usando la flag --minimum-age.
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter minimumAge=6h0m0s
Puedes limitar el momento en que se introduce el caos mediante días de la semana, períodos de tiempo de un día, día del año o todos juntos.
Añade una lista separada por comas de días de la semana abreviados mediante la opción --excluded-weekdays, una lista separada por comas de períodos de tiempo mediante la opción --excluded-times-of-day y/o una lista separada por comas de días de un año mediante la opción --excluded-days-of-year y especifica un --timezone para interpretarlos.
$ 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 elige un nombre de zona horaria de la base de datos de zonas horarias (IANA) tz. Si estás probando chaoskube desde tu máquina local, Local tiene más sentido. Una vez que despliegues chaoskube en tu clúster, deberías desplegarlo con una zona horaria específica, p. ej. donde viva la mayoría de los miembros de tu equipo, para que tanto tu equipo como chaoskube tengan un entendimiento común de cuándo comienza y termina un día de la semana en particular, por ejemplo. Si tu equipo está repartido en múltiples zonas horarias, probablemente sea mejor elegir UTC, que también es el valor por defecto. Elegir la zona horaria incorrecta desplaza el significado de un día de la semana en particular unas horas entre tú y el servidor.
Hay varios otros proyectos que te permiten crear algo de caos en tu clúster de Kubernetes.
chaoskube carece. También puede tener en cuenta grupos de pods que forman una aplicación para poder tratarlos de manera especial, p. ej. matar todos los pods de una aplicación a la vez. kube-monkey permite filtrar objetivos globalmente mediante opciones de configuración, así como permitir que los pods opten por el caos mediante annotations; permite que aplicaciones individuales opten de su propia manera única. Por ejemplo, la app-a puede solicitar matar un pod cada día de la semana, mientras que la app-b, que es más valiente, puede solicitar matar el 50% de los pods. Entiende un archivo de configuración similar al utilizado por ChaosMonkey de Netflix.Este proyecto no estaría donde está sin las ideas y la ayuda de varios contribuyentes increíbles:
No dudes en crear issues o enviar pull requests.
| Opción | Entorno | Descripción | Por defecto |
|---|
--interval | CHAOSKUBE_INTERVAL | intervalo entre terminaciones de pods | 10m |
--labels | CHAOSKUBE_LABELS | selector de labels para filtrar pods | (coincide con todo) |
--annotations | CHAOSKUBE_ANNOTATIONS | selector de annotations para filtrar pods | (coincide con todo) |
--kinds | CHAOSKUBE_KINDS | selector de tipo del owner para filtrar pods | (todos los tipos) |
--namespaces | CHAOSKUBE_NAMESPACES | selector de namespaces para filtrar pods | (todos los namespaces) |
--namespace-labels | CHAOSKUBE_NAMESPACE_LABELS | selector de labels para filtrar namespaces y sus pods | (todos los namespaces) |
--included-pod-names | CHAOSKUBE_INCLUDED_POD_NAMES | patrón de expresión regular para nombres de pods a incluir | (todos incluidos) |
--excluded-pod-names | CHAOSKUBE_EXCLUDED_POD_NAMES | patrón de expresión regular para nombres de pods a excluir | (ninguno excluido) |
--excluded-weekdays | CHAOSKUBE_EXCLUDED_WEEKDAYS | días de la semana en que se suspende el caos, p. ej. "Sat,Sun" | (ningún día excluido) |
--excluded-times-of-day | CHAOSKUBE_EXCLUDED_TIMES_OF_DAY | horas del día en que se suspende el caos, p. ej. "22:00-08:00" | (ninguna hora excluida) |
--excluded-days-of-year | CHAOSKUBE_EXCLUDED_DAYS_OF_YEAR | días de un año en que se suspende el caos, p. ej. "Apr1,Dec24" | (ningún día excluido) |
--timezone | CHAOSKUBE_TIMEZONE | zona horaria de la base de datos tz, p. ej. "America/New_York", "UTC" o "Local" | (UTC) |
--max-runtime | CHAOSKUBE_MAX_RUNTIME | tiempo máximo de ejecución antes de que chaoskube salga | -1s (tiempo infinito) |
--max-kill | CHAOSKUBE_MAX_KILL | especifica el número máximo de pods a terminar por intervalo | 1 |
--minimum-age | CHAOSKUBE_MINIMUM_AGE | edad mínima para filtrar pods | 0s (coincide con cada pod) |
--dry-run | CHAOSKUBE_DRY_RUN | no matar pods, solo registrar lo que se habría hecho | true |
--log-format | CHAOSKUBE_LOG_FORMAT | especifica el formato de los mensajes de log. Las opciones son text y json | text |
--log-caller | CHAOSKUBE_LOG_CALLER | incluye el nombre y la ubicación de la función llamante en los mensajes de log | false |
--slack-webhook | CHAOSKUBE_SLACK_WEBHOOK | la dirección del webhook de Slack para notificaciones | deshabilitado |
--client-namespace-scope | CHAOSKUBE_CLIENT_NAMESPACE_SCOPE | limita las llamadas a la API de Kubernetes al namespace dado | (todos los namespaces) |
kubectl y está escrito en unas pocas líneas de bash. Dado un namespace y un intervalo, mata un pod aleatorio en ese namespace en cada intervalo. Muy parecido a como funcionaba chaoskube al principio.