网卡管理中怎么在 Kubernetes 宿主机遭遇网络插件崩溃导致海量 veth 虚拟网卡彻底僵死时利用自动化 Shell 循环脚本批量优雅执行清理

舞夢輝影

舞夢輝影

2026-07-27

381人浏览

原创

答案是采用“先隔离再卸载”策略,聚焦三类僵死veth特征(标准前缀无ns、DOWN且NOARP、绑定已销毁netns),通过nsenter或force-unregister方式批量安全清理,并辅以日志记录、防抖暂停与事后验证。

网卡管理中怎么在 kubernetes 宿主机遭遇网络插件崩溃导致海量 veth 虚拟网卡彻底僵死时利用自动化 shell 循环脚本批量优雅执行清理

当 Kubernetes 宿主机因网络插件(如 Calico、Flannel、Cilium)崩溃,导致大量 veth 虚拟网卡残留且处于“僵死”状态(即不响应、无法删除、ip link delete 失败、unregister_netdevice 日志刷屏),手动逐条清理既低效又易出错。此时需绕过内核强依赖,采用“先隔离再卸载”的策略,配合精准匹配与容错循环,实现批量、安全、可中断的自动化清理。

识别真正僵死的 veth 设备(非所有 veth 都该删)

盲目删除所有 veth 会误伤正常 Pod 或 CNI 残留但尚可恢复的接口。应聚焦三类典型僵死特征:

  • 名称含 Kubernetes 标准前缀且无对应命名空间进程:如 vethXXXXXXcaliXXXXXXXXflannel.1(注意:后者是 VXLAN 设备,不属 veth,勿误删)
  • 状态为 DOWNNOARPMASTER 字段为空或异常:用 ip -br link show | grep veth 初筛
  • 绑定到已销毁的 network namespace(/proc/PID/ns/net 不存在):可通过 readlink /sys/class/net/veth*/name 或检查 /sys/class/net/vethXXX/device/physfn 是否报错辅助判断

使用 namespace 绑定检测 + force-unregister 安全清理

核心思路:对每个疑似僵死 veth,先尝试通过其关联的 netns(若仍存在)执行 ip link delete;若 netns 已不可达,则触发内核强制解绑流程(需 root 权限且依赖 kernel ≥ 4.15):

  • 执行 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore(临时降低干扰)
  • 对每个 veth:ip link set dev vethXXXX down && ip link delete vethXXXX 2>/dev/null || (echo "force cleanup: vethXXXX"; echo 1 > /sys/class/net/vethXXXX/device/remove)
  • 注意:/sys/class/net/*/device/remove 仅对部分 PCI-emulated veth 有效;更通用方式是调用 unregister_netdevice 的 debug 接口(需开启 CONFIG_NET_NS_DEBUG 内核选项),生产环境推荐优先走 nsenter 方式

健壮的 Shell 循环脚本模板(带超时与幂等)

以下脚本自动完成:筛选 → 去重 → 分批 → 容错执行 → 记录日志:

#!/bin/bash
LOG="/var/log/veth-cleanup-$(date +%s).log"
echo "$(date) —— 开始扫描僵死 veth" > $LOG
<h1>仅匹配标准 veth 前缀,排除 host-side bridge 和 flannel/cilium 全局设备</h1><p>VETH_LIST=($(ip -br link show | awk ' ~ /^veth[0-9a-f]{6,}$/ &&  == "DOWN" {print }'))</p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/learn/2082" title="Linux.开发篇笔记"><img
														src="https://img.php.cn/upload/webcode/000/000/000/599d3b7598b09627.png" alt="Linux.开发篇笔记" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/learn/2082" title="Linux.开发篇笔记" class="overflowclass">Linux.开发篇笔记</a>
													<p class="overflowclass">Linux.开发篇笔记</p>
												</div>
												<a rel="nofollow" href="/xiazai/learn/2082" title="Linux.开发篇笔记" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div><p>if [ ${#VETH_LIST[@]} -eq 0 ]; then
echo "$(date) —— 未发现候选 veth,退出" >> $LOG
exit 0
fi</p><p>echo "$(date) —— 共发现 ${#VETH_LIST[@]} 个 DOWN 状态 veth" >> $LOG</p><p>for veth in "${VETH_LIST[@]}"; do
echo -n "$(date +%H:%M:%S) —— 处理 $veth: "</p><h1>尝试常规删除(兼容多数情况)</h1><p>if ip link delete "$veth" 2>&1 | tee -a $LOG | grep -q "Cannot find device"; then</p><h1>fallback:关闭设备后写 remove(适用于部分 kernel)</h1><pre class="brush:php;toolbar:false;">ip link set "$veth" down 2>/dev/null
if [ -f "/sys/class/net/$veth/device/remove" ]; then
  echo 1 > "/sys/class/net/$veth/device/remove" 2>&1 | tee -a $LOG
else
  echo "skip remove (no sysfs interface)" | tee -a $LOG
fi

else echo "success" | tee -a $LOG fi

防抖动:每删 5 个暂停 0.3 秒,避免内核 soft lockup

((i++ % 5 == 0)) && sleep 0.3 done

echo "$(date) —— 清理结束,详情见 $LOG"

事后验证与防护建议

清理后务必验证,而非仅看命令返回值:

  • 执行 ip -br link show | grep veth | wc -l 对比清理前后数量
  • 检查 dmesg -T | grep -i "unregister_netdevice.*waiting" 是否归零
  • 观察 cat /proc/net/dev | grep veth 输出是否显著减少(僵死 veth 通常有非零 rx/tx 字节但无包)
  • 长期防护:在 kubelet 启动参数中加入 --make-iptables-util-chains=false(若用 iptables)+ 配置 CNI 插件的 syncTimeouthealthCheckPeriod,并部署 node-problem-detector 监控 netns 泄漏

不复杂但容易忽略:僵死 veth 本质是 netns 生命周期管理断裂,自动化脚本只是止血;根治需结合 CNI 升级、内核参数调优(如 net.netfilter.nf_conntrack_tcp_be_liberal=1)和定期巡检机制。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

kubernetes 虚拟网卡

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Golang云原生微服务Kubernetes_Golang怎么集成Kubernetes开发云原生服务
Golang云原生微服务Kubernetes_Golang怎么集成Kubernetes开发云原生服务

Golang云原生微服务Kubernetes (K8s) 是指 使用 Go 语言(Golang)编写的云原生微服务,并利用 Kubernetes 平台进行容器化部署、自动化管理、弹性伸缩和高效编排的一整套现代应用架构方案。

2025.12.22

74

5

Go云原生应用与Kubernetes服务部署实战
Go云原生应用与Kubernetes服务部署实战

本专题围绕 Go 语言在云原生环境中的应用展开,讲解容器化部署、Kubernetes 编排、服务发现、健康检查与弹性扩缩容机制。通过真实云端案例,帮助开发者构建可扩展的云原生微服务架构。

2026.06.29

42

19

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

2671

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

1649

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

1294

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

2654

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

2416

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

1659

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

1231

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Linux开发篇视频教程
Linux开发篇视频教程

共18课时 | 4.4万人学习

Linux开发视频教程
Linux开发视频教程

共18课时 | 4.5万人学习