O que significa
O kubelet de cada nó vigia memória, disco e inodes. Quando um desses recursos passa de um limiar, ou quando um pod passa do próprio limite de disco temporário, o kubelet encerra pods para recuperar o recurso. É o despejo por pressão no nó (documentação do Kubernetes, "Node-pressure Eviction"). O pod vai para a fase Failed, com status.reason: Evicted e uma mensagem que diz o recurso.
Os limiares padrão de despejo imediato, segundo a mesma página, são: memória disponível abaixo de 100Mi, disco do nó (nodefs) abaixo de 5%, disco de imagens (imagefs) abaixo de 5% e inodes livres abaixo de 4%. Nesse despejo o kubelet não respeita PodDisruptionBudget nem o grace period do pod.
Um detalhe que achamos ao reproduzir: no Kubernetes 1.35, o kubectl get pods mostrou o pod despejado com STATUS Error, e não Evicted. O motivo real só aparece no describe ou no campo status.reason. Quem procura "Evicted" na lista pode não achar nada.
Causas comuns
O container escreve em /tmp, em log local ou num emptyDir mais do que o limits.ephemeral-storage permite. O kubelet despeja o pod inteiro.
A soma do uso real dos pods passa do que o nó tem. O kubelet escolhe quem sai pela classe de QoS e por quanto cada pod passa do próprio request.
Imagens acumuladas, logs de container e emptyDir enchem o disco do nó. O kubelet primeiro apaga imagens sem uso; se não basta, despeja pods.
Sem requests e limits, o pod é da classe BestEffort e é o primeiro candidato quando o nó aperta.
Diagnóstico em 3 comandos
Saídas reais de um pod de teste com limits.ephemeral-storage: 100Mi que grava 300 MB em /tmp.
1 · o que a lista mostra
kubectl -n loja get pod exportador NAME READY STATUS RESTARTS AGE
exportador 0/1 Error 0 7m49s 2 · o motivo verdadeiro
kubectl -n loja get pod exportador \
-o jsonpath='{.status.phase} {.status.reason} {.status.message}{"\n"}' Failed Evicted Pod ephemeral local storage usage exceeds the total limit of containers 100Mi. 3 · os eventos, na ordem
kubectl -n loja describe pod exportador | sed -n '/Events:/,$p' Events:
Type Reason Age From Message
Normal Started 112s kubelet Container started
Warning Evicted 95s kubelet Pod ephemeral local storage usage exceeds the total limit of containers 100Mi.
Normal Killing 95s kubelet Stopping container exportador Para achar todos os despejados de um namespace, filtre pela fase e confira o motivo de cada um: a lista abaixo mistura o pod despejado com pods de um Job que falhou por outro motivo.
kubectl -n loja get pods --field-selector=status.phase=Failed \
-o custom-columns=NOME:.metadata.name,MOTIVO:.status.reason NOME MOTIVO
exportador Evicted
importar-precos-2qjsc <none>
importar-precos-bxjx6 <none>
importar-precos-mmhq5 <none> A correção
- Disco temporário: arquivo que precisa sobreviver vai para volume persistente ou para storage de objetos. Se é descartável, dimensione o limite pelo tamanho real do lote.
- Memória do nó: declare requests próximos do uso real. O kubelet despeja primeiro quem passa do próprio request, e por último os pods Guaranteed (request igual a limit em CPU e memória).
- Disco do nó: confira a política de rotação de logs e a limpeza de imagens; em nuvem, discos de nó maiores costumam ser a solução mais barata.
resources:
requests:
memory: 256Mi
ephemeral-storage: 200Mi
limits:
memory: 512Mi
ephemeral-storage: 1Gi Pods despejados ficam no cluster, na fase Failed, até alguém apagar ou até o coletor de pods terminados passar do limite configurado no kube-controller-manager (terminated-pod-gc-threshold). Se o pod era de um Deployment, um substituto já foi criado em outro nó; os despejados só servem de registro.
kubectl -n loja delete pods --field-selector=status.phase=Failed Como aparece no Kubepier
O Kubepier mostra os eventos do pod com os avisos primeiro, com filtro por tipo, namespace e motivo. O diagnóstico por IA explica o erro a partir dos eventos e do log, em português, com a sua chave de API (Anthropic ou OpenAI). Abaixo, uma ilustração com dados fictícios.
Causa provável: o container escreveu mais de 100Mi em disco local e passou do limits.ephemeral-storage. Evidência: evento Evicted com "Pod ephemeral local storage usage exceeds the total limit of containers 100Mi". Correção sugerida: gravar o arquivo em volume persistente ou em objeto de storage, ou subir o limite de disco temporário se o arquivo for realmente descartável.