K8s em Exemplos: Hooks de Ciclo de Vida

Lifecycle hooks rodam na inicialização do container (postStart) e antes do término (preStop). Use para inicialização, registro de serviço, shutdown graceful e limpeza.

pod-lifecycle.yaml

Hooks são definidos no bloco lifecycle de um container. Tanto postStart quanto preStop suportam comandos exec ou requisições HTTP.

spec:
  containers:
    - name: app
      image: my-app:v1
      lifecycle:
        postStart:
          exec:
            command: ["/bin/sh", "-c", "echo Started >> /var/log/app.log"]
        preStop:
          exec:
            command: ["/bin/sh", "-c", "sleep 15"]
pod-poststart.yaml

postStart roda imediatamente após a criação do container, em paralelo com o entrypoint. Container não fica Ready até postStart completar. Se falhar, container é terminado.

lifecycle:
  postStart:
    exec:
      command:
        - /bin/sh
        - -c
        - |
          curl -X POST http://consul:8500/v1/agent/service/register \
            -d '{"name":"my-app","port":8080}'
pod-prestop.yaml

preStop atrasa SIGTERM, permitindo que requisições em andamento completem. Crítico para deploys com zero downtime. O sleep dá tempo para endpoints do Service atualizarem antes do container parar de aceitar tráfego.

spec:
  terminationGracePeriodSeconds: 60
  containers:
    - name: app
      lifecycle:
        preStop:
          exec:
            command: ["/bin/sh", "-c", "sleep 15"]
pod-termination.yaml

Sequência de terminação do Pod: 1) Pod marcado como terminando, 2) Removido dos endpoints do Service (paralelo com preStop), 3) preStop roda, 4) SIGTERM enviado, 5) Aguarda shutdown graceful, 6) SIGKILL após terminationGracePeriodSeconds.

spec:
  terminationGracePeriodSeconds: 60
  containers:
    - name: app
      lifecycle:
        preStop:
          exec:
            command:
              - /bin/sh
              - -c
              - |
                sleep 5
                /app/shutdown.sh
pod-http-hooks.yaml

HTTP hooks chamam um endpoint ao invés de rodar um comando. Status da resposta não importa - apenas erros de conexão falham. Útil para containers distroless ou mínimos sem shell.

lifecycle:
  postStart:
    httpGet:
      path: /hooks/started
      port: 8080
  preStop:
    httpGet:
      path: /hooks/shutdown
      port: 8080
pod-grace-period.yaml

O terminationGracePeriodSeconds inclui tempo de execução do preStop. Se preStop leva 15s e você precisa de 75s para shutdown graceful, defina grace period para pelo menos 90s. Padrão é 30s.

spec:
  terminationGracePeriodSeconds: 90
  containers:
    - name: app
      lifecycle:
        preStop:
          exec:
            command: ["sleep", "15"]
terminal

Debug hooks com events. Falhas de postStart aparecem nos events do Pod. Falhas de preStop são mais difíceis de capturar - adicione logging no seu script de hook. Hooks não têm stdout/stderr.

$ kubectl describe pod my-app | grep -A5 Events
Events:
  Type     Reason               Age   Message
  Normal   Scheduled            60s   Successfully assigned default/my-app
  Normal   Pulled               58s   Container image "my-app:v1" already present
  Warning  FailedPostStartHook  55s   Exec lifecycle hook failed
  Normal   Killing              55s   FailedPostStartHook

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