
Termina periodicamente pods Kubernetes aleatórios para testar como os sistemas se comportam sob falhas arbitrárias de pods, com suporte a filtros de namespace, label, annotation e agendamento para experimentos de caos controlados.
O chaoskube elimina periodicamente pods aleatórios no seu cluster Kubernetes.

Teste como o seu sistema se comporta sob falhas arbitrárias de pods.
Executá-lo eliminará um pod em qualquer namespace a cada 10 minutos por padrão.
$ 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
...
O chaoskube permite filtrar os pods alvo por namespaces, labels, annotations e idade, bem como excluir certos dias da semana, horários do dia e dias do ano do caos.
Você pode instalar o chaoskube com o Helm. Siga o Guia de Início Rápido do Helm e depois instale o chart chaoskube.
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
Consulte chaoskube no kubeapps.com para saber como configurá-lo e para encontrar outros charts Helm úteis.
Consulte o manifesto de exemplo. Certifique-se de conceder ao chaoskube as permissões adequadas usando o ClusterRole fornecido.
Por padrão, o chaoskube será amigável e não eliminará nada. Quando você tiver validado o seu cluster alvo, pode desativar o modo dry-run passando a flag --no-dry-run. Você também pode especificar um intervalo mais agressivo e outras flags suportadas para a sua implantação.
Se você estiver executando em um cluster Kubernetes e quiser atingir o mesmo cluster, isso é tudo o que precisa de fazer.
Se você quiser atingir um cluster diferente ou executá-lo localmente, especifique seu cluster por meio da flag --master ou forneça um kubeconfig válido por meio da flag --kubeconfig. Por padrão, ele usa o caminho padrão do kubeconfig no seu diretório pessoal. Isso significa que qualquer contexto atual nesse arquivo será o alvo.
Se você quiser aumentar ou diminuir a quantidade de caos, altere o intervalo entre as eliminações com a flag --interval. Alternativamente, você pode aumentar o número de réplicas do seu deployment chaoskube.
Lembre-se de que, por padrão, o chaoskube elimina qualquer pod em todos os seus namespaces, incluindo pods de sistema e a si mesmo.
O chaoskube fornece um endpoint HTTP simples que pode ser usado para verificar se está em execução. Isso pode ser usado para probes de liveness e readiness do Kubernetes. Por padrão, ele escuta na porta 8080. Para desativar, passe --metrics-address="" ao chaoskube.
No entanto, você pode limitar o espaço de busca do chaoskube fornecendo seletores de label, annotation e namespace, padrões de inclusão/exclusão de nomes de pods, bem como uma configuração de idade mínima.
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
Isso seleciona todos os pods que têm o label app definido como mate, o label chaos definido como qualquer coisa e o label stage não definido como production ou não definido.
Você também pode filtrar os pods alvo pelo seletor de namespace.
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
Isso filtrará os pods nos três namespaces default, staging e testing.
Os namespaces também podem ser filtrados por um seletor de label de namespace.
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
Isso excluirá todos os pods de namespaces com o label integration.
Você pode filtrar os pods alvo pelo seletor de kind dos OwnerReferences.
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
Isso excluirá quaisquer pods de DaemonSet e StatefulSet.
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
Isso incluirá apenas quaisquer pods de DaemonSet.
Observe: qualquer filtro de include excluirá automaticamente todos os pods sem OwnerReference definido.
Você pode filtrar pods pelo nome:
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
Isso fará com que apenas pods cujo nome contenha 'foo' ou 'bar' e não contenha 'prod' sejam alvo.
Você também pode excluir namespaces e combinar com os seletores de label e annotation.
$ 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"
Isso limita ainda mais o espaço de busca do seletor de label acima, excluindo também quaisquer pods nos namespaces kube-system e production, além de ignorar todos os pods marcados como críticos.
O seletor de annotation também pode ser usado para executar o chaoskube como um addon de cluster e permitir que os pods optem por ser terminados como você achar melhor. Por exemplo, você poderia executar o chaoskube assim:
$ 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