系统相关
首页 > 系统相关> > k8s 集群节点 SLUB: Unable to allocate memory on node -1 cgroup 内存泄露问题

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