Como o Kubernetes limpa recursos órfãos e por que recursos ficam em estado Terminating para sempre.
O Kubernetes usa um garbage collector para remover recursos órfãos — recursos que perderam seu "dono" (owner). O exemplo mais comum é um Pod criado por um ReplicaSet: quando o ReplicaSet é deletado, seus pods são deletados automaticamente.
Isso é controlado pelo campo metadata.ownerReferences — cada recurso filho tem uma referência ao seu pai.
# Pod criado por Deployment
metadata:
ownerReferences:
- apiVersion: apps/v1
kind: ReplicaSet
name: meu-app-7d8f9
uid: abc-123
controller: true
blockOwnerDeletion: trueVer os owners de qualquer recurso: kubectl get pod <name> -o yaml | grep ownerReferences -A10
O owner entra em 'deletion in progress' e fica visível até todos os filhos serem deletados. Mais lento mas mais seguro. O objeto tem o finalizer foregroundDeletion.
Padrão. O owner é deletado imediatamente, e o GC remove os filhos em segundo plano de forma assíncrona. Mais rápido.
Os filhos NÃO são deletados. Tornam-se órfãos. Use quando quiser deletar um Deployment mas manter seus pods rodando (raro).
Finalizers são chaves no metadata.finalizers que bloqueiam a deleção de um recurso. O Kubernetes marca o objeto com deletionTimestamp mas não o remove do etcd até que todos os finalizers sejam removidos. Um controller externo é responsável por fazer a limpeza e remover o finalizer.
metadata: name: meu-volume finalizers: - kubernetes.io/pvc-protection deletionTimestamp: "2024-01-15T..." # ← objeto está em Terminating # ← aguardando controller remover # ← o finalizer acima
$ # Ver finalizers do recurso kubectl get <resource> <name> -o yaml | grep finalizers -A5 $ # REMOVER o finalizer manualmente (use com cuidado!) kubectl patch <resource> <name> -p '{"metadata":{"finalizers":[]}}' --type=merge # Isso força a deleção sem esperar o controller limpar. # Pode deixar recursos órfãos na AWS (ELBs, EBS volumes). # Verifique manualmente na console AWS após fazer isso.
O kubelet também remove imagens Docker antigas para evitar que o disco dos nodes encha. É controlado por dois thresholds configuráveis no kubelet:
Padrão: 85%. Quando o disco passa desse %, o kubelet inicia a remoção de imagens não usadas (as mais antigas primeiro).
Padrão: 80%. O kubelet para de remover imagens quando o uso cai abaixo desse %. Define o "piso" de limpeza.
kubectl describe node | grep DiskPressure.