在Kubernetes集群中,有时会遇到Pod无法正常创建或被杀掉的情况,describe Pod时显示"no allocated memory"。这种情况很可能是由于节点内存泄露导致的。本文将分析内存泄露的原因,并给出解决方案。
问题现象
- Pod状态异常,describe pod显示原因为:no allocated memory
- 节点上执行dmesg有日志显示:slub无法分配内存:SLUB: Unable to allocate memory on node -1
- 节点oom开始按优先级杀进程,有可能会导致有些正常Pod被杀掉
- 机器free查看可用内存还有很多,却无法分配,怀疑是内存泄露
© ivwdcwso (ID: u012172506)
原因分析
cgroup的kmem account特性在3.x内核上有内存泄露问题,如果开启了kmem account特性会导致可分配内存越来越少,直到无法创建新Pod或节点异常。
几点解释:
-
kmem account是cgroup的一个扩展,全称CONFIG_MEMCG_KMEM,属于机器默认配置,本身没啥问题,只是该特性在3.10的内核上存在漏洞有内存泄露问题,4.x的内核修复了这个问题。
-
因为kmem account是cgroup的扩展能力,因此runc、docker、k8s层面也进行了该功能的支持,即默认都打开了kmem属