k8s集群运行过程中,经常出现节点上报出类似 “kernel:unregister_netdevice:waiting for vethxxx to become free. Usage count=1” 的错误信息,一方面影响交互,另一方面,对于有些操作比如 docker stop
,半天没有响应,处于hang住的状态。
问题背景 操作系统及内核版本为
1 2 3 4 5 [root@dev-server-2 ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@dev-server-2 ~]# uname -a Linux dev-server-2 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
经常有节点报出类似如下错误
查看一些网上资料,一般都说是Kernel的Bug,并且虽然有些地方说在先前版本已经修复,但是在较高版本上仍有出现。
有一些解决办法是停止syslog服务,让其不将错误信息显示到控制台,
1 [root@dev-server-2 ~]# systemctl stop rsyslog
但这只能解决影响交互的问题,对于容器引擎被hang住的问题并没有解决,治标不治本。
也有人对此Bug的原因进行了追踪分析,判断可能是net_device引用计数器泄露的原因(参考:https://zhuanlan.zhihu.com/p/66895097 ),并给出了修复补丁,尝试着安装给出的补丁,但没有成功。
查看了目前elrepo的kernel的ml(mainline stable,稳定的主线版本)版本已经到了 5.6.14-1.el7.elrepo, 于是尝试着对kernel进行升级。
升级Kernel
更新yum仓库
1 [root@dev-server-2 ~]# yum -y update
导入elrepo仓库
1 2 3 4 5 6 # 导入elrepo仓库的公钥 [root@dev-server-2 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 安装ELRepo仓库的yum源 [root@dev-server-2 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm # 查看可用的kerner版本 [root@dev-server-2 ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
升级内核
1 2 # 安装最新版的内核 [root@dev-server-2 ~]# yum --enablerepo=elrepo-kernel install kernel-ml
设置默认启动内核
1 2 3 4 5 6 7 8 9 # 查看系统已有内核 [root@dev-server-2 ~]# sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg 0 : CentOS Linux (5.6.14-1.el7.elrepo.x86_64) 7 (Core) 1 : CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core) 2 : CentOS Linux (0-rescue-f638aa03cdcf42998b077254bde50b53) 7 (Core) # 设置默认启动内核,其中0为上述查出内核的索引 grub2-set-default 0 # 生成grub配置文件 grub2-mkconfig -o /boot/grub2/grub.cfg
重启验证
1 2 3 4 5 # 重启 [root@dev-server-2 devuser]# reboot # 查看当前内核版本 [root@dev-server-2 devuser]# uname -a Linux dev-server-2 5.6.14-1.el7.elrepo.x86_64 #1 SMP Tue May 19 12:17:13 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux
删除旧内核
1 2 3 4 5 6 7 8 9 10 11 # 查看现有内核 [root@dev-server-2 devuser]# rpm -qa | grep kernel kernel-tools-3.10.0-957.el7.x86_64 kernel-headers-3.10.0-1062.1.1.el7.x86_64 kernel-debuginfo-3.10.0-957.el7.x86_64 kernel-tools-libs-3.10.0-957.el7.x86_64 kernel-debuginfo-common-x86_64-3.10.0-957.el7.x86_64 kernel-3.10.0-957.el7.x86_64 kernel-ml-5.6.14-1.el7.elrepo.x86_64 # 删除旧的内核 [root@dev-server-2 devuser]# yum remove ernel-tools-3.10.0-957.el7.x86_64 kernel-headers-3.10.0-1062.1.1.el7.x86_64 kernel-debuginfo-3.10.0-957.el7.x86_64 kernel-tools-libs-3.10.0-957.el7.x86_64 kernel-debuginfo-common-x86_64-3.10.0-957.el7.x86_64 kernel-3.10.0-957.el7.x86_64
后续 通过升级内核重启后,问题目前没有再复现。但是否彻底解决该Bug待进一步跟进(至少不需要重装系统了)。
参考:
诊断修复 TiDB Operator 在 K8s 测试中遇到的 Linux 内核问题
Centos7 升级内核版本