标准答案
- 容器状态中的 OOMKilled 结合 limit、工作集、堆、缓存、线程和历史峰值判断是否超过 cgroup 上限。
- 节点压力驱逐还要看节点 MemoryPressure、eviction 事件、Pod QoS 和其他工作负载。
- 修复可以校准 limit、限制并发和缓存、修复泄漏或扩容节点,但不能只增加 limit。
- 重启后要验证增长趋势、请求峰值、GC、P99 和恢复行为,避免故障被重启掩盖。
题目解析
容器超过自身 memory limit 时,cgroup 可能触发 OOM;节点整体内存压力还可能让 kubelet 驱逐 Pod,这两条路径的事件和优先级不同。QoS、requests/limits、工作集、堆、native 内存、page cache、线程和 emptyDir 都会影响结果。
排查要对照 container lastState、Pod events、节点 MemoryPressure、cgroup memory.events、历史峰值和应用指标。修复可能是降低并发、限制缓存、修复泄漏、调整 limit/request 或扩容节点,但增加 limit 前要确认节点和下游仍能承受峰值。
常见误区
- 误区:只看节点 free。改正:同时看容器 cgroup、Pod 事件、QoS、节点压力和应用工作集。
- 误区:所有 OOM 都判定为内存泄漏。改正:区分 limit 超限、节点驱逐、启动峰值、缓存和真实引用增长。