Harvester VM 迁移网络(vm-migration-network)设置详解:从 Setting 校验到 KubeVirt 配置的落地
云原生虚拟化存储后端高可用【免费下载链接】harvesterOpen source hyperconverged infrastructure (HCI) software项目地址https://gitcode.com/gh_mirrors/ha/harvester点击查看免费下载Harvester 默认使用管理mgmt网络承载 VM 实时迁移数据流而 mgmt 网络同时是控制平面迁移带宽会与之竞争。本文围绕设计文档 20250519-vm-migration-network 展开讲清vm-migration-network设置的设计动机、配置结构、Webhook 校验规则以及harvester-vm-migration-network-controller如何生成 Network-Attachment-DefinitionNAD并更新 KubeVirt 配置使迁移流量可以切换到独立的集群网络上。背景与设计目标设计文档的 Summary 开宗明义当前 Harvester 只支持通过 mgmt 网络进行 VM 迁移而 mgmt 网络承担控制平面职责VM 迁移本质是数据搬运理应允许用户将其放到另一张网络上。该增强源于 issue #5848。文档列出的 Goals目标用户可以为 VM 迁移选择一张集群网络cluster network用户可以为 VM 迁移指定 VLAN ID用户可以为 VM 迁移指定 CIDR 地址段用户可以在 CIDR 中排除部分 IP。Non-goals明确不做的事不负责搭建集群网络用户须先自行配置好集群网络不负责检测集群网络配置是否正确、连通性是否良好不在安装阶段配置 VM 迁移网络。两个典型使用故事切换网络用户建好集群网络后在设置中填入集群网络名、VLAN ID、CIDR 与排除 IP控制器据此创建 NAD 并更新到 KubeVirt 配置。回滚到 mgmt 网络用户把设置恢复为默认空值控制器会清理 KubeVirt 配置中的迁移网络字段并删除 NAD。完整的用户体验链路为用户配置带网口的集群网络用户在设置中提供集群网络名、VLAN ID、CIDR 与排除 IP控制器基于设置创建 NAD 并更新 KubeVirt 配置KubeVirt 自动重启 virt-controller 与 virt-handler Pod重启期间无法迁移 VMAPI server 会拒绝迁移请求待 KubeVirt 的Available条件 reason 为AllComponentsReady后用户即可在迁移网络上迁移 VM。对应的 API 层面改动有两处新增设置vm-migration-network在 migrate API 中加入 KubeVirt 状态检查。设置结构一段 JSON 描述迁移网络vm-migration-network在 settings.go 中注册默认值为空字符串——空值即表示回退到 mgmt 网络这一 Non-goal 之外的默认行为VMMigrationNetwork NewSetting(VMMigrationNetworkSettingName, ) ... VMMigrationNetworkSettingName vm-migration-network设置的取值是一段 JSON。从 common.go 中的network.Config结构体其 JSON tag 即设置字段名可以确认字段构成字段类型含义clusterNetworkstring已存在的集群网络名迁移流量将从该网络的网口进出vlanuint16该集群网络上的 VLAN ID不填时默认为 1rangestringIPv4 CIDR如192.168.200.0/24作为 Whereabouts IPAM 的分配范围exclude[]string从range中排除的具体 IP 列表rangeV6/rangeV6Start/rangeV6Endstring双栈场景下的 IPv6 外层网络与可分配窗口需集群以双栈方式安装因此一个典型设置值如下字段名与取值形态由Config结构体推导示例地址仅作演示{ clusterNetwork: tr-1, vlan: 200, range: 192.168.200.0/24, exclude: [192.168.200.1] }从源码结构看当前代码在双栈增强见 20260528-dual-stack-ipv4-first 相关设计之后还支持 IPv6配置了rangeV6时必须同时给出 IPv4 的rangeIPv4 Family First 约束且rangeV6Start/rangeV6End必须与rangeV6一同设置。Webhook设置写入前的五类校验与额外防线设计文档要求 Webhook 完成五项校验集群网络存在于所有节点、VLAN ID 合法、CIDR 合法、排除 IP 合法且落在 CIDR 内、可用 IP 数不小于节点数每个节点需要一个 IP。这些规则在 validator.go 中注册并实现validateNetworkHelpervalidator.go#L1134-L1206对三个网络类设置storage-network、vm-migration-network、rwx-network共用一套公共校验器再叠加各设置专属校验器commonValidators : []func(*networkutil.Config) error{ v.checkNetworkVlanValid, v.checkNetworkRangeValid, v.checkVlanStatusReady, v.checkVCspansAllNodes, } ... settingValidators : map[string][]func(*networkutil.Config) error{ ... settings.VMMigrationNetworkSettingName: { v.checkVMMigrationNetworkRangeValid, }, ... }逐条对应关系如下集群网络在所有节点上存在且就绪checkVCspansAllNodes检查该 cluster network 覆盖全部节点checkVlanStatusReady检查 VLAN 状态就绪VLAN ID 合法checkNetworkVlanValidCIDR 合法checkNetworkRangeValid可用 IP 数 ≥ 节点数专属校验器checkVMMigrationNetworkRangeValidvalidator.go#L2127-L2150。注释写得很直白1 IP per virt-handler。实现上先统计非 witness 节点数countNonWitnessNodes会剔除带node-role.harvesterhci.io/witness标签的节点再经GetUsableIPAddressesCount计算扣除排除项后可分配地址数不足则报allocatable IP address range is N, allocate sufficient range。在文档设计之外当前代码还叠加了三道防线实际运维时值得注意迁移进行中禁止改设置validateVMMigrationNetworkvalidator.go#L1516-L1560会列出所有 VirtualMachineInstanceMigration只要存在未完成且未删除中的迁移就返回There is a VM Migration in progress, please wait until it is completed before updating the VMMigrationNetwork setting避免切换网络时打断在途迁移设置不可删除validateDeleteVMMigrationNetwork直接返回MethodNotAllowed只能清空值来回滚与 Story 2 的用法一致与其他网络地址段互斥checkNetworkOverlap会检查迁移网络的可用 IP 是否与storage-network、rwx-network的重叠防止三张逻辑网络互相借用同一批地址。此外rangeV6相关字段只在接受过双栈安装的集群上生效单栈 IPv4 集群会直接拒绝只提供 IPv6 而不提供 IPv4range的配置也会因 IPv4 Family First 被拒绝。Controllerhash 防抖、NAD 生成与 KubeVirt 更新设计文档中的控制器逻辑在 vm_migration_network.go 中完整落地控制器名与文档一致const ( ControllerName harvester-vm-migration-network-controller VMMigrationNetworkPrefix vm-migration-network.settings.harvesterhci.io VMMigrationNetworkHashLabel VMMigrationNetworkPrefix /hash VMMigrationNetworkHashAnnotation VMMigrationNetworkHashLabel VMMigrationNetworkNadAnnotation VMMigrationNetworkPrefix /net-attach-def KubeVirtName kubevirt VMMigrationNetworkNetAttachDefPrefix vm-migration-network- )OnVMMigrationNetworkChangevm_migration_network.go#L95-L158的执行顺序与设计文档一一对应hash 防抖checkIsSameHashValue比较设置值 SHA-1 与 setting 上vm-migration-network.settings.harvesterhci.io/hash注解相同则直接返回避免重复 reconcile空值回滚setting.Value为空时把 KubeVirt 的spec.configuration.migrationConfiguration.network置 nil 并删除旧 NAD非空配置findOrCreateNad按 hash 标签在harvester-system命名空间查找既有 NAD找不到则用vm-migration-network-前缀创建新 NAD再把 NAD 名写入 KubeVirt 的migrationConfiguration.network字段清理旧 NAD若 KubeVirt 上指向的旧 NAD 与新 NAD 不同记录在vm-migration-network.settings.harvesterhci.io/net-attach-def注解调用removeOldNad删除收尾setConfiguredCondition更新 hash 与 NAD 注解并把 setting 的Configuredcondition 置为 True中途失败则分别记录GetKubeVirtError、CreateNadError、UpdateKubeVirtError、RemoveOldNadError等 reason便于排障。NAD 的内容由CreateBridgeConfigcommon.go#L64-L101从设置值渲染成标准 bridge CNI 配置cniVersion: 0.3.1type: bridgepromiscMode: true桥名固定为clusterNetwork-brBridgeSuffix -brvlan缺省填DefaultPVID 1IPAM 使用whereaboutsIPv4 场景写扁平的range/exclude双栈场景改用 Whereabouts 0.9.3 的ipRanges列表格式同时写入 IPv4 与 IPv6 条目IPv6 条目携带range_start/range_end。KubeVirt 侧的对接点是spec.configuration.migrationConfiguration.network——这正是 KubeVirt 官方文档 Using a different network for migrations 描述的能力设计文档 Note 一节引用的就是该文档。另外两个相关实现细节设置注册入口在 Register 中通过settings.OnChange(ctx, ControllerName, ...)监听 setting 变更与kubevirt-migration设置的分工kubevirt_migration.go 中的syncKubeVirtMigration负责把kubevirt-migration默认如{parallelOutboundMigrationsPerNode:2,parallelMigrationsPerCluster:5,allowAutoConverge:false,...}同步到 KubeVirt但它刻意保留network字段不覆盖注释写明 The network field is handled by vm-migration-network setting两个设置各管一摊、互不踩踏。API 侧的迁移闸门设计文档第 5、6 步——KubeVirt 重启期间拒绝迁移、AllComponentsReady后才放行——在 handler.go 的migrate动作中实现handler.go#L584-L599kubevirt, err : h.kubevirtCache.Get(util.HarvesterSystemNamespaceName, util.KubeVirtObjectName) ... for _, condition : range kubevirt.Status.Conditions { if condition.Type kubevirtv1.KubeVirtConditionAvailable { if condition.Reason kubevirtutil.ConditionReasonDeploymentReady { isKubeVirtReady condition.Status corev1.ConditionTrue } break } } if !isKubeVirtReady { return errors.New(KubeVirt is not ready) }也就是说migrate API 在创建VirtualMachineInstanceMigration之前会检查 KubeVirt 对象的Available条件且 reason 为DeploymentReady即文档所说的AllComponentsReady为 True否则直接返回 KubeVirt is not ready。切换迁移网络触发 virt-controller/virt-handler 重启的窗口期内迁移请求就会被这道闸门挡住。测试计划与升级策略设计文档给出的 Test plan覆盖 webhook 五项校验 控制器两个核心动作webhook 能校验集群网络在所有节点上webhook 能校验 VLAN ID 合法webhook 能校验 CIDR 合法webhook 能校验排除 IP 合法且位于 CIDR 内webhook 能校验可用 IP 数不小于节点数控制器能基于设置创建 NAD 并更新 KubeVirt 配置控制器能从 KubeVirt 配置中移除vm-migration-network并删除 NAD。仓库中对应的主要校验与设置注册代码可分别参考 validator.go 及其同目录测试文件 validator_test.go以及设置注册表 register.go安装器侧把vm-migration-network纳入系统设置清单见 config.go。文档中 Upgrade strategy 一节标注为 N/A该功能无跨版本状态迁移需求升级路径上不需要特殊处理。小结vm-migration-network设置以空值即默认 mgmt 网络、非空即切换独立网络的二态设计把迁移数据面与控制平面解耦。整条链路是Webhook 先做覆盖、地址、容量、互斥与在途迁移状态校验控制器用 SHA-1 注解做变更去重渲染 bridge Whereabouts 的 NAD写入 KubeVirt 的migrationConfiguration.networkAPI server 再用 KubeVirt 的Available/AllComponentsReady条件守住重启窗口期。对使用者而言只需保证集群网络已就绪、CIDR 至少留出非 witness 节点数个可用 IP即可安全地在两套网络配置之间切换与回滚。赞分享云原生虚拟化存储后端高可用【免费下载链接】harvesterOpen source hyperconverged infrastructure (HCI) software项目地址https://gitcode.com/gh_mirrors/ha/harvester点击查看免费下载相关推荐从传统VM到微VM的蜕变Firecracker极速迁移实战指南从传统VM到微VM的蜕变Firecracker极速迁移实战指南 Firecracker是一款安全快速的微虚拟机microVM技术专为无服务器计算打造。本虚拟化云原生解决Dockur/Windows容器中VM网络IP配置难题从原理到实战解决Dockur/Windows容器中VM网络IP配置难题从原理到实战 在Docker容器中运行Windows系统时VM网络IP配置往往是最令人头疼的问题之虚拟化KubeVirt云原生迁移终极指南10步将传统VM无缝迁移到Kubernetes集群KubeVirt云原生迁移终极指南10步将传统VM无缝迁移到Kubernetes集群 想要将传统虚拟机平滑迁移到Kubernetes生态系统中KubeVir云原生上一篇OpenCore Legacy Patcher让旧Mac焕发新生的终极指南下一篇如何彻底告别百度网盘下载等待终极命令行解决方案指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

微信好友自动统计方案:企业微信接口与个人号半自动实操

微信好友自动统计方案:企业微信接口与个人号半自动实操

做了六年私域运营,我的微信从一开始的两三百人,涨到现在将近一万人。说实话,通讯录超过三千人以后,光靠翻列表根本看不出谁删了你——好友人数每天在变,新增几个、被删几个,全靠记忆根本不靠谱。早年间我也…

2026/10/13 8:28:41 阅读更多 →
华为云ModelArts全流程解析:从Notebook到模型部署的实战指南

华为云ModelArts全流程解析:从Notebook到模型部署的实战指南

1. 从零理解ModelArts到底在解决什么问题很多人第一次接触华为云ModelArts,脑子里冒出来的第一个疑问是:我本地有显卡、有Jupyter Notebook,为什么还要跑到云上去做模型训练和部署?这个问题如果不先想清楚,后面学起来就…

2026/10/13 8:28:41 阅读更多 →
动态规划与哈希表:算法优化与状态管理实战

动态规划与哈希表:算法优化与状态管理实战

1. 动态规划与哈希表的状态保存艺术第一次在LeetCode上遇到那道经典爬楼梯问题时,我像大多数初学者一样,用递归写出了简洁优雅的代码。但当输入n50时,程序突然变得异常缓慢——那一刻我深刻理解了什么是"指数级时间复杂度"。动态规…

2026/10/13 8:28:41 阅读更多 →

最新新闻

AIGC创作训练营:从工具使用到工作流设计的系统化训练

AIGC创作训练营:从工具使用到工作流设计的系统化训练

1. 从"会用AI"到"驾驭AI":AIGC创作训练营到底在训练什么很多人第一次接触AIGC,都是从"帮我写一段文案""帮我生成一张图"开始的。提示词丢进去,结果出来,能用就复制粘贴,不能用…

2026/10/13 9:23:55 阅读更多 →
PS5第三方手柄兼容方案:用MCU做HID协议转换层

PS5第三方手柄兼容方案:用MCU做HID协议转换层

前阵子我发了条状态,说自己正在折腾一个叫AnyPS5的小项目,结果评论区一下子涌进来一堆私信,全是问同一个问题:能不能让我手里那些非官方的老手柄在PS5上正常用。说实话,这确实是这个项目最核心的诉求。PS5主机对第三方…

2026/10/13 9:23:55 阅读更多 →
devtron 仓库内 AWS SDK for Go v2 EventStream 协议包全解析:CHANGELOG 版本演进与编解码实现

devtron 仓库内 AWS SDK for Go v2 EventStream 协议包全解析:CHANGELOG 版本演进与编解码实现

云原生DevOps运维 【免费下载链接】devtron The only Kubernetes dashboard you need 项目地址: https://gitcode.com/gh_mirrors/dev/devtron 点击查看 免费下载 导读 本文以 devtron 仓库中锁定的第三方依赖 github.com/aws/aws-sdk-go-v2/aws/protocol/eventst…

2026/10/13 9:23:55 阅读更多 →
bilibili-api完全指南:从零开始掌握B站API开发与应用

bilibili-api完全指南:从零开始掌握B站API开发与应用

bilibili-api完全指南:从零开始掌握B站API开发与应用 B站作为国内领先的视频弹幕网站,拥有丰富的内容生态和开放的API接口,为开发者提供了广阔的创新空间。本指南将带你全面了解B站API的开发与应用,从基础概念到实际操作&#xf…

2026/10/13 9:23:55 阅读更多 →
自助点餐机24小时营业无人值守落地指南丨蓝速科技(larxu)

自助点餐机24小时营业无人值守落地指南丨蓝速科技(larxu)

很多餐饮老板都有过这样的纠结:看着深夜街头偶尔走过的行人,想着要是能多做几单生意该多好,但一算账又退缩了。招一个夜班收银员,工资要比白班高,还得担心人家干不久就离职,流动性大得让人头疼。更现实的是…

2026/10/13 9:23:55 阅读更多 →
Python大数据分析实验通关指南:从数据清洗到可视化全流程

Python大数据分析实验通关指南:从数据清洗到可视化全流程

1. 从lab7这个编号说起:为什么Python课设总在第七周卡住 如果你正在翻这门课的实验安排,看到lab7这个编号,大概率已经过了前六周的语法基础、循环判断、函数封装,开始进入真正要“处理数据”的阶段了。这门课的名字叫《Python程序…

2026/10/13 9:22:51 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →