Контейнер показывает Reason OOMKilled и Exit Code 137 — объясните и исправьте.
Контейнер постоянно перезапускается; его последнее состояние — OOMKilled с кодом выхода 137. Объясните, что именно произошло, затем дайте фикс — и противопоставьте тому, что сделал бы слишком низкий CPU-лимит.
$ kubectl describe pod cache-2
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Limits:
memory: 128Mi
Restart Count: 7
Диагностируйте и исправьте.
Выход 137 — это 128 + 9 (SIGKILL), а Reason OOMKilled значит, что cgroup убил контейнер за превышение memory limit (128Mi). Поднимите лимит до реального рабочего набора или устраните утечку. Низкий CPU-лимит лишь тормозит — не убивает.
- ✗Читать выход 137 как что-то, кроме SIGKILL (128 + 9)
- ✗Путать OOM-убийство по лимиту памяти с CPU-throttling
- ✗Слепо поднимать лимит, не проверив заодно утечку
- →Как memory
requests/limitsзадают класс QoS пода и порядок вытеснения? - →Почему лимит памяти жёстко убивает, а CPU-лимит лишь тормозит?
Решение
1. Что произошло
Reason: OOMKilled Exit Code: 137 Limits: memory 128Mi
137 = 128 + сигнал 9 (SIGKILL). OOMKilled — cgroup-контроллер памяти ядра убил процесс, когда его RSS превысил limit в 128Mi. Это не мягкое завершение — SIGKILL, без шанса корректно закрыться.
2. Фикс
(измерьте по метрикам/kubectl top), а requests.memory — под него;
- если 128Mi просто мало → поднять
limits.memoryдо реального рабочего набора - если рост неограничен → это утечка/перерасход, чините приложение.
3. Контраст с CPU
Слишком низкий CPU-лимит не убивает: cgroup лишь троттлит процесс (он получает меньше времени CPU и медленнее работает). Никакого OOMKilled и кода 137 — если видите 137, речь о памяти, а не CPU.