Conceitos · Cluster

Garbage Collection & Finalizers

Como o Kubernetes limpa recursos órfãos e por que recursos ficam em estado Terminating para sempre.

🧹 O que é Garbage Collection

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.

🔗 Owner References

# Pod criado por Deployment
metadata:
  ownerReferences:
  - apiVersion: apps/v1
    kind: ReplicaSet
    name: meu-app-7d8f9
    uid: abc-123
    controller: true
    blockOwnerDeletion: true

Ver os owners de qualquer recurso: kubectl get pod <name> -o yaml | grep ownerReferences -A10

Propagation Policies — Como a deleção se propaga

Foreground

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.

Backgroundpadrão

Padrão. O owner é deletado imediatamente, e o GC remove os filhos em segundo plano de forma assíncrona. Mais rápido.

Orphan

Os filhos NÃO são deletados. Tornam-se órfãos. Use quando quiser deletar um Deployment mas manter seus pods rodando (raro).

🔒 Finalizers — Por que recursos ficam em Terminating

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.

EXEMPLO — PVC COM FINALIZER
metadata:
  name: meu-volume
  finalizers:
  - kubernetes.io/pvc-protection
  deletionTimestamp: "2024-01-15T..."
  # ← objeto está em Terminating
  # ← aguardando controller remover
  # ← o finalizer acima
FINALIZERS COMUNS NO EKS
kubernetes.io/pvc-protection
PVC em uso por um pod não pode ser deletado
service.kubernetes.io/load-balancer-cleanup
Service LoadBalancer aguarda remoção do ELB na AWS
foregroundDeletion
Objeto aguarda deleção de todos os filhos
argo.argoproj.io/...
ArgoCD controla deleção de recursos que gerencia
⚠️ Recurso preso em Terminating? Como resolver:
$ # 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.

🖼️ Image Garbage Collection

O kubelet também remove imagens Docker antigas para evitar que o disco dos nodes encha. É controlado por dois thresholds configuráveis no kubelet:

imageGCHighThresholdPercent

Padrão: 85%. Quando o disco passa desse %, o kubelet inicia a remoção de imagens não usadas (as mais antigas primeiro).

imageGCLowThresholdPercent

Padrão: 80%. O kubelet para de remover imagens quando o uso cai abaixo desse %. Define o "piso" de limpeza.

💡 No EKS, nodes com DiskPressure (disco cheio) param de aceitar novos pods. Monitore uso de disco dos nodes com CloudWatch Container Insights ou kubectl describe node | grep DiskPressure.