k8s 集群节点 SLUB: Unable to allocate memory on node -1 cgroup 内存泄露问题
作者:互联网
1.原因
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 属性
因为3.10 的内核已经明确提示 kmem 是实验性质,我们仍然使用该特性,所以这其实不算内核的问题,是 k8s 兼容问题
2.解决方案:
2.1 升级内核到 4.x
既然是 3.x 的问题,直接升级内核到 4.x 及以上即可
2.2修改机器启动引导项
修改虚机启动的引导项 grub 中的cgroup.memory=nokmem
,让机器启动时直接禁用 cgroup的 kmem 属性
2.2.1 先备份grub
cp -a /etc/default/grub /etc/default/grub.bak
2.2.2 修改 grub,添加 “cgroup.memory=nokmem”
vim /etc/default/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet cgroup.memory=nokmem"
2.2.3 生成配置
/usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
2.2.4 重启机器
reboot
2.2.5 验证
cat /sys/fs/cgroup/memory/kubepods/burstable/pod*/*/memory.kmem.slabinfo 输出为0或者Input/output error说明修改成功
使用如下命令查看KMEM是否打开:
cat /boot/config-`uname -r`|grep CONFIG_MEMCG
CONFIG_MEMCG_KMEM=y # 开启kmem
标签:node,grub,kmem,Unable,allocate,cgroup,memory,2.2,内核 来源: https://www.cnblogs.com/zbhlinux/p/16595615.html