内核bug修复方案:网络设备引用计数泄漏
适用内核版本:3.10.* 关键词:kernel:unregister_netdevice: waiting for ... to become free. Usage count = 1 更新日期:2021.08.11
1. 问题现象
节点不做任何操作,也会反复出现形如“kernel:unregister_netdevice: waiting for ... to become free. Usage count = 1”的输出;
节点pod网卡创建慢;
通过重启服务器可以在一段时间内不再出现报错,但过一段时间又有了。
2. 问题定位
定位为内核线程的引用计数泄漏问题,社区有较多相关 Issue:
详见博客的第2个bug
3. 临时处理方案
重启节点可以缓解该问题,但过一段时间(几天)后,又会重现。
4. 彻底修复方案
全新部署的场景:
在部署之前,如果可以选择机器的内核版本,建议使用>=4.18.*版本的内核。
如果一定要使用3.10.0的内核,请确保该内核版本>=3.10.0-1160(仅针对Redhat/CentOS)。
已经部署完成的环境:
对于已经部署集群的节点,可以根据实际情况进行内核升级:
情况1,【ECS CentOS7.6/7.7/7.8请走此流程】机器的OS为RedHat or CentOS,且使用`uname -r`查看内核版本<3.10.0-1160,并且可以使用yum源,请看附录1:在线将CentOS内核升级到3.10.0-1160
情况2,机器的OS为RedHat or CentOS,但是处于离线环境,没法使用yum源,请看附录2:离线将CentOS内核升级到4.19.1
ADP并不提供操作系统及相关技术兜底,此处的升级方式仅供参考,因内核的升级而引发的意外问题不在ADP的责任边界内。
附录1:在线将CentOS内核升级到3.10.0-1160
yum update -y kernel kernel-devel
vim /etc/default/grub #修改成 GRUB_DEFAULT=0
grub2-mkconfig -o /boot/grub2/grub.cfg
# 重启节点,查看内核版本是否>=3.10.0-1160
reboot
uname -a
附录2:离线将CentOS内核升级到4.19.1
1. 准备阶段
拷贝安装包到进行升级服务器:https://acs-ecp.oss-cn-hangzhou.aliyuncs.com/rpm/kernel-4.19.1-rpm.tar
可选操作:到集群master节点,驱逐当前节点的服务kubectl drain ${nodename} --ignore-daemonsets=true。注:此步为可选操作,如果做了则会将节点上已有的应用先驱逐到其他节点上,这样就可以将升级内核过程中对应用的影响减小,如果您已经确认过应用处于可停服窗口期,则此操作也可以不做
2. 升级当前内核节点
# tar -xvf kernel-4.19.1-rpm.tar
# rpm -ivh kernel-ml-devel-4.19.1-1.el7.elrepo.x86_64.rpm
# rpm -ivh kernel-ml-4.19.1-1.el7.elrepo.x86_64.rpm
# rpm -ivh kernel-ml-headers-4.19.1-1.el7.elrepo.x86_64.rpm
若出现安装报错,使用rpm -ivh --force --nodeps
安装
3. 修改grub中默认的内核版本
# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
查看新内核(4.19.1)的位置为x,例如0
#vim /etc/default/grub
将GRUB_DEFAULT=saved 改为 GRUB_DEFAULT=0
执行grub2-mkconfig命令来重新创建内核配置
# grub2-mkconfig -o /boot/grub2/grub.cfg
4. 重启系统并查看系统内核
# reboot
# uname –a
5. 回滚版本
# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
查看旧内核(xxxx)的位置为y,例如1
内核回滚操作流程:
# vi /etc/default/grub
将GRUB_DEFAULT=saved 改为 GRUB_DEFAULT=1
执行grub2-mkconfig命令来重新创建内核配置
# grub2-mkconfig -o /boot/grub2/grub.cfg
重启服务器,使内核版本回滚生效
# reboot
# uname –a
6. 异常处理
1. 若出现报错:Found 7 pre-existing rpmdb problem(s), 'yum check' output follows:
gssproxy-0.7.0-4.el7.x86_64 is a duplicate with gssproxy-0.4.1-13.el7.x86_64
libnfsidmap-0.25-17.el7.x86_64 is a duplicate with libnfsidmap-0.25-15.el7.x86_64
libtalloc-2.1.9-1.el7.x86_64 is a duplicate with libtalloc-2.1.6-1.el7.x86_64
libtevent-0.9.31-1.el7.x86_64 is a duplicate with libtevent-0.9.28-1.el7.x86_64
libtirpc-0.2.4-0.10.el7.x86_64 is a duplicate with libtirpc-0.2.4-0.8.el7.x86_64
1:nfs-utils-1.3.0-0.48.el7.x86_64 is a duplicate with 1:nfs-utils-1.3.0-0.33.el7_3.x86_64
rpcbind-0.2.0-42.el7.x86_64 is a duplicate with rpcbind-0.2.0-38.el7.x86_64
执行命令:rpm -e #old version
2. 若出现报错: warning:PRMDB altered outside of yum.
执行命令:rm -rf /var/lib/yum/history/*.sqlite