Marcio Cunha

Container travando? Como diagnosticar erro OOMKill no Kubernetes

Seu pod no Kubernetes foi interrompido repentinamente? Aprenda a identificar o erro OOMKill e descubra por que o Linux encerrou seu processo por falta de memória.

Marcio Cunha•2 min
Também disponível em:EnglishEspañol
Resumo
  • O erro OOMKill ocorre quando o kernel do Linux finaliza processos por excederem o limite de memória definido no manifesto do pod.
  • O comando kubectl describe é a ferramenta fundamental para visualizar o status do container e identificar o código de erro 137.
  • A análise precisa de eventos no Kubernetes evita chutes e permite que você ajuste os recursos de forma correta e previsível.
  • Monitorar métricas de uso real antes de definir limites ajuda a equilibrar o custo de infraestrutura com a estabilidade da aplicação.
  • Entender a diferença entre requests e limits é o primeiro passo para evitar despejos arbitrários pelo orquestrador.

Por que o Kubernetes mata meu container?

Quando um container para de funcionar sem aviso prévio e o Kubernetes o reinicia, a primeira suspeita deve ser a falta de memória. Esse fenômeno é conhecido como OOMKill, abreviação de Out Of Memory Kill. Na prática, isso significa que o kernel do Linux, o coração do sistema operacional, percebeu que o pod estava consumindo mais memória do que o permitido e, para salvar o restante do nó de um travamento total, ele simplesmente encerra o processo infrator.

Como identificar o OOMKill com kubectl

O primeiro passo para confirmar essa suspeita é verificar o status do pod. O Kubernetes é bastante transparente se você souber onde olhar. Use o comando kubectl describe pod <nome-do-pod> e foque na seção Last State. Se você encontrar um Reason: OOMKilled ou um código de erro Exit Code: 137, você encontrou a causa raiz. O código 137 é a assinatura clássica de um processo que recebeu um sinal de interrupção forçada pelo sistema.

Entendendo os limites de memória

No Kubernetes, controlamos o consumo através de Limits, que é o teto máximo de RAM que o container pode alcançar. Além de entender esse mecanismo, é essencial dominar como o sistema gerencia recursos, algo que já cobrimos em detalhes ao limitar a memória de containers com Cgroups v2. Se o seu processo ultrapassar o limit, o kernel não pergunta se ele precisa de mais tempo; ele o derruba instantaneamente.

Como analisar eventos do pod para diagnóstico

Além do comando describe, os eventos do pod fornecem uma linha do tempo do que aconteceu. Execute kubectl get events --sort-by='.lastTimestamp' para listar as ocorrências recentes. Procure por mensagens de Killing. Combinar essa visão com logs é crucial; se o container está em um ciclo infinito de falhas, veja como lidar com esse erro CrashLoopBackOff ao depurar no Linux para extrair informações valiosas antes que o pod suma.

O que fazer para evitar novas quedas?

  1. Verifique as métricas de monitoramento (como Prometheus/Grafana) para ver o comportamento de uso antes da queda.
  2. Revise o manifesto do pod e compare o valor de memory limit com o uso real de pico (peak usage).
  3. Considere aumentar o limite apenas se a aplicação realmente exigir; caso contrário, otimizar o código pode ser a solução mais barata.
  4. Se o pod continua reiniciando e você precisa de uma intervenção manual rápida, saiba como reiniciar pods travados com kubectl.

Considerações finais

O OOMKill não é um erro de sistema, mas um mecanismo de proteção para manter a saúde do seu cluster. Diagnosticar a falta de memória exige olhar além dos sintomas superficiais e entender as garantias de recursos que você configurou.

Ao ajustar seus limites, lembre-se sempre de observar o comportamento sob carga real. O equilíbrio entre performance e estabilidade é uma tarefa contínua para qualquer engenheiro de sistemas.