云原生虚拟化存储后端高可用【免费下载链接】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),仅供参考