Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Herramientas/GitHubGitHub/linki/chaoskube
Ingeniería del Caos
GitHublinki/chaoskube

chaoskube

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.

Ver Repositorio
1.9k126hace 22 díasRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

chaoskube

GitHub release go-doc

chaoskube mata periódicamente pods aleatorios en tu clúster de Kubernetes.

chaoskube

Por qué

Prueba cómo se comporta tu sistema ante fallos arbitrarios de pods.

Ejemplo

Al ejecutarlo, matará un pod en cualquier namespace cada 10 minutos por defecto.

root@kitploit:~
$ 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.

Cómo

Helm

Puedes instalar chaoskube con Helm. Sigue la Guía de inicio rápido de Helm y luego instala el chart de chaoskube.

root@kitploit:~
$ 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.

Manifest crudo

Consulta el manifest de ejemplo. Asegúrate de otorgar a chaoskube los permisos apropiados utilizando el ClusterRole proporcionado.

Configuración

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.

Filtrando objetivos

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.

root@kitploit:~
$ 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.

root@kitploit:~
$ 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.

root@kitploit:~
$ 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.

root@kitploit:~
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter       kinds="!DaemonSet,!StatefulSet"

Esto excluirá cualquier pod de DaemonSet y StatefulSet.

root@kitploit:~
$ 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:

root@kitploit:~
$ 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.

root@kitploit:~
$ 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í:

root@kitploit:~
$ 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.

root@kitploit:~
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.

root@kitploit:~
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter       minimumAge=6h0m0s

Limitar el caos

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.

root@kitploit:~
$ 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.

Flags

Trabajo relacionado

Hay varios otros proyectos que te permiten crear algo de caos en tu clúster de Kubernetes.

  • kube-monkey es un sofisticado mono de caos basado en pods para Kubernetes. Cada mañana compila un cronograma de terminaciones de pods que deberían ocurrir durante el día. Permite especificar un tiempo medio entre fallos por pod, una característica de la que 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.
  • PowerfulSeal es, de hecho, una herramienta poderosa para perturbar tu configuración de Kubernetes. Además de matar pods, también puede eliminar tus VMs en la nube o matar tu daemon de Docker. Tiene una gran cantidad de opciones de configuración para definir qué se puede matar y cuándo. También tiene un modo interactivo que te permite matar pods fácilmente.
  • el chaos monkey de fabric8: Un mono de caos que viene incluido como una aplicación con la plataforma Kubernetes de fabric8. Puede desplegarse mediante una interfaz de usuario y reporta cualquier acción realizada como un mensaje de chat y/o notificación de escritorio. Puede configurarse con un intervalo y un patrón de nombre de pod que los posibles objetivos deben cumplir.
  • k8aos: Una herramienta interactiva que puede emitir una serie de eliminaciones aleatorias de pods en todo un clúster de Kubernetes o limitada a un namespace.

Agradecimientos

Este proyecto no estaría donde está sin las ideas y la ayuda de varios contribuyentes increíbles:

  • Gracias a @twildeboer y @klautcomputing, quienes impulsaron la idea de limitar el caos durante ciertos momentos, como horas laborales o festivos, así como las primeras implementaciones de esta característica en #54 y #55.
  • Gracias a @klautcomputing por el primer intento de resolver la característica de porcentaje y por proporcionar los archivos de configuración RBAC.
  • Gracias a @j0sh3rs por actualizar el Helm chart a la última versión.
  • Gracias a @klautcomputing, @grosser, @twz123, @hchenxa y @bavarianbidi por las mejoras al Dockerfile y la documentación en #31, #40 y #58.
  • Gracias a @bakins por añadir el filtro de edad mínima en #86.
  • Gracias a @bakins por añadir un health check y métricas de Prometheus en #94 y #97.

Contribuir

No dudes en crear issues o enviar pull requests.

Descargar herramienta
OpciónEntornoDescripciónPor defecto
--intervalCHAOSKUBE_INTERVALintervalo entre terminaciones de pods10m
--labelsCHAOSKUBE_LABELSselector de labels para filtrar pods(coincide con todo)
--annotationsCHAOSKUBE_ANNOTATIONSselector de annotations para filtrar pods(coincide con todo)
--kindsCHAOSKUBE_KINDSselector de tipo del owner para filtrar pods(todos los tipos)
--namespacesCHAOSKUBE_NAMESPACESselector de namespaces para filtrar pods(todos los namespaces)
--namespace-labelsCHAOSKUBE_NAMESPACE_LABELSselector de labels para filtrar namespaces y sus pods(todos los namespaces)
--included-pod-namesCHAOSKUBE_INCLUDED_POD_NAMESpatrón de expresión regular para nombres de pods a incluir(todos incluidos)
--excluded-pod-namesCHAOSKUBE_EXCLUDED_POD_NAMESpatrón de expresión regular para nombres de pods a excluir(ninguno excluido)
--excluded-weekdaysCHAOSKUBE_EXCLUDED_WEEKDAYSdías de la semana en que se suspende el caos, p. ej. "Sat,Sun"(ningún día excluido)
--excluded-times-of-dayCHAOSKUBE_EXCLUDED_TIMES_OF_DAYhoras del día en que se suspende el caos, p. ej. "22:00-08:00"(ninguna hora excluida)
--excluded-days-of-yearCHAOSKUBE_EXCLUDED_DAYS_OF_YEARdías de un año en que se suspende el caos, p. ej. "Apr1,Dec24"(ningún día excluido)
--timezoneCHAOSKUBE_TIMEZONEzona horaria de la base de datos tz, p. ej. "America/New_York", "UTC" o "Local"(UTC)
--max-runtimeCHAOSKUBE_MAX_RUNTIMEtiempo máximo de ejecución antes de que chaoskube salga-1s (tiempo infinito)
--max-killCHAOSKUBE_MAX_KILLespecifica el número máximo de pods a terminar por intervalo1
--minimum-ageCHAOSKUBE_MINIMUM_AGEedad mínima para filtrar pods0s (coincide con cada pod)
--dry-runCHAOSKUBE_DRY_RUNno matar pods, solo registrar lo que se habría hechotrue
--log-formatCHAOSKUBE_LOG_FORMATespecifica el formato de los mensajes de log. Las opciones son text y jsontext
--log-callerCHAOSKUBE_LOG_CALLERincluye el nombre y la ubicación de la función llamante en los mensajes de logfalse
--slack-webhookCHAOSKUBE_SLACK_WEBHOOKla dirección del webhook de Slack para notificacionesdeshabilitado
--client-namespace-scopeCHAOSKUBE_CLIENT_NAMESPACE_SCOPElimita las llamadas a la API de Kubernetes al namespace dado(todos los namespaces)
  • pod-reaper mata pods basándose en un intervalo y una probabilidad de caos configurable. Permite especificar los posibles pods objetivo mediante un selector de labels y un namespace. Tiene la capacidad de apagarse exitosamente después de un tiempo y, por lo tanto, podría ser adecuado para trabajar bien con objetos Job de Kubernetes. También puede configurarse para matar cada pod que haya estado ejecutándose durante más de una duración configurable.
  • kubernetes-pod-chaos-monkey: Un asesino de pods aleatorio muy simple que usa 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.
  • kubeinvaders es una herramienta de ingeniería del caos gamificada para Kubernetes. Es como Space Invaders, pero los alienígenas son pods o nodos workers.