问题描述
服务器安装Docker后,在进行服务重新部署后,出现 kernel:unregister_netdevice: waiting for veth2e632a2 to become free. Usage count = 1错误频繁输出,影响操作。
适用内核版本:3.10.* 关键词:kernel:unregister_netdevice: waiting for … to become free. Usage count = 1
-
问题现象
节点不做任何操作,也会反复出现形如“kernel:unregister_netdevice: waiting for veth… to become free. Usage count = 1”的输出;
节点pod网卡创建慢;
通过重启服务器可以在一段时间内不再出现报错,但过一段时间又有了。
-
问题定位
定位为内核线程的引用计数泄漏问题,社区有较多相关 Issue:
-
https://github.com/kubernetes/kubernetes/issues/64743
-
https://github.com/projectcalico/calico/issues/1109
-
https://github.com/moby/moby/issues/5618
详见博客的第2个bug
- 临时处理方案
重启节点可以缓解该问题,但过一段时间(几天)后,又会重现。
- 彻底修复方案
全新部署的场景:
在部署之前,如果可以选择机器的内核版本,建议使用>=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
- 准备阶段
拷贝安装包到进行升级服务器:https://acs-ecp.oss-cn-hangzhou.aliyuncs.com/rpm/kernel-4.19.1-rpm.tar
可选操作:到集群master节点,驱逐当前节点的服务kubectl drain ${nodename} --ignore-daemonsets=true。注:此步为可选操作,如果做了则会将节点上已有的应用先驱逐到其他节点上,这样就可以将升级内核过程中对应用的影响减小,如果您已经确认过应用处于可停服窗口期,则此操作也可以不做
- 升级当前内核节点
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安装
- 修改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
- 重启系统并查看系统内核
reboot
uname –a
- 回滚版本
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