
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
A menos que você já use essa annotation em algum lugar, isso inicialmente ignorará todos os seus pods (você pode ver o número de candidatos no modo debug). Você poderia então optar seletivamente por deployments individuais no modo caos, anotando seus pods com 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:
...
Você pode excluir pods que foram iniciados recentemente usando a flag --minimum-age.
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter minimumAge=6h0m0s
Você pode limitar o momento em que o caos é introduzido por dias da semana, períodos do dia, dias do ano ou todos juntos.
Adicione uma lista separada por vírgulas de dias da semana abreviados por meio da opção --excluded-weekdays, uma lista separada por vírgulas de períodos do dia por meio da opção --excluded-times-of-day e/ou uma lista separada por vírgulas de dias do ano por meio da opção --excluded-days-of-year e especifique um --timezone para interpretá-los.
$ 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
Use UTC, Local ou escolha um nome de fuso horário do banco de dados de fusos horários (IANA) tz. Se você estiver testando o chaoskube na sua máquina local, Local faz mais sentido. Quando você implantar o chaoskube no seu cluster, deve implantá-lo com um fuso horário específico, por exemplo, onde a maioria dos membros da sua equipe mora, para que tanto a sua equipe quanto o chaoskube tenham um entendimento comum sobre quando um determinado dia da semana começa e termina. Se a sua equipe está distribuída por vários fusos horários, provavelmente é melhor escolher UTC, que também é o padrão. Escolher o fuso horário errado desloca o significado de um determinado dia da semana por algumas horas entre você e o servidor.
Existem vários outros projetos que permitem criar um pouco de caos no seu cluster Kubernetes.
chaoskube não possui. Ele também pode estar ciente de grupos de pods que formam uma aplicação, para que possa tratá-los de forma especial, ex.: eliminar todos os pods de uma aplicação de uma só vez. O kube-monkey permite filtrar alvos globalmente por meio de opções de configuração, bem como permitir que pods optem pelo caos por meio de annotations; ele permite que aplicativos individuais optem de sua própria maneira única. Como exemplo, o app-a pode solicitar que ele elimine um pod a cada dia da semana, enquanto o app-b, que é mais corajoso, pode solicitar que ele elimine 50% dos pods. Ele entende um arquivo de configuração semelhante ao usado pelo ChaosMonkey da Netflix.Este projeto não estaria onde está sem as ideias e a ajuda de vários colaboradores incríveis:
Sinta-se à vontade para criar issues ou enviar pull requests.
| Opção | Ambiente | Descrição | Padrão |
|---|
--interval | CHAOSKUBE_INTERVAL | intervalo entre terminações de pods | 10m |
--labels | CHAOSKUBE_LABELS | seletor de label para filtrar pods | (corresponde a tudo) |
--annotations | CHAOSKUBE_ANNOTATIONS | seletor de annotation para filtrar pods | (corresponde a tudo) |
--kinds | CHAOSKUBE_KINDS | seletor de kind do owner para filtrar pods | (todos os kinds) |
--namespaces | CHAOSKUBE_NAMESPACES | seletor de namespace para filtrar pods | (todos os namespaces) |
--namespace-labels | CHAOSKUBE_NAMESPACE_LABELS | seletor de label para filtrar namespaces e seus pods | (todos os namespaces) |
--included-pod-names | CHAOSKUBE_INCLUDED_POD_NAMES | padrão de expressão regular para nomes de pods a incluir | (todos incluídos) |
--excluded-pod-names | CHAOSKUBE_EXCLUDED_POD_NAMES | padrão de expressão regular para nomes de pods a excluir | (nenhum excluído) |
--excluded-weekdays | CHAOSKUBE_EXCLUDED_WEEKDAYS | dias da semana em que o caos deve ser suspenso, ex.: "Sat,Sun" | (nenhum dia da semana excluído) |
--excluded-times-of-day | CHAOSKUBE_EXCLUDED_TIMES_OF_DAY | horários do dia em que o caos deve ser suspenso, ex.: "22:00-08:00" | (nenhum horário do dia excluído) |
--excluded-days-of-year | CHAOSKUBE_EXCLUDED_DAYS_OF_YEAR | dias do ano em que o caos deve ser suspenso, ex.: "Apr1,Dec24" | (nenhum dia do ano excluído) |
--timezone | CHAOSKUBE_TIMEZONE | fuso horário do banco de dados tz, ex.: "America/New_York", "UTC" ou "Local" | (UTC) |
--max-runtime | CHAOSKUBE_MAX_RUNTIME | tempo máximo de execução antes de o chaoskube sair | -1s (tempo infinito) |
--max-kill | CHAOSKUBE_MAX_KILL | especifica o número máximo de pods a serem terminados por intervalo | 1 |
--minimum-age | CHAOSKUBE_MINIMUM_AGE | idade mínima para filtrar pods | 0s (corresponde a todos os pods) |
--dry-run | CHAOSKUBE_DRY_RUN | não elimine pods, apenas registre o que teria sido feito | true |
--log-format | CHAOSKUBE_LOG_FORMAT | especifique o formato das mensagens de log. As opções são text e json | text |
--log-caller | CHAOSKUBE_LOG_CALLER | inclua o nome e a localização da função chamadora nas mensagens de log | false |
--slack-webhook | CHAOSKUBE_SLACK_WEBHOOK | o endereço do webhook do Slack para notificações | desativado |
--client-namespace-scope | CHAOSKUBE_CLIENT_NAMESPACE_SCOPE | escopo das chamadas à API Kubernetes para o namespace fornecido | (todos os namespaces) |
kubectl escrito em algumas linhas de bash. Dado um namespace e um intervalo, ele elimina um pod aleatório nesse namespace a cada intervalo. Muito parecido com o que o chaoskube fazia no início.