主题
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.md、cdi-offline-deployment-guide.md、rke2-kubevirt-deployment-guide.md
目录
- 总体思路:三层防线
- 故障场景矩阵
- 当前集群风险盘点(2026-09-03 实测)
- 存储层:NAS 选型与配置
- K8s / KubeVirt 层:挂载参数与 VM HA 声明
- 备份兜底
- 监控告警与演练
- 推荐终态架构
- 附录:vm-nas StorageClass 与 HA VM 模板
- 验证清单
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 在其他节点重建并重新挂载同一 PVC | runStrategy: Always + 共享存储 |
| 承载 VM 的节点宕机,磁盘在 local-path | 数据钉死在故障节点,不可迁移 | 只能等节点复活 | 改用 NAS 或带副本的本地存储 |
| 节点计划内维护(升级/换硬件) | 可零停机 | evictionStrategy: LiveMigrate 自动迁走 | 磁盘为 RWX(NFS) |
| 存储网络单链路断 | 无感 | LACP / MPIO 冗余 | 双网口绑定 |
| KubeVirt 控制组件挂 | 存量 VM 无感,仅影响新建 | 多副本自愈 | 已具备(见 §3) |
3. 当前集群风险盘点(2026-09-03 实测)
已具备 ✅:
- 控制面 3 节点 + etcd HA
virt-api/virt-controller各 2 副本 + PDB(virt-api-pdb、virt-controller-pdb)
缺口 ⚠️(按风险排序):
| # | 风险 | 现状 | 对策 |
|---|---|---|---|
| 1 | NFS 服务端是实验机 192.168.122.1,单点无 HA | /mnt/xfs/rancher/*、/srv/nfs-nvme/* | 商用 NAS 替换(本文主题) |
| 2 | 3 台 VM 全部 evictionStrategy=None、未设 runStrategy | 节点故障不会自动迁移/重启 | §5.2 VM HA 声明 |
| 3 | nfs StorageClass 无 mountOptions | 挂载参数走内核默认,不可控 | §5.1 显式参数 |
| 4 | rocky9-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 健康事件(控制器/磁盘/电源)接入告警通道
演练项(上线前必做):
- NAS 主备切换:拔线或关一侧控制器,记录业务中断时长(预期秒级~数十秒)
- 杀节点:对承载运行中 VM 的 worker 断电,验证 VM 在其他节点自动拉起及耗时
- 计划维护:
kubectl drain节点,验证LiveMigrate自动迁移无中断 - 备份恢复:从 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-nasSC mountOptions 生效(mount | grep nfs4检查参数) - [ ] 所有生产 VM 已设
runStrategy: Always;需要零停机维护的已设LiveMigrate+ RWX 盘 - [ ] 快照策略与异地复制已配置并产生过至少一次成功复制
- [ ] Velero 备份计划运行中,完成一次恢复演练
- [ ] NFS 延迟、PV 容量、VMI 状态告警规则已生效