K8s em Exemplos: Probes de Vivacidade

Liveness probes detectam containers quebrados. Se a probe falhar consecutivamente (failureThreshold vezes), Kubernetes mata e reinicia o container. Use para: deadlocks, memory leaks, erros irrecuperáveis.

pod-liveness.yaml

HTTP probe é a escolha mais comum. Use quando sua app tem um endpoint HTTP. Saudável se status é 200-399. initialDelaySeconds aguarda antes da primeira probe. periodSeconds define intervalo. failureThreshold é falhas consecutivas antes de reiniciar.

spec:
  containers:
    - name: app
      image: my-app:v1
      livenessProbe:
        httpGet:
          path: /health
          port: 8080
        initialDelaySeconds: 30
        periodSeconds: 10
        timeoutSeconds: 5
        failureThreshold: 3
pod-liveness-headers.yaml

HTTP probes podem incluir headers customizados para autenticação ou roteamento. Use scheme: HTTPS para endpoints TLS.

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
    scheme: HTTP
    httpHeaders:
      - name: X-Custom-Header
        value: probe
      - name: Authorization
        value: Bearer token
  initialDelaySeconds: 45
  periodSeconds: 30
pod-liveness-tcp.yaml

TCP probe verifica se a porta aceita conexões. Use para serviços não-HTTP (bancos de dados, Redis, gRPC sem health checks). Limitação: apenas confirma que a porta está aberta, não que o serviço está saudável. Prefira HTTP ou exec quando possível.

livenessProbe:
  tcpSocket:
    port: 5432
  initialDelaySeconds: 15
  periodSeconds: 20
pod-liveness-exec.yaml

Exec probe executa um comando dentro do container. Saudável se código de saída é 0. Use para lógica de health customizada (verificar arquivos, rodar CLI tools como pg_isready). Mais flexível mas mais lento e usa mais recursos que HTTP/TCP.

livenessProbe:
  exec:
    command:
      - sh
      - -c
      - pg_isready -U postgres
  initialDelaySeconds: 30
  periodSeconds: 10
pod-startup-probe.yaml

Startup probes substituem liveness durante startup do container. Use para apps de inicialização lenta ao invés de initialDelaySeconds longo. Liveness probe só inicia após startup probe ter sucesso. Este exemplo permite até 5 minutos (30 × 10s) para startup.

spec:
  containers:
    - name: app
      startupProbe:
        httpGet:
          path: /health
          port: 8080
        failureThreshold: 30
        periodSeconds: 10
      livenessProbe:
        httpGet:
          path: /health
          port: 8080
        periodSeconds: 10
        failureThreshold: 3
pod-probe-params.yaml

Parâmetros de probe: failureThreshold é falhas consecutivas antes de ação. successThreshold é sucessos consecutivos para recuperar (apenas para readiness). timeoutSeconds deve ser menor que periodSeconds.

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 45
  periodSeconds: 30
  timeoutSeconds: 10
  failureThreshold: 3
  successThreshold: 1
pod-liveness-best.yaml

Erros comuns: (1) Configurações muito agressivas causam loops de restart. Aumente timeoutSeconds para endpoints lentos. (2) Verificar dependências como banco de dados ou APIs externas. Se o DB está fora, reiniciar não ajuda e causa falhas em cascata. (3) Usar liveness para apps que crasham de forma limpa. Kubernetes já reinicia containers que crasham. Use liveness apenas para falhas silenciosas (deadlocks, travamentos).

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  periodSeconds: 15
  timeoutSeconds: 5
  failureThreshold: 3
terminal

Debug falhas de probe com events e logs. Restarts de container incrementam o contador RESTARTS. Verifique endpoint da probe diretamente com kubectl exec ou port-forward.

$ kubectl get pods
NAME     READY   STATUS    RESTARTS   AGE
my-app   1/1     Running   3          10m

$ kubectl describe pod my-app | grep -A5 "Liveness probe failed"
Warning  Unhealthy  2m  Liveness probe failed: HTTP probe failed
Warning  Unhealthy  1m  Liveness probe failed: HTTP probe failed

$ kubectl exec my-app -- curl -v localhost:8080/health
< HTTP/1.1 500 Internal Server Error

$ kubectl port-forward pod/my-app 8080:8080
$ curl localhost:8080/health
{"status": "unhealthy", "reason": "database connection failed"}

Índice | GitHub | Use as setas do teclado para navegar |