Skip to content

KubeVirt 存储高可用与故障保障方案

日期: 2026-09-03 环境: RKE2 v1.35.6(6 节点)+ KubeVirt v1.9.0 + CDI v1.60.4 入口节点: root@192.168.122.31现状快照: 2026-09-03 实测(见 §3) 关联文档: kubevirt-nas-storage-guide.mdcdi-offline-deployment-guide.mdrke2-kubevirt-deployment-guide.md


目录

  1. 总体思路:三层防线
  2. 故障场景矩阵
  3. 当前集群风险盘点(2026-09-03 实测)
  4. 存储层:NAS 选型与配置
  5. K8s / KubeVirt 层:挂载参数与 VM HA 声明
  6. 备份兜底
  7. 监控告警与演练
  8. 推荐终态架构
  9. 附录:vm-nas StorageClass 与 HA VM 模板
  10. 验证清单

1. 总体思路:三层防线

① 存储自身不挂   → 商用 NAS 双控 / RAID / 快照
② 挂了能自愈     → KubeVirt 自动重启 / 热迁移(需要共享存储)
③ 兜底可恢复     → 备份 + 恢复演练

单一故障(一个控制器、一块盘、一条链路、一个 K8s 节点)都应只造成秒级~分钟级 影响并自动恢复;只有 NAS 整体损毁这种极小概率事件才动用备份。


2. 故障场景矩阵

故障影响恢复机制前提条件
NAS 单控制器故障IO 暂停数秒~数十秒,VM 卡住不死双控自动接管;hard 挂载恢复后自动续传双控型号 + hard 挂载
NAS 磁盘故障无感或性能下降RAID 重建 + 热备盘RAID6/10 + hot spare
NAS 整体不可恢复全部相关 VM 停摆快照/备份恢复到备用介质快照策略 + 异机备份(3-2-1)
承载 VM 的 worker 宕机,磁盘在 NAS该 VM 中断 1~5 分钟KubeVirt 在其他节点重建并重新挂载同一 PVCrunStrategy: Always + 共享存储
承载 VM 的节点宕机,磁盘在 local-path数据钉死在故障节点,不可迁移只能等节点复活改用 NAS 或带副本的本地存储
节点计划内维护(升级/换硬件)可零停机evictionStrategy: LiveMigrate 自动迁走磁盘为 RWX(NFS)
存储网络单链路断无感LACP / MPIO 冗余双网口绑定
KubeVirt 控制组件挂存量 VM 无感,仅影响新建多副本自愈已具备(见 §3)

3. 当前集群风险盘点(2026-09-03 实测)

已具备 ✅:

  • 控制面 3 节点 + etcd HA
  • virt-api / virt-controller2 副本 + PDBvirt-api-pdbvirt-controller-pdb

缺口 ⚠️(按风险排序):

#风险现状对策
1NFS 服务端是实验机 192.168.122.1,单点无 HA/mnt/xfs/rancher/*/srv/nfs-nvme/*商用 NAS 替换(本文主题)
23 台 VM 全部 evictionStrategy=None、未设 runStrategy节点故障不会自动迁移/重启§5.2 VM HA 声明
3nfs StorageClass 无 mountOptions挂载参数走内核默认,不可控§5.1 显式参数
4rocky9-dv-vm 磁盘在 local-path、钉死在控制面节点 .31节点故障数据不可迁移迁移到 vm-nas SC

4. 存储层:NAS 选型与配置

选型硬指标:

  • 双控制器(主动-备用,故障自动接管)
  • RAID6 或 RAID10 + 热备盘;双电源
  • 存储网 10GbE 双口 LACP;建议独立存储网段
  • 支持快照与远程复制(厂商原生或 CSI)

配置策略:

建议
快照每小时增量 + 每日全量,保留 ≥7 天
复制快照再复制到第二台 NAS 或对象存储(3-2-1:快照和原数据同机等于没备份)
精简置备thin provision + 容量监控,防超卖写满导致多 VM 同时挂
导出选项rw,sync,no_root_squash,no_subtree_check(K8s 专用目录)
性能分层VM 盘放 SSD 层 / 开 SSD 缓存;冷数据下沉 HDD

5. K8s / KubeVirt 层:挂载参数与 VM HA 声明

5.1 挂载参数(写进 vm-nas StorageClass)

yaml
mountOptions:
  - nfsvers=4.1
  - hard          # 关键:NAS 故障时 IO 挂起等待,恢复后自愈
  - timeo=600
  - retrans=5
  - noatime

绝不用 soft:soft 挂载在超时后返回 EIO,VM 磁盘会静默损坏; hard 挂载让 IO 挂起直到存储恢复,进程卡住但数据一致。

5.2 VM 级 HA 声明(当前 3 台 VM 全部缺失)

yaml
spec:
  runStrategy: Always                    # VMI 意外终止自动拉起
  template:
    spec:
      evictionStrategy: LiveMigrate      # 节点 drain 时零停机迁移(磁盘需 RWX)
      affinity:
        podAntiAffinity:                 # 关键 VM 分散到不同节点
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: kubevirt.io/vm
                  operator: Exists
              topologyKey: kubernetes.io/hostname

注意:

  • LiveMigrate 要求磁盘可共享:DataVolume 用 accessModes: [ReadWriteMany](NFS 支持)
  • RWO 盘无法热迁移,节点故障后恢复时间取决于节点判死速度(默认约 5 分钟, 可调节点 --default-not-ready-toleration-seconds
  • containerdisk 型 VM(无持久盘)无需上述配置,重启即恢复

6. 备份兜底

方案
PV 数据Velero + kopia/Restic 备份到独立存储;或厂商 CSI 快照 + 异地复制
编排定义VM / DataVolume / PVC 的 YAML 纳入 Git(重建集群时秒级恢复编排)
镜像库qcow2 金盘镜像在镜像库 + 备份介质各留一份
演练每季度一次恢复演练:从备份恢复一台 VM 并验证数据完整性

7. 监控告警与演练

监控项:

  • 节点侧 NFS 延迟:nfsiostat / nfsstat -o,读延迟 >10ms 告警
  • PV 容量 >80% 告警(kubelet_volume_stats_*
  • VMI 状态:kubevirt_vmi_phase_count 非 Running 告警(Grafana 仪表盘已在 rke2-kubevirt-deployment-guide.md §6 部署)
  • NAS 健康事件(控制器/磁盘/电源)接入告警通道

演练项(上线前必做):

  1. NAS 主备切换:拔线或关一侧控制器,记录业务中断时长(预期秒级~数十秒)
  2. 杀节点:对承载运行中 VM 的 worker 断电,验证 VM 在其他节点自动拉起及耗时
  3. 计划维护:kubectl drain 节点,验证 LiveMigrate 自动迁移无中断
  4. 备份恢复:从 Velero 恢复一台已删除的 VM

8. 推荐终态架构

商用 NAS(双控) ──10GbE LACP──┬── /exports/vm-images   (qcow2 镜像库, HTTP 暴露)
                             └── /exports/kubevirt    (K8s PV, nfsvers=4.1 hard)

              CDI 导入/克隆 ──▶ PVC(RWX) ──▶ VM: runStrategy=Always + LiveMigrate

              Velero/快照 ──▶ 第二台 NAS 或对象存储

任何单一故障(一个控制器、一块盘、一条链路、一个 K8s 节点)只造成秒级~分钟级 影响且自动恢复;仅 NAS 整体损毁需动用备份。


9. 附录:vm-nas StorageClass 与 HA VM 模板

完整 vm-nas StorageClass 与 provisioner 配置见 kubevirt-nas-storage-guide.md §7。 HA 版 DataVolume + VM 最小模板:

yaml
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: vm-ha-rootdisk
spec:
  source:
    http:
      url: "http://<镜像库>/images/rocky9-server-root.qcow2"
  pvc:
    storageClassName: vm-nas
    accessModes: [ReadWriteMany]      # 热迁移必需
    resources:
      requests:
        storage: 20Gi
---
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: vm-ha
spec:
  runStrategy: Always
  template:
    metadata:
      labels:
        kubevirt.io/vm: vm-ha
    spec:
      evictionStrategy: LiveMigrate
      domain:
        devices:
          disks:
          - name: rootdisk
            disk: { bus: virtio }
        resources:
          requests: { memory: 2Gi }
      volumes:
      - name: rootdisk
        dataVolume: { name: vm-ha-rootdisk }

10. 验证清单

  • [ ] 商用 NAS 双控切换演练通过,中断时长记录在案
  • [ ] vm-nas SC mountOptions 生效(mount | grep nfs4 检查参数)
  • [ ] 所有生产 VM 已设 runStrategy: Always;需要零停机维护的已设 LiveMigrate + RWX 盘
  • [ ] 快照策略与异地复制已配置并产生过至少一次成功复制
  • [ ] Velero 备份计划运行中,完成一次恢复演练
  • [ ] NFS 延迟、PV 容量、VMI 状态告警规则已生效