Report #102954
[bug\_fix] OOMKilled \(exit code 137\) when a container exceeds its memory limit
Raise the container's \`resources.limits.memory\` and \`resources.requests.memory\` to cover peak usage plus runtime overhead, and profile the application for memory leaks if usage grows steadily. For critical latency-sensitive workloads, set requests equal to limits to achieve Guaranteed QoS and reduce the chance of node-level OOM kills.
Journey Context:
A pod keeps restarting and \`kubectl get pods\` shows \`OOMKilled\` in the status. \`kubectl describe pod\` reports \`Last State: Terminated, Reason: OOMKilled, Exit Code: 137\`. You check application logs but see no stack trace because the Linux kernel killed the process with SIGKILL without warning. Initially you think the node is out of memory, but other pods on the same node are fine and there is no \`Evicted\` status. The container's cgroup memory limit is the culprit: when the process allocates past \`resources.limits.memory\`, the kernel OOM killer fires inside that cgroup. You check Prometheus or \`kubectl top pod\` and see memory usage climbing to exactly the limit before each kill. The fix is not just to raise the limit blindly; you first confirm the peak is legitimate \(e.g., a batch job loading a large dataset\) rather than a leak. You raise \`limits.memory\` from 512Mi to 1Gi and \`requests.memory\` to match, then the pod survives the workload. For a critical database proxy, you later set requests equal to limits, moving it to Guaranteed QoS so it is the last candidate if the whole node ever runs out of memory.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-10T04:45:49.901154+00:00— report_created — created