Probes no Kubernetes: Como Garantir a Saúde e Disponibilidade das Aplicações com Liveness, Readiness e Startup Checks
Visão geral
No Kubernetes, as probes são responsáveis por monitorar a saúde dos containers e pods. Elas permitem que apenas pods saudáveis recebam tráfego, que o cluster recupere falhas automaticamente e que o balanceamento e as estratégias de atualização funcionem de forma previsível.
Neste texto você encontrará:
- Os três tipos de probes – liveness, readiness e startup – e como cada um afeta o rollout e a disponibilidade.
- Padrões recomendados para endpoints de saúde.
- Dicas práticas para configurar probes de forma robusta.
1. Tipos de Probes
Liveness Probe
- Objetivo: Detectar se o container está “vivo”.
- Quando falha, o kubelet reinicia o container, assumindo que ele travou ou entrou em estado inconsistente.
- Ideal para capturar deadlocks, crashes silenciosos e loops infinitos.
Exemplo (HTTP):
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15 # espera antes da primeira verificação
periodSeconds: 20 # intervalo entre verificações
failureThreshold: 3 # número de falhas consecutivas antes de reiniciar
Readiness Probe
- Objetivo: Indicar se o container está pronto para atender requisições.
- Se falhar, o pod é removido das listas de endpoints dos Services, evitando que tráfego seja enviado a ele.
- Crucial durante a inicialização ou em operações temporárias (por exemplo, migração de banco).
Exemplo (TCP):
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 10
periodSeconds: 15
Startup Probe
- Objetivo: Dar ao container tempo suficiente para iniciar quando o boot é longo.
- Enquanto a startup probe não chega a sucesso, as probes de liveness e readiness ficam suspensas.
- Se a startup probe falhar, o container é reiniciado.
Exemplo (exec):
startupProbe:
exec:
command: ["cat", "/tmp/startup-success"]
failureThreshold: 30 # permite até 30 tentativas falhas
periodSeconds: 10
2. Impacto no Rollout, Balanceamento e Disponibilidade
| Probe | Influência no Balanceamento | Influência no Rollout | Consequência de Má Configuração |
|---|---|---|---|
| Readiness | Determina se o pod aparece nos endpoints do Service. | O Deployment só considera o pod “pronto” quando a readiness está OK. | Pod pode ser excluído do tráfego prematuramente → perda de capacidade. |
| Liveness | Não afeta diretamente o Service, mas garante que pods travados sejam reiniciados. | Não interfere no rollout, mas reinicializações frequentes podem atrasar a convergência. | Reinícios em loop → alta churn e instabilidade. |
| Startup | Suspende readiness/liveness até que o container esteja pronto. | Evita que o rollout avance antes do container estar completamente inicializado. | Falha prematura → reinício constante; falha tardia → rollout mais lento. |
Recomendações de configuração
- initialDelaySeconds – ajuste de acordo com o tempo de boot da aplicação.
- periodSeconds e failureThreshold – balanceie rapidez de detecção com tolerância a picos transitórios.
- Use códigos HTTP 200 para indicar saúde; evite lógica pesada nos endpoints.
- Teste os endpoints localmente (por exemplo,
curl http://localhost:8080/healthz) antes de aplicar no cluster.
3. Padrões de Endpoints de Saúde
| Probe | Endpoint Típico | Comentário |
|---|---|---|
| Liveness | /healthz ou /live |
Verifica dependências internas (DB, cache) e estado geral. |
| Readiness | /ready ou /readyz |
Garante que todas as dependências externas estejam disponíveis. |
| Startup | /startup (menos comum) |
Indica que o processo de boot terminou com sucesso. |
Boas práticas:
- Responda em ≤ 100 ms para não atrasar o ciclo de verificação.
- Não inclua checks que possam bloquear (ex.: consultas longas ao banco).
- Diferencie claramente a lógica de liveness (“está vivo?”) da de readiness (“pode atender tráfego?”).
4. Manifesto de Pod com Todas as Probes
apiVersion: v1
kind: Pod
metadata:
name: exemplo-pod
spec:
containers:
- name: app-container
image: minha-aplicacao:latest
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
startupProbe:
httpGet:
path: /startup
port: 8080
periodSeconds: 10
failureThreshold: 30
5. Dicas para Configuração Eficiente
- Comece conservador: use delays maiores que o tempo máximo esperado de inicialização e reduza gradualmente.
- Monitore métricas de probe: o kube‑apiserver expõe contadores (
kubelet_running_pods,container_last_terminated_reason) que ajudam a identificar falhas frequentes. - Teste em staging: simule falhas (por exemplo, bloqueie a conexão ao DB) e verifique se a readiness reage como esperado.
- Combine probes: use startup para evitar reinícios prematuros, liveness para recuperação automática e readiness para controle de tráfego.
Resumo rápido
| Probe | Função Principal | Impacto Principal | Endpoint Típico |
|---|---|---|---|
| Liveness | Detecta se o container está vivo | Reinicia containers travados | /healthz ou /live |
| Readiness | Indica disponibilidade para tráfego | Controla balanceamento de serviços | /ready ou /readyz |
| Startup | Gerencia inicialização longa | Suspende liveness/readiness até o boot concluir | /startup (opcional) |
Conclusão
Configurar probes adequadamente é essencial para a confiabilidade de aplicações no Kubernetes. Elas permitem detectar falhas rapidamente, evitar downtime inesperado e garantir que os rollouts ocorram de forma controlada. Ajuste os parâmetros de delay e threshold ao perfil da sua aplicação e valide tudo em ambientes de teste antes de levar à produção.
No próximo artigo, abordaremos estratégias avançadas de autoscaling e gerenciamento de recursos no Kubernetes.