NPD 容器持续 OOM,Pod 重建时引发节点高负载根因分析
kubernetes containerd k8s runc oom cgroup摘要
K8S 生产集群的 worker 节点在 NPD(Node Problem Detector)Pod 被重建时,出现 CPU sys% 飙升、load 暴涨、同节点其他 Pod 延迟明显变大的现象。经过完整排查,根因定位为:NPD 的 memory limit 配置过小(200Mi),导致容器频繁触发 memcg OOM;OOM 后 containerd 通过 cleanupAfterDeadShim 路径调用 runc delete 清理容器,而 runc 1.1.12 中存在两处错误丢弃缺陷以及 RemovePaths 重试窗口过短的问题,致使每次容器退出后其 cgroup 目录均未被正确清理;经过约一个月的累积,单个 NPD Pod 下残留了 8147 个子 cgroup 目录;当该 Pod 被删除重建时,kubelet 的 PodContainerManager.Destroy 对全部残留子 cgroup 进行递归遍历和 rmdir 操作,在 cgroup v1 的全局锁 cgroup_mutex 上形成严重争抢,最终导致节点 sys% 飙高并波及同节点所有 Pod。本文完整记录从现象到根因的排查过程,并结合源码分析给出修复方案。
Read more...
