VMware 到 KubeVirt 大规模迁移技术分析

一、背景概述

1. 迁移动机

本次迁移项目源于 VMware 续费报价上涨 3 倍,成本压力迫使企业寻找替代方案。原环境运行约 2000 台虚机,涵盖业务系统、数据库、中间件等各类工作负载。

2. 技术选型分析

在方案评估阶段,团队对多个虚拟化平台进行了对比分析:

方案优点缺点最终评估
OpenStack成熟稳定,社区活跃架构复杂,运维成本高排除
Proxmox VE开源免费,界面友好企业级功能欠缺备选
oVirtRed Hat 支持社区萎缩,未来不明排除
KubeVirt云原生,统一管理相对年轻,学习曲线陡最终选择

3. 选择 KubeVirt 的核心原因

  • 统一技术栈:现有容器平台已使用 Kubernetes,虚机和容器统一管理可降低运维复杂度
  • 渐进式迁移:同一集群可同时运行容器和虚机,业务可逐步迁移
  • 避免厂商锁定:纯开源方案,避免被单一厂商卡脖子
  • 成本控制:年度基础设施成本预期降低 60% 以上

二、技术架构分析

1. KubeVirt 核心组件

KubeVirt 在 Kubernetes 之上构建虚拟化管理层,通过自定义资源定义(CRD)扩展 Kubernetes API。

graph TB
    subgraph KubeVirt
        A[virt-api]
        B[virt-controller]
        C[virt-handler<br/>DaemonSet]
    end
    subgraph Libvirt
        D[libvirt + QEMU/KVM]
    end
    subgraph Node
        E[Linux with KVM support]
    end
    A --> F[VirtualMachine CRD]
    B --> G[VMI]
    C --> D
    D --> E

KubeVirt 架构图

组件功能说明

  • virt-api:提供 KubeVirt API 入口,处理 VirtualMachine 等 CRD 的请求
  • virt-controller:监听 VM 相关资源变化,负责创建对应的 VMI(VirtualMachineInstance)
  • virt-handler:以 DaemonSet 形式部署在每个节点,负责虚机生命周期管理
  • virt-launcher:每个虚机对应一个 Pod,内部运行 libvirt 和 QEMU 进程

2. 环境配置

硬件配置

  • 计算节点:Dell PowerEdge R750xs

    • 双路 Intel Xeon Gold 6348(28 核 56 线程)
    • 512GB DDR4 ECC 内存
    • 2 x 1.92TB NVMe SSD(本地缓存)
  • 存储:Dell PowerStore 5200T,100TB 可用容量,iSCSI 连接
  • 网络:Mellanox ConnectX-6 Dx 100GbE 双端口网卡,配置 bond

软件版本

组件版本
操作系统Rocky Linux 8.9
Kubernetes1.28.4(kubeadm 部署)
KubeVirt1.1.1
CDI1.58.1
Longhorn1.5.3(后期替换)
Rook-Ceph1.12.9(最终采用)
Multus4.0.2
OVN-Kubernetes与 K8s 集成

节点规模

  • Master 节点:3 台
  • 计算节点:42 台(其中 18 台专用于虚机负载)

三、迁移实施

1. 迁移流程

graph LR
    A[VMware] -->|virt-v2v| B[QEMU/KVM]
    B -->|qcow2| C[CDI Import]
    C -->|DataVolume| D[KubeVirt]
    E[Longhorn] -.拒绝.-> F[性能不足]
    G[Rook-Ceph] -->|采用| D

迁移流程图

2. 存储方案演进

存储是迁移过程中最关键的组件。项目初期采用 Longhorn,但在大规模虚机场景下性能不足,两个月后切换至 Rook-Ceph。

Rook-Ceph 配置要点

  • 使用 NVMe 设备作为 OSD 存储介质
  • 配置三副本策略保证数据可靠性
  • 启用压缩模式降低存储占用
  • 为虚机负载创建专用存储池

RBD StorageClass 配置

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-ceph-block-vm
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
  clusterID: rook-ceph
  pool: replicapool-vm
  imageFormat: "2"
  imageFeatures: layering,fast-diff,object-map,deep-flatten,exclusive-lock
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate

3. 网络架构

虚机需要使用原 VMware 环境的 VLAN 网络,采用 Multus + OVN-Kubernetes 实现二层网络透传。

graph LR
    A[VLAN 100] -->|ovn-k8s-cni| B[br-vlan100]
    C[VLAN 200] -->|ovn-k8s-cni| D[br-vlan200]
    B --> E[VM Production]
    D --> E
    F[Multus CNI] -->|网络适配| G[KubeVirt Pod]
    G --> E

网络架构图

Multus 配置示例

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: vlan100-production
  namespace: vm-production
spec:
  config: |-
    {
      "cniVersion": "0.3.1",
      "name": "vlan100-production",
      "type": "ovn-k8s-cni-overlay",
      "topology": "localnet",
      "vlanID": 100,
      "mtu": 9000,
      "subnets": "10.100.0.0/16"
    }

四、虚机迁移策略

1. 虚机分类

根据业务影响和迁移难度,将 2000 台虚机分为五类:

优先级类型数量迁移方式
Priority 1已关机、无共享磁盘342批量离线迁移
Priority 2无状态服务567从模板重建
Priority 3标准业务845有停机时间的迁移
Priority 4关键业务198计划窗口迁移
Priority 5复杂配置48手动验证迁移

2. 迁移工具

采用 virt-v2v + 自研批量脚本的组合方案:

  • virt-v2v:官方转换工具,负责 VMDK 到 qcow2 的格式转换
  • 自研脚本:实现批量调度、状态跟踪、错误处理

virt-v2v 转换命令

virt-v2v -ic "vpx://${VCENTER_USER}@${VCENTER_HOST}/${ESXI_HOST}?no_verify=1" \
    "${VM_NAME}" \
    -o local -os "${OUTPUT_DIR}" \
    -of qcow2 \
    --password-file <(echo "${VCENTER_PASSWORD}")

3. Windows 虚机特殊处理

Windows 虚机迁移需预先安装 VirtIO 驱动:

# 安装 VirtIO 存储驱动
pnputil.exe /add-driver E:\vioscsi\w10\amd64\*.inf /install

# 安装 VirtIO 网络驱动
pnputil.exe /add-driver E:\NetKVM\w10\amd64\*.inf /install

# 安装 QEMU Guest Agent
msiexec.exe /i E:\guest-agent\qemu-ga-x86_64.msi /qn

五、性能优化

1. CPU 优化

对延迟敏感的工作负载启用 CPU 绑定:

spec:
  template:
    spec:
      domain:
        cpu:
          cores: 4
          dedicatedCpuPlacement: true
          isolateEmulatorThread: true
          model: host-passthrough
          numa:
            guestMappingPassthrough: {}

实测数据显示,开启 CPU 绑定后数据库虚机 P99 延迟降低 40%。

2. 内存优化

内存密集型工作负载使用大页内存:

domain:
  memory:
    guest: 32Gi
    hugepages:
      pageSize: 1Gi

节点配置:

# 配置 1GB 大页
echo 34 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages

# 持久化配置
cat >> /etc/sysctl.conf << EOF
vm.nr_hugepages = 34
EOF

# 标记节点
kubectl label node node-vm-01 kubevirt.io/hugepages-1Gi=true

3. 存储 IO 优化

数据库工作负载的 IO 调优:

domain:
  devices:
    disks:
      - name: datadisk
        disk:
          bus: virtio
          io: native
          cache: none
          dedicatedIOThread: true

在此配置下,MySQL 虚机达到 85000 IOPS(4K 随机读)。

六、高可用与监控

1. 实时迁移配置

spec:
  configuration:
    migrations:
      parallelMigrationsPerCluster: 10
      parallelOutboundMigrationsPerNode: 4
      bandwidthPerMigration: 1Gi
      completionTimeoutPerGiB: 800
      progressTimeout: 300
      allowAutoConverge: true
      allowPostCopy: false

2. 监控指标

使用 Prometheus + Grafana 监控关键指标:

  • CPU 使用率:kubevirt_vmi_cpu_system_usage_seconds_total
  • 内存使用:kubevirt_vmi_memory_used_bytes
  • 网络 IO:kubevirt_vmi_network_receive_bytes_total
  • 磁盘 IO:kubevirt_vmi_storage_iops_read_total
  • 迁移状态:kubevirt_vmi_migration_phase_transition_time_seconds

七、迁移成果

经过 6 个月实施,项目取得以下成果:

指标数据
迁移完成率1987 台成功(99.35%)
成本节省年度基础设施成本降低 62%
运维效率团队规模从 12 人优化到 8 人
故障恢复时间从 45 分钟降至 12 分钟

八、经验总结

1. 关键经验

  • 存储是核心:Longhorn 在大规模虚机场景下性能不足,Ceph 虽复杂但稳定可靠
  • 网络提前规划:VLAN 透传配置繁琐,需在项目初期设计好网络架构
  • 分批迁移:每批 50 台可控,问题影响面小
  • Windows 需专门模板:驱动和激活问题需提前准备
  • 监控先行:迁移前建好监控体系,便于问题排查

2. 常见问题

问题原因解决方案
Guest agent 未连接QEMU Guest Agent 未安装安装并启动 qemu-guest-agent
网络不通Multus 配置错误检查 NetworkAttachmentDefinition 和 VLAN 透传
磁盘性能差缓存策略不当改为 cache: none + io: native
实时迁移失败带宽或存储问题调整迁移带宽,检查存储可达性

九、参考资料

  1. KubeVirt 官方文档
  2. KubeVirt GitHub 仓库
  3. virt-v2v 文档
  4. Rook-Ceph 文档
  5. OVN-Kubernetes 文档
最后修改:2026 年 01 月 15 日
如果觉得我的文章对你有用,请随意赞赏