DevOps & CI/CD

Dominando Chaos Engineering: Princípios, Chaos Monkey e LitmusChaos em Kubernetes em Projetos Reais

13 min de leitura

Dominando Chaos Engineering: Princípios, Chaos Monkey e LitmusChaos em Kubernetes em Projetos Reais

Entendendo Chaos Engineering: Fundamentos e Filosofia Chaos Engineering é uma disciplina de engenharia que se baseia em injetar falhas controladas em sistemas de produção para descobrir vulnerabilidades antes que elas causem impacto real nos usuários. Diferentemente dos testes tradicionais que validam comportamentos esperados, Chaos Engineering questiona o que acontece quando tudo dá errado. A filosofia central é simples: quanto mais cedo você souber como seu sistema falha, melhor preparado estará para lidar com falhas reais e inesperadas. A prática surgiu na Netflix em meados de 2011, quando engenheiros perceberam que ambientes de teste não conseguiam reproduzir a complexidade de falhas em produção. O Chaos Monkey foi o primeiro experimento controlado, removendo aleatoriamente instâncias de servidores para forçar os times a construir sistemas resilientes. Desde então, evoluiu para uma metodologia robusta aplicada por empresas como Amazon, Google, Microsoft e LinkedIn. O objetivo não é quebrar o sistema por quebrar, mas aprender a construir sistemas que toleram e se recuperam de falhas

<h2>Entendendo Chaos Engineering: Fundamentos e Filosofia</h2>

<p>Chaos Engineering é uma disciplina de engenharia que se baseia em injetar falhas controladas em sistemas de produção para descobrir vulnerabilidades antes que elas causem impacto real nos usuários. Diferentemente dos testes tradicionais que validam comportamentos esperados, Chaos Engineering questiona o que acontece quando tudo dá errado. A filosofia central é simples: quanto mais cedo você souber como seu sistema falha, melhor preparado estará para lidar com falhas reais e inesperadas.</p>

<p>A prática surgiu na Netflix em meados de 2011, quando engenheiros perceberam que ambientes de teste não conseguiam reproduzir a complexidade de falhas em produção. O Chaos Monkey foi o primeiro experimento controlado, removendo aleatoriamente instâncias de servidores para forçar os times a construir sistemas resilientes. Desde então, evoluiu para uma metodologia robusta aplicada por empresas como Amazon, Google, Microsoft e LinkedIn. O objetivo não é quebrar o sistema por quebrar, mas aprender a construir sistemas que toleram e se recuperam de falhas graciosamente.</p>

<h3>Os Princípios Fundamentais</h3>

<p>Os princípios de Chaos Engineering, definidos no Chaos Engineering Community Manifesto, estabelecem que você deve começar documentando o estado estável do seu sistema. Um estado estável é um conjunto de métricas observáveis que indicam que o sistema está funcionando normalmente: taxa de requisições processadas, latência média, taxa de erros, consumo de recursos. Sem essa linha de base, você não consegue detectar o que mudou quando o caos é introduzido.</p>

<p>O segundo princípio é fazer hipóteses sobre como o sistema deveria se comportar sob falha: &quot;Se dermos down em uma zona de disponibilidade, o tráfego deve ser redirecionado em menos de 30 segundos&quot;. Depois você executa o experimento de forma controlada, com escopo limitado e em horários onde o impacto é menor. Por fim, você observa se a hipótese se confirmou e documenta os aprendizados, criando um ciclo de melhoria contínua.</p>

<h2>Chaos Monkey: O Pioneiro da Resiliência</h2>

<p>Chaos Monkey é uma ferramenta que mata aleatoriamente instâncias de máquinas virtuais ou contêineres em ambientes de produção. Desenvolvido pela Netflix, ele forceja os arquitetos a projetar sistemas que não dependem de instâncias específicas. Quando você sabe que qualquer servidor pode desaparecer a qualquer momento, você naturalmente constrói redundância, descoberta de serviços e tratamento de falhas.</p>

<p>A beleza do Chaos Monkey está em sua simplicidade. Ele não examina logs ou métricas — apenas mata instâncias. Se seu sistema cair quando uma instância morre, isso é um problema. Se o tráfego for redistribuído automaticamente e os usuários não notarem, você tem um sistema resiliente. A ferramenta executava ataques durante o horário de negócios propositalmente, porque se as falhas acontecem durante o expediente, os engenheiros estão alertas para investigar e corrigir problemas imediatamente.</p>

<h3>Implementando Conceitos de Chaos Monkey em Kubernetes</h3>

<p>Embora o Chaos Monkey original fosse para infraestrutura clássica, seus princípios se aplicam perfeitamente a Kubernetes. Em um cluster Kubernetes, você pode simular sua lógica deletando pods aleatoriamente. Aqui está um exemplo funcional usando <code>kubectl</code>:</p>

<pre><code class="language-bash">#!/bin/bash

chaos-monkey-k8s.sh - Simples Chaos Monkey para Kubernetes

NAMESPACE=&quot;default&quot;

LABEL_SELECTOR=&quot;app=web&quot;

Encontra pods com o label especificado

PODS=$(kubectl get pods -n $NAMESPACE -l $LABEL_SELECTOR -o jsonpath=&#039;{.items[*].metadata.name}&#039;)

if [ -z &quot;$PODS&quot; ]; then

echo &quot;Nenhum pod encontrado com o label $LABEL_SELECTOR&quot;

exit 1

fi

Converte para array

POD_ARRAY=($PODS)

Seleciona um pod aleatório

RANDOM_POD=${POD_ARRAY[$RANDOM % ${#POD_ARRAY[@]}]}

echo &quot;[$(date)] Eliminando pod: $RANDOM_POD&quot;

kubectl delete pod $RANDOM_POD -n $NAMESPACE --grace-period=0 --force

sleep 5

Verifica o estado atual

echo &quot;[$(date)] Estado dos pods após caos:&quot;

kubectl get pods -n $NAMESPACE -l $LABEL_SELECTOR</code></pre>

<p>Este script simples encapsula o conceito central: selecione um pod aleatoriamente e mate-o. Você pode agendar isso com cron ou colocá-lo em um container que roda periodicamente. O impacto observável é que seu deployment deve ter replicas suficientes e o traffic routing (via service) deve redistribuir o tráfego automaticamente. Se não fizer, você tem um problema a resolver.</p>

<h2>LitmusChaos: Experimentação Avançada em Kubernetes</h2>

<p>LitmusChaos é um framework open-source de Chaos Engineering especificamente construído para Kubernetes. Diferentemente do simples Chaos Monkey, ele oferece uma abordagem declarativa, baseada em CustomResourceDefinitions (CRDs), e um amplo catálogo de experimentos pré-construídos. LitmusChaos permite injetar falhas em múltiplas camadas: pod, node, rede, armazenamento e aplicação.</p>

<p>O poder do LitmusChaos reside em sua flexibilidade. Você não precisa escrever scripts bash para cada tipo de falha. Em vez disso, você define um arquivo YAML descrevendo qual experimento executar, suas configurações e critérios de sucesso. A plataforma cuida da orquestração, observação e relatório. Além disso, oferece um painel web onde você pode visualizar experimentos em tempo real, histórico de execuções e resultados agregados.</p>

<h3>Instalando e Configurando LitmusChaos</h3>

<p>Para começar com LitmusChaos, você precisa instalar o operador e os componentes necessários. Aqui está como fazer:</p>

<pre><code class="language-bash"># 1. Cria namespace específico para LitmusChaos

kubectl create namespace litmus

2. Adiciona repositório Helm do LitmusChaos

helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/

helm repo update

3. Instala o operador do LitmusChaos

helm install litmus litmuschaos/litmus \

--namespace litmus \

--set analytics.enabled=true \

--set analytics.backend=prometheus

4. Verifica a instalação

kubectl get pods -n litmus

kubectl get crds | grep litmuschaos</code></pre>

<p>Após a instalação, você terá CustomResourceDefinitions (CRDs) como <code>ChaosEngine</code>, <code>ChaosExperiment</code> e <code>ChaosResult</code> disponíveis. O LitmusChaos usa um modelo onde você define experimentos reutilizáveis e depois os executa via ChaosEngines.</p>

<h3>Criando e Executando Experimentos</h3>

<p>Vamos criar um experimento prático. Suponha que você queira testar como sua aplicação web se comporta quando seus pods são eliminados aleatoriamente:</p>

<pre><code class="language-yaml"># litmus-experiment.yaml

apiVersion: litmuschaos.io/v1alpha1

kind: ChaosEngine

metadata:

name: web-chaos-experiment

namespace: default

spec:

appinfo:

appns: default

applabel: &quot;app=web&quot;

appkind: deployment

engineState: &quot;active&quot;

chaosServiceAccount: litmus-admin

experiments:

  • name: pod-delete

spec:

components:

env:

Número de pods a serem eliminados

  • name: TOTAL_CHAOS_DURATION

value: &quot;30&quot;

  • name: CHAOS_INTERVAL

value: &quot;10&quot;

  • name: FORCE

value: &quot;true&quot;

  • name: PODS_AFFECTED_PERC

value: &quot;50&quot;

probe:

  • name: check-pod-restart

type: httpProbe

httpProbe/inputs:

url: &quot;http://web-service:8080/health&quot;

insecureSkipVerify: true

responseTimeout: 5

mode: Continuous

runProperties:

probeTimeout: 5

interval: 1

retry: 1</code></pre>

<p>Para executar este experimento:</p>

<pre><code class="language-bash"># Aplica o ChaosEngine

kubectl apply -f litmus-experiment.yaml

Monitora a execução

kubectl get chaosresults -n default -w

Visualiza logs do experimento

kubectl logs -n litmus -l app=chaos-operator -f</code></pre>

<p>Este experimento vai eliminar até 50% dos pods da aplicação web durante 30 segundos. O LitmusChaos vai executar probes HTTP no endpoint <code>/health</code> para validar se o serviço permanece respondendo durante a falha. O resultado é automaticamente documentado em um ChaosResult.</p>

<h3>Definindo Critérios de Sucesso</h3>

<p>Um aspecto crítico do LitmusChaos é a capacidade de definir automaticamente se um experimento foi bem-sucedido ou não. Você pode fazer isso usando probes mais sofisticadas:</p>

<pre><code class="language-yaml"># litmus-advanced-experiment.yaml

apiVersion: litmuschaos.io/v1alpha1

kind: ChaosEngine

metadata:

name: advanced-web-test

namespace: default

spec:

appinfo:

appns: default

applabel: &quot;app=api-server&quot;

appkind: statefulset

engineState: &quot;active&quot;

chaosServiceAccount: litmus-admin

experiments:

  • name: network-latency

spec:

components:

env:

  • name: TOTAL_CHAOS_DURATION

value: &quot;60&quot;

  • name: NETWORK_LATENCY

value: &quot;250&quot;

  • name: JITTER

value: &quot;50&quot;

  • name: CONTAINER_RUNTIME

value: &quot;docker&quot;

probe:

  • name: latency-check

type: httpProbe

httpProbe/inputs:

url: &quot;http://api-service:3000/api/users&quot;

method:

get:

criteria: &quot;==&quot;

responseCode: &quot;200&quot;

responseTimeout: 10

mode: Edge

runProperties:

probeTimeout: 10

interval: 2

retry: 3

  • name: database-connectivity

type: cmdProbe

cmdProbe/inputs:

command: /bin/sh

args:

  • -c

- &quot;mysql -h $DB_HOST -u $DB_USER -p$DB_PASS -e &#039;SELECT 1;&#039; &gt; /dev/null 2&gt;&amp;1 &amp;&amp; echo success || echo fail&quot;

mode: Continuous

runProperties:

probeTimeout: 5

interval: 3

retry: 2

verdict: &quot;Mandatory&quot;</code></pre>

<p>Neste exemplo avançado, temos duas probes: uma HTTP que verifica se a API ainda retorna status 200 mesmo com latência de rede injetada, e uma probe CMD que executa um comando customizado para validar conectividade com o banco de dados. Se ambas forem bem-sucedidas, o experimento é considerado bem-sucedido.</p>

<h2>Observabilidade e Interpretação de Resultados</h2>

<p>Executar experimentos é apenas metade do trabalho. A observabilidade durante e após os experimentos é fundamental. LitmusChaos fornece métricas que podem ser integradas com Prometheus e Grafana. Você pode monitorar em tempo real: quantos pods foram afetados, quanto tempo levou para o sistema se recuperar, qual foi o impacto nas requisições.</p>

<pre><code class="language-yaml"># prometheus-litmus-config.yaml

apiVersion: v1

kind: ConfigMap

metadata:

name: prometheus-litmus

namespace: prometheus

data:

prometheus.yml: |

global:

scrape_interval: 15s

scrape_configs:

  • job_name: litmus-metrics

static_configs:

  • targets: [&#039;litmus-metrics:8080&#039;]

metric_relabel_configs:

  • source_labels: [__name__]

regex: &#039;litmuschaos_.*&#039;

action: keep</code></pre>

<p>Após executar um experimento, você obtém automaticamente um ChaosResult que contém:</p>

<pre><code class="language-bash"># Exemplo de resultado

kubectl get chaosresult web-chaos-experiment-pod-delete -n default -o yaml

Saída esperada (parcial):

status:

experimentStatus:

phase: Completed

verdict: Pass # Ou Fail

probeSuccessPercentage: &quot;98&quot;

failStep: &quot;&quot;

description: &quot;Experiment completed successfully&quot;</code></pre>

<p>Um resultado bem-sucedido significa que seu sistema tolerou a falha conforme esperado. Um resultado falhado é ouro — você descobriu um problema em um ambiente controlado antes que afete seus clientes em produção.</p>

<h2>Melhores Práticas e Armadilhas Comuns</h2>

<p>A primeira e mais importante prática é começar pequeno. Não lance um experimento que mata 100% dos seus pods em horário de pico. Comece com 10%, observe, entenda, depois escale. Defina sempre um window de tempo limitado — 30 a 60 segundos é geralmente suficiente. Use namespaces e labels específicos para garantir que você está testando exatamente o que pretende testar.</p>

<p>A segunda prática é documentar tudo. Cada experimento deve ter uma hipótese clara: &quot;Se eliminarmos 50% dos pods, o sistema deve manter P99 latency abaixo de 1 segundo&quot;. Documente os resultados, o que aprendeu, e o que precisa ser corrigido. Isso cria um histórico de como o sistema evoluiu em termos de resiliência.</p>

<p>Uma armadilha comum é executar Chaos Engineering apenas uma vez e considerar o sistema &quot;pronto&quot;. Resiliência é um processo contínuo. Conforme você faz deployments de novas versões, dependências mudam, infraestrutura é atualizada — o sistema pode regredir. Recomenda-se executar suites de experimentos regularmente, até mesmo como parte do pipeline CI/CD.</p>

<p>Outra armadilha é injetar falhas sem observabilidade adequada. Se você não tem métricas, logs agregados e APM (Application Performance Monitoring) rodando durante experimentos, você não saberá o que aconteceu. Invista em observabilidade primeiro, Chaos Engineering depois.</p>

<h2>Conclusão</h2>

<p>Chaos Engineering não é sobre destruir sistemas; é sobre entender como seus sistemas se comportam sob pressão e falha, permitindo que você construa resiliência de forma inteligente. O Chaos Monkey estabeleceu o conceito de matar instâncias aleatoriamente, mas LitmusChaos elevou isso a um nível de sofisticação onde você pode executar centenas de tipos diferentes de falhas de forma declarativa, com probes automatizadas e resultados verificáveis.</p>

<p>Os três pontos principais que você deve levar deste artigo são: (1) defina sempre um estado estável e hipóteses claras antes de qualquer experimento — não é aleatório puro; (2) comece pequeno, com escopo limitado, e escale gradualmente à medida que ganha confiança no sistema; (3) Chaos Engineering é contínuo e evolui com seu sistema — não é uma atividade única, mas parte da cultura de engenharia.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://chaos.community/" target="_blank" rel="noopener noreferrer">Chaos Engineering Community Manifesto</a></li>

<li><a href="https://docs.litmuschaos.io/" target="_blank" rel="noopener noreferrer">LitmusChaos Official Documentation</a></li>

<li><a href="https://www.gremlin.com/blog/chaos-engineering-netflix/" target="_blank" rel="noopener noreferrer">Netflix Chaos Engineering</a></li>

<li><a href="https://kubernetes.io/docs/concepts/configuration/overview/" target="_blank" rel="noopener noreferrer">Kubernetes Best Practices for Resilience</a></li>

<li><a href="https://www.gremlin.com/chaos-engineering/" target="_blank" rel="noopener noreferrer">Gremlin Guide to Chaos Engineering</a></li>

</ul>

<p>&lt;!-- FIM --&gt;</p>

Comentários

Mais em DevOps & CI/CD

Dominando Fundamentos de CI/CD: Pipelines, Stages e Boas Práticas em Projetos Reais
Dominando Fundamentos de CI/CD: Pipelines, Stages e Boas Práticas em Projetos Reais

Entendendo CI/CD: Do Conceito à Prática CI/CD é um conjunto de práticas que a...

Como Usar Gerenciamento de Processos no Linux: systemd, journald e Serviços em Produção
Como Usar Gerenciamento de Processos no Linux: systemd, journald e Serviços em Produção

Entendendo o systemd: O Coração do Linux Moderno O systemd é o sistema de ini...

Dominando Tekton em Kubernetes: Pipelines Cloud-Native do Zero em Projetos Reais
Dominando Tekton em Kubernetes: Pipelines Cloud-Native do Zero em Projetos Reais

O que é Tekton e por que você precisa aprender Tekton é um framework open-sou...