01
O que acontece entre o SIGTERM e o SIGKILL
Quando um pod entra em Terminating, o Kubernetes dispara duas coisas ao mesmo tempo. O kubelet executa o preStop, se houver, e envia SIGTERM ao processo principal do container. Em paralelo, o plano de controle tira o pod dos EndpointSlices, e cada componente que encaminha tráfego, kube-proxy, ingress, service mesh, um ALB fora do cluster, aplica essa remoção no seu próprio ritmo. As duas trilhas não se esperam. É comum o SIGTERM chegar antes de o último balanceador parar de mandar requisições, e um processo que fecha o servidor no instante do sinal recusa conexões que ainda estão sendo roteadas para ele.
t=0s kubectl rollout / scale down: o pod entra em Terminating
|
|-- (a) kubelet: preStop, depois SIGTERM para o PID 1 do container
'-- (b) controle: tira o pod dos EndpointSlices
'-- kube-proxy, ingress, service mesh e ALB aplicam a remocao
em momentos diferentes, segundos depois <- requisicoes ainda chegam
(a) e (b) correm em paralelo: nada garante que (b) termina antes de (a)
t=30s terminationGracePeriodSeconds vence (o preStop conta dentro dele)
'-- SIGKILL: sem handler, sem finally, sem flush. O que estava no meio morre no meio.O segundo fato é o prazo. terminationGracePeriodSeconds, 30 segundos por padrão, conta a partir do início do término e inclui o tempo do preStop. Quando vence, o processo recebe SIGKILL, que não pode ser tratado: não roda finally, não roda handler, não faz flush de log. Tudo o que estava no meio fica no meio. ECS, Nomad, systemd e o docker stop seguem o mesmo contrato com nomes diferentes: um sinal educado, um prazo e um sinal que não negocia.
- O SIGTERM é um aviso de que o tráfego vai parar, não uma confirmação de que já parou.
- O prazo é do encerramento inteiro: atraso de propagação, drenagem, jobs, fechamento de recursos e flush cabem no mesmo orçamento.
- O SIGKILL vai acontecer em algum momento, em algum deploy. O sistema precisa estar correto mesmo assim, e o encerramento gracioso só reduz a frequência.