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

经常有节点报出类似如下错误

docker-bug

查看一些网上资料,一般都说是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

  1. 更新yum仓库
1
[root@dev-server-2 ~]# yum -y update
  1. 导入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. 升级内核
1
2
#安装最新版的内核
[root@dev-server-2 ~]# yum --enablerepo=elrepo-kernel install kernel-ml
  1. 设置默认启动内核
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. 重启验证
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. 删除旧内核
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待进一步跟进(至少不需要重装系统了)。

参考:

  1. 诊断修复 TiDB Operator 在 K8s 测试中遇到的 Linux 内核问题
  2. Centos7 升级内核版本

评论