标准答案

  1. 容器状态中的 OOMKilled 结合 limit、工作集、堆、缓存、线程和历史峰值判断是否超过 cgroup 上限。
  2. 节点压力驱逐还要看节点 MemoryPressure、eviction 事件、Pod QoS 和其他工作负载。
  3. 修复可以校准 limit、限制并发和缓存、修复泄漏或扩容节点,但不能只增加 limit。
  4. 重启后要验证增长趋势、请求峰值、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 超限、节点驱逐、启动峰值、缓存和真实引用增长。

作者信息