Chaos Engineering é uma prática que envolve a introdução deliberada de falhas em um sistema para testar sua resiliência. Uma das ferramentas populares nessa prática é o Chaos Monkey, que é utilizada para interromper serviços em um ambiente controlado e observar como o sistema responde. Neste artigo, vamos explorar como criar um "Chaos Monkey" para Kubernetes, utilizando um script em Python que deleta pods de forma aleatória em um cluster, para avaliar a robustez do sistema.

Pré-requisitos

  1. Kubernetes cluster.
  2. Python 3.x.
  3. Biblioteca kubernetes para Python.

Instalação da Biblioteca Kubernetes

Para interagir com a API do Kubernetes usando Python, precisamos da biblioteca kubernetes. Instale-a utilizando o seguinte comando:

pip install kubernetes

O Script Python

Aqui está o script Python que deleta pods aleatoriamente em namespaces específicos.

import random
import time
from kubernetes import client, config

def delete_random_pod():
    config.load_kube_config()
    v1 = client.CoreV1Api()

    namespaces = ["default", "kube-system", "your-namespace"]
    namespace = random.choice(namespaces)

    pods = v1.list_namespaced_pod(namespace)
    if not pods.items:
        print(f"No pods found in namespace: {namespace}")
        return

    pod = random.choice(pods.items)
    pod_name = pod.metadata.name

    print(f"Deleting pod {pod_name} in namespace {namespace}")
    v1.delete_namespaced_pod(name=pod_name, namespace=namespace)

if __name__ == "__main__":
    while True:
        delete_random_pod()
        time.sleep(3600)  # Executa a cada 1 hora

Explicação do Script

  1. Carregando a Configuração do Kubernetes: Utiliza config.load_kube_config() para carregar a configuração do Kubernetes do contexto atual.

  2. Selecionando um Namespace Aleatório: A lista namespaces contém os namespaces dos quais os pods podem ser excluídos. Escolhemos um namespace aleatoriamente usando random.choice().

  3. Listando e Deletando Pods: Listamos os pods no namespace selecionado. Se houver pods, escolhemos um aleatoriamente e o deletamos.

  4. Agendamento da Execução: Utilizamos um loop infinito para executar a exclusão de pods a cada 1 hora (time.sleep(3600)).

Melhorias e Considerações

  1. Exclusão Segura: Para evitar a exclusão de pods críticos, podemos adicionar lógica para filtrar pods baseados em labels ou annotations.