容器 27:requests 与 limits 怎样走到节点的 cgroup
不要把所有失败叫 OOM
调度阶段因资源 requests 不满足而 Pending,没有理由从宿主寻找已运行进程的 cpu.stat。容器已启动后超过 CPU limit,可在所选 cgroup 的 cpu.stat 观察节流增量,应用仍可能继续运行;达到 memory limit 可能发生组内内存事件与进程终止,要对照 memory.events、container status 和相应节点事件;节点整体内存/磁盘压力下的 eviction 又由 kubelet 决策,不等于同一个 memory.max 触发点。不同 Kubernetes 与 cgroup 版本的 QoS、CPU weight、OOM 和驱逐细节有版本前提,不能机械套一个表格。
专用 kind 节点正例用两个有界请求负载分别设置资源,按 UID 找到应用 cgroup 与 cpu.max/memory.max,对照限额与计数器增量;失败对照分别单独制造调度等待、CPU 节流、受控内存事件和专用节点压力,观察事件而不是预先指定退出码。压力只施加在专用 VM,自定义上限及控制台恢复路径必须先固定。补跑入口与有界探针避免无上限申请。本云端 cgroup v1 只读且无 kubelet,所有节点实测 NOT_RUN。
| 现象 | 核对层 | 不可推出 |
|---|---|---|
| Pod Pending | 调度条件和节点可分配量 | CPU 已被节流 |
| 响应慢且 throttled 增加 | 对应 PID 的 cgroup 与应用耗时 | 所有延迟都由 CPU 造成 |
| 容器退出 137 | memory.events、节点事件 | 一定是内存 limit OOM |
练习
- 先预测 CPU request 提高但 limit 不变、在节点无竞争时
cpu.stat是否必然变化;分开比较调度与节流证据。 - 先预测节点 eviction 与容器 memory limit OOM 的对象/事件差别,在专用节点各跑一个受控案例并核对 UID/PID/cgroup。
上一篇:26:Pod 节点执行;下一篇:28:Running 与 Ready。
系列总目录:从进程隔离到运行时与编排。
参考资料
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.



