Kubernetes probes: liveness, readiness e startup (sem mistério)
Tabela de Conteúdo
Se seu rollout derruba tráfego, ou seu pod entra em restart loop, tem uma boa chance do problema estar em probe.
A ideia é simples:
readinessProbedecide se o pod pode receber tráfegolivenessProbedecide se o container deve ser reiniciadostartupProbedá tempo de boot para apps lentas sem matar o pod antes da hora
Quando usar cada uma
readinessProbe (tráfego)
Use quando:
- seu app precisa de alguns segundos pra ficar pronto
- você tem dependência externa (DB, cache, migrations) e quer segurar tráfego
Se ela falhar:
- o pod continua vivo
- mas sai do load balancer do Service
livenessProbe (reinício)
Use quando:
- você quer reiniciar o container se ele travar/deadlock
- você quer “self-healing” básico
Se ela falhar:
- o kubelet reinicia o container
startupProbe (boot lento)
Use quando:
- sua aplicação demora pra subir (Java, apps com warmup/cache)
- você colocou
livenessProbee começou a tomar restart antes do boot terminar
Ela é basicamente um “período de graça”.
Erros comuns (que eu vejo direto)
- Usar liveness pra tudo e causar restart loop (quando era só readiness)
- Probe muito agressiva (timeout pequeno, failureThreshold baixo)
- Endpoint de probe caro (faz query pesada no DB e piora tudo)
Checklist rápido pra debugar
kubectl describe pod -n <ns> <pod>
kubectl get events -n <ns> --sort-by=.lastTimestamp | tail -n 30
kubectl logs -n <ns> <pod> -c <container> --tail=200
Procure por:
Readiness probe failedLiveness probe failedBack-off restarting failed container
Exemplo (HTTP probes)
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 2
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: nginx:1.27
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 3
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 2
failureThreshold: 3
startupProbe:
httpGet:
path: /health
port: 80
periodSeconds: 5
failureThreshold: 30
Leitura prática desse YAML:
- readiness começa cedo (pra segurar tráfego até estar ok)
- liveness começa mais tarde (pra não matar o container em boot)
- startup dá até ~150s de boot (30 * 5s)
Dica final
Se você está em dúvida, separe responsabilidade:
- readiness = “posso receber tráfego?”
- liveness = “tô travado e preciso reiniciar?”
E evita inventar probe que faz query no banco.
Se você quiser conectar com estratégia de rollout/rollback, dá uma olhada neste post: Estratégias de deployment em produção: blue-green, canary e rolling updates.
Simples assim! :)