Implementando Self-Healing Infrastructure com Kubernetes e AIOps
Construir uma infraestrutura self-healing deixou de ser luxo reservado a big techs e passou a ser requisito básico para qualquer time que opera clusters Kubernetes em produção. Neste tutorial, mostramos como combinar os mecanismos nativos de autocorreção do Kubernetes com práticas de AIOps para detectar falhas em tempo real e aplicar correções automáticas — como restart de pods, scaling reativo e rollback de deploys — sem depender de intervenção humana. O objetivo é sair da teoria e chegar a uma arquitetura funcional, com manifests YAML, scripts e exemplos de controllers que você pode adaptar ao seu ambiente ainda hoje.
O que é Self-Healing Infrastructure e por que ela importa
Self-healing infrastructure é o conjunto de mecanismos, políticas e automações que permitem que um sistema identifique anomalias, diagnostique a causa provável e execute uma remediação sem que um engenheiro precise ser acionado às 3h da manhã. Em ambientes Kubernetes, isso vai muito além do restartPolicy: Always de um Pod: envolve observabilidade contínua, correlação de eventos, tomada de decisão automatizada e, cada vez mais, modelos de machine learning capazes de prever falhas antes que elas aconteçam.
A adoção de infraestrutura self-healing reduz o MTTR (Mean Time To Recovery), diminui a fadiga operacional de times de SRE e evita que incidentes pequenos se transformem em outages de grande impacto. Quando falamos em AIOps aplicado a Kubernetes, estamos falando de usar dados de telemetria — métricas, logs e traces — para alimentar algoritmos que tomam decisões operacionais em tempo real.
Fundamentos: o Kubernetes já nasce com mecanismos de autocorreção
Antes de adicionar qualquer camada de inteligência artificial, é fundamental dominar os recursos nativos do Kubernetes que já entregam parte do trabalho de self-healing.
Liveness, Readiness e Startup Probes
As probes são o primeiro nível de defesa. Elas informam ao kubelet quando um container está travado, ainda inicializando ou pronto para receber tráfego.
apiVersion: v1
kind: Pod
metadata:
name: api-payments
spec:
containers:
- name: api-payments
image: registry.interno/api-payments:1.4.2
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 15
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 8080
periodSeconds: 5
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 30
periodSeconds: 10
Quando a livenessProbe falha três vezes seguidas, o kubelet reinicia o container automaticamente — o primeiro exemplo prático de infraestrutura self-healing dentro do próprio cluster.
ReplicaSets, Deployments e o controlador de reconciliação
O modelo declarativo do Kubernetes é, por natureza, self-healing: o controller manager compara continuamente o estado desejado (definido no manifest) com o estado atual do cluster e corrige divergências. Se um nó cai e leva três réplicas de um Deployment junto, o ReplicaSet cria novos pods em outros nós automaticamente.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-payments
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
selector:
matchLabels:
app: api-payments
template:
metadata:
labels:
app: api-payments
spec:
containers:
- name: api-payments
image: registry.interno/api-payments:1.4.2
Esses mecanismos resolvem falhas simples, mas não lidam com degradação silenciosa de performance, memory leaks progressivos ou padrões de erro que só ficam evidentes quando correlacionados com dados históricos — é aí que entra o AIOps.
AIOps: adicionando inteligência à correção automática
AIOps (Artificial Intelligence for IT Operations) aplica machine learning e correlação estatística sobre grandes volumes de telemetria para antecipar problemas e automatizar decisões operacionais. Em uma infraestrutura self-healing madura, o AIOps atua em três camadas:
- Detecção de anomalias em métricas (latência, uso de CPU, taxa de erro) usando baselines dinâmicos em vez de thresholds fixos.
- Correlação de eventos entre múltiplos serviços para identificar a causa-raiz real, não apenas o sintoma.
- Decisão e execução de remediação, acionando automações (restart, rollback, scale-out) com base em playbooks previamente validados.
A diferença central entre um cluster “apenas resiliente” e um cluster com infraestrutura self-healing baseada em AIOps é a capacidade de agir sobre padrões complexos — não só sobre falhas binárias de health check.
Arquitetura de referência
Uma arquitetura funcional de self-healing infrastructure para Kubernetes normalmente combina estas camadas:
- Coleta: Prometheus, para métricas de cluster e aplicação.
- Análise: um detector de anomalias (estatístico ou baseado em ML) consumindo as séries temporais do Prometheus.
- Alertamento: Alertmanager, roteando alertas para um serviço de decisão.
- Execução: um Kubernetes Operator customizado, KEDA para scaling e Argo Rollouts para rollback progressivo.
- Auditoria: logs estruturados de cada ação automática, para rastreabilidade e revisão posterior.
A seguir, implementamos cada peça.
Passo 1: configurando a camada de detecção de falhas
Instalando Prometheus e Alertmanager
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace \
--set alertmanager.config.global.resolve_timeout=5m
Definindo regras de alerta orientadas a self-healing
Em vez de alertas genéricos, criamos regras que já carregam o contexto necessário para a automação decidir o tipo de remediação.
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: self-healing-rules
namespace: monitoring
spec:
groups:
- name: self-healing.rules
rules:
- alert: PodCrashLoopBackOff
expr: kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff"} == 1
for: 2m
labels:
severity: critical
remediation: restart-pod
annotations:
summary: "Pod {{ $labels.pod }} em CrashLoopBackOff"
- alert: HighErrorRateAfterDeploy
expr: |
sum(rate(http_requests_total{status=~"5.."}[5m])) by (deployment)
/
sum(rate(http_requests_total[5m])) by (deployment)
> 0.05
for: 3m
labels:
severity: critical
remediation: rollback-deploy
annotations:
summary: "Taxa de erro acima de 5% em {{ $labels.deployment }}"
Note o uso do label remediation: ele funciona como uma instrução direta para o motor de automação, eliminando ambiguidade na hora de decidir qual ação executar.
Roteando alertas para o motor de automação via webhook
apiVersion: v1
kind: Secret
metadata:
name: alertmanager-config
namespace: monitoring
stringData:
alertmanager.yaml: |
route:
receiver: self-healing-webhook
routes:
- match:
severity: critical
receiver: self-healing-webhook
receivers:
- name: self-healing-webhook
webhook_configs:
- url: http://self-healing-operator.automation.svc:9090/webhook
send_resolved: true
Passo 2: automatizando a remediação
Kubernetes Operator para self-healing
O núcleo da automação é um operator que recebe os alertas do Alertmanager e decide a ação com base no label remediation. Abaixo, um exemplo simplificado usando o framework Kopf (Python), ideal para prototipagem rápida antes de migrar para Go com controller-runtime em produção.
import kopf
import kubernetes
from flask import Flask, request
app = Flask(__name__)
kubernetes.config.load_incluster_config()
apps_v1 = kubernetes.client.AppsV1Api()
core_v1 = kubernetes.client.CoreV1Api()
@app.route("/webhook", methods=["POST"])
def handle_alert():
payload = request.json
for alert in payload.get("alerts", []):
labels = alert.get("labels", {})
remediation = labels.get("remediation")
namespace = labels.get("namespace", "default")
if remediation == "restart-pod":
pod_name = labels.get("pod")
core_v1.delete_namespaced_pod(pod_name, namespace)
log_action(f"Pod {pod_name} reiniciado automaticamente")
elif remediation == "rollback-deploy":
deployment = labels.get("deployment")
rollback_deployment(deployment, namespace)
log_action(f"Rollback executado em {deployment}")
return {"status": "processed"}, 200
def rollback_deployment(name, namespace):
body = {"spec": {"rollbackTo": {"revision": 0}}}
apps_v1.patch_namespaced_deployment(name, namespace, body)
def log_action(message):
print(f"[self-healing] {message}")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=9090)
Esse serviço deve rodar em um namespace isolado (automation), com uma ServiceAccount de permissões mínimas, seguindo o princípio de menor privilégio via RBAC:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: self-healing-operator
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "deployments/rollback"]
verbs: ["get", "list", "patch", "update"]
Scaling reativo com KEDA
Nem toda falha exige restart ou rollback — muitas vezes o problema é subdimensionamento diante de picos de carga. O KEDA (Kubernetes Event-Driven Autoscaling) permite escalar workloads com base em métricas externas, como fila de mensagens ou latência.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: api-payments-scaler
namespace: default
spec:
scaleTargetRef:
name: api-payments
minReplicaCount: 3
maxReplicaCount: 20
triggers:
- type: prometheus
metadata:
serverAddress: http://monitoring-prometheus.monitoring:9090
metricName: http_request_duration_seconds
query: histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[2m])) by (le))
threshold: "0.8"
Rollback automático de deploys com Argo Rollouts
Para deploys progressivos com análise automática de métricas, o Argo Rollouts substitui o Deployment tradicional por uma estratégia canary com validação contínua — se as métricas piorarem, o rollback acontece sem intervenção humana.
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: api-payments
spec:
replicas: 5
strategy:
canary:
steps:
- setWeight: 20
- pause: { duration: 60 }
- analysis:
templates:
- templateName: success-rate-check
- setWeight: 50
- pause: { duration: 60 }
- setWeight: 100
---
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: success-rate-check
spec:
metrics:
- name: success-rate
interval: 30s
successCondition: result[0] >= 0.95
failureLimit: 2
provider:
prometheus:
address: http://monitoring-prometheus.monitoring:9090
query: |
sum(rate(http_requests_total{status!~"5..",deployment="api-payments"}[2m]))
/
sum(rate(http_requests_total{deployment="api-payments"}[2m]))
Se a taxa de sucesso cair abaixo de 95% durante o canary, o Argo Rollouts interrompe o avanço e reverte automaticamente para a versão estável anterior — um exemplo direto de infraestrutura self-healing aplicada ao pipeline de entrega contínua.
Passo 3: incorporando detecção de anomalias com machine learning
Thresholds fixos, como “CPU acima de 80%”, geram falsos positivos em cargas sazonais. Um detector de anomalias baseado em desvio estatístico melhora a precisão da automação. Segue um exemplo simplificado usando Z-score sobre séries do Prometheus, empacotado como CronJob:
import requests
import numpy as np
from datetime import datetime, timedelta
PROM_URL = "http://monitoring-prometheus.monitoring:9090"
def fetch_series(query, minutes=30):
end = datetime.utcnow()
start = end - timedelta(minutes=minutes)
params = {
"query": query,
"start": start.timestamp(),
"end": end.timestamp(),
"step": "30s",
}
resp = requests.get(f"{PROM_URL}/api/v1/query_range", params=params).json()
values = resp["data"]["result"][0]["values"]
return np.array([float(v[1]) for v in values])
def detect_anomaly(series, z_threshold=3.0):
mean = np.mean(series)
std = np.std(series)
latest = series[-1]
z_score = (latest - mean) / std if std > 0 else 0
return abs(z_score) > z_threshold, z_score
if __name__ == "__main__":
series = fetch_series('sum(rate(http_requests_total{status=~"5.."}[1m]))')
is_anomaly, score = detect_anomaly(series)
if is_anomaly:
print(f"[AIOps] Anomalia detectada. Z-score={score:.2f}")
requests.post(
"http://self-healing-operator.automation.svc:9090/webhook",
json={
"alerts": [{
"labels": {
"remediation": "rollback-deploy",
"deployment": "api-payments",
"namespace": "default",
}
}]
},
)
apiVersion: batch/v1
kind: CronJob
metadata:
name: anomaly-detector
namespace: automation
spec:
schedule: "*/5 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: anomaly-detector
image: registry.interno/anomaly-detector:1.0.0
restartPolicy: OnFailure
Esse padrão pode evoluir para modelos mais sofisticados, como Isolation Forest ou LSTM para séries temporais, mas o princípio permanece: alimentar o motor de remediação com decisões baseadas em contexto histórico, não apenas em limites estáticos.
Ferramentas complementares para observabilidade e AIOps em Kubernetes
Além da stack apresentada, o ecossistema de observabilidade para self-healing infrastructure vem amadurecendo rapidamente, e vale conhecer outras peças que podem substituir ou complementar as escolhidas neste tutorial.
O Keptn é um projeto voltado especificamente para automação orientada a eventos em Kubernetes, com foco em SLOs (Service Level Objectives). Ele permite definir critérios de qualidade declarativos e disparar remediações — incluindo rollback — quando um SLO é violado, funcionando como uma camada de orquestração acima do Argo Rollouts ou do Flagger.
O OpenTelemetry se tornou o padrão de fato para instrumentação de métricas, logs e traces, e alimenta tanto o Prometheus quanto ferramentas de AIOps mais sofisticadas com dados correlacionados entre serviços. Instrumentar aplicações com OpenTelemetry facilita a correlação de causa-raiz, já que traces distribuídos mostram exatamente em qual serviço da cadeia uma falha se originou, evitando que a automação tome decisões equivocadas baseadas apenas em sintomas de serviços downstream.
Para clusters maiores, soluções de AIOps com suporte a correlação multi-cluster tornam-se relevantes, especialmente quando a infraestrutura self-healing precisa lidar com dependências entre múltiplos namespaces, regiões ou provedores de nuvem. Nesses cenários, a decisão de remediação deixa de ser local a um Deployment e passa a considerar o impacto em cascata sobre outros serviços.
Chaos Engineering como validação da automação
Um cluster só pode ser chamado de self-healing depois de testado sob falhas reais e controladas. Ferramentas de Chaos Engineering, como o Chaos Mesh, permitem injetar falhas propositalmente — matar pods, simular latência de rede, saturar CPU — para validar se as regras de detecção e remediação configuradas realmente funcionam como esperado.
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: kill-payments-pod
namespace: chaos-testing
spec:
action: pod-kill
mode: one
selector:
namespaces:
- default
labelSelectors:
app: api-payments
scheduler:
cron: "@every 10m"
Rodar experimentos de caos periodicamente em ambiente de staging é a forma mais confiável de garantir que a infraestrutura self-healing continue funcionando conforme o sistema evolui, evitando o cenário em que a automação existe no papel, mas falha silenciosamente quando um incidente real acontece.
Boas práticas e cuidados com automação de correções
Automatizar correções em produção exige disciplina para não trocar um incidente por outro maior:
Defina limites de segurança (circuit breakers) na automação, como número máximo de restarts por hora antes de escalar para um humano. Registre toda ação automática em um log de auditoria imutável, incluindo métricas antes e depois da remediação. Separe claramente ambientes de teste e produção ao validar novas regras de self-healing — um bug no operator pode causar mais dano do que a falha original. Combine self-healing automatizado com runbooks documentados para cenários que exigem intervenção humana, evitando que a equipe perca visibilidade sobre o que o sistema está decidindo sozinho. Revise periodicamente os thresholds e modelos de anomalia, já que padrões de tráfego mudam ao longo do tempo.
Implementar uma infraestrutura self-healing com Kubernetes e AIOps não é um projeto de “configurar e esquecer” — é um processo contínuo de refinamento entre observabilidade, automação e governança. Começando pelos mecanismos nativos do Kubernetes (probes, ReplicaSets), avançando para automações reativas com Prometheus, KEDA e Argo Rollouts, e incorporando detecção de anomalias baseada em machine learning, é possível construir um cluster capaz de se autocorrigir na maioria dos incidentes comuns, liberando o time de operações para focar em problemas realmente complexos. O resultado é uma infraestrutura self-healing mais resiliente, com menor MTTR e maior confiança operacional em ambientes de produção críticos.
Sou um profissional na área de Tecnologia da informação, especializado em monitoramento de ambientes, Sysadmin e na cultura DevOps. Possuo certificações de Segurança, AWS e Zabbix.


