虚拟机快照和恢复快照
KubeVirt 可以对虚拟机打快照,快照由 snapshot.kubevirt.io
组 API 支持,当前版本为 v1beta1
:
[root@base-k8s-master-1 ~]# kubectl api-resources | grep snapshot.kubevirt.io
virtualmachinerestores vmrestore,vmrestores snapshot.kubevirt.io/v1beta1 true VirtualMachineRestore
virtualmachinesnapshotcontents vmsnapshotcontent,vmsnapshotcontents snapshot.kubevirt.io/v1beta1 true VirtualMachineSnapshotContent
virtualmachinesnapshots vmsnapshot,vmsnapshots snapshot.kubevirt.io/v1beta1 true VirtualMachineSnapshot
快照依赖 StorageClass
,并且 StorageClass
要支持 VolumeSnapshots
,还需要配置 VolumeSnapshotClasses
。
关于
VolumeSnapshots
和VolumeSnapshotClasses
的创建可以参考 ceph-csi/examples/rbd 的模板。
[root@base-k8s-master-1 rbd]# kubectl get volumesnapshotclasses.snapshot.storage.k8s.io
NAME DRIVER DELETIONPOLICY AGE
csi-rbdplugin-snapclass rbd.csi.ceph.com Delete 13s
KubeVirt 支持在线快照,在线快照依赖
qemu-guest-agent
,拍摄快照时虚拟机会冻结,拍摄完成后会解冻。还原快照需要关闭虚拟机后还原。
快照支持包含热插拔磁盘,临时磁盘不支持。
目前快照只能保存磁盘数据,不支持保存内存状态。
虚拟机有多个磁盘时恢复快照后虚拟机可能会从错误的磁盘引导,可以通过
bootOrder
设置启动盘。
开启快照功能
需要开启 Snapshot
特性门控。
[root@base-k8s-master-1 rbd]# kubectl edit -n kubevirt kubevirts.kubevirt.io kubevirt
...output omitted...
spec:
certificateRotateStrategy: {}
configuration:
developerConfiguration:
featureGates:
- VMLiveUpdateFeatures
- HonorWaitForFirstConsumer
- Snapshot
...output omitted...
为虚拟机打快照前需要先通过
bootOrder
字段来设置启动盘,以防恢复后虚拟机从错误的磁盘引导。
为虚拟机打快照
apiVersion: snapshot.kubevirt.io/v1beta1
kind: VirtualMachineSnapshot
metadata:
name: snap-my-vm
spec:
source:
apiGroup: kubevirt.io
kind: VirtualMachine
name: my-vm
failureDeadline: 1m
failureDeadline
表示快照超时时间,规定时间内快照未创建完则标记为失败,默认为 5 分钟。
创建快照:
[root@base-k8s-master-1 kubevirt]# kubectl apply -f snapshot.yml
virtualmachinesnapshot.snapshot.kubevirt.io/snap-my-vm created
虚拟机删除文件
[root@base-k8s-master-1 kubevirt]# virtctl ssh fedora@my-vm
Last login: Fri Mar 21 16:59:01 2025 from 10.100.239.50
[fedora@vm-dv ~]$ ls /tmp/
systemd-private-e476d875aef945f9a72ebc6e34b57f02-chronyd.service-vJ1UqN systemd-private-e476d875aef945f9a72ebc6e34b57f02-systemd-logind.service-y1erwP
systemd-private-e476d875aef945f9a72ebc6e34b57f02-dbus-broker.service-LNmEGZ systemd-private-e476d875aef945f9a72ebc6e34b57f02-systemd-oomd.service-RO50A9
systemd-private-e476d875aef945f9a72ebc6e34b57f02-systemd-hostnamed.service-VQi9rN systemd-private-e476d875aef945f9a72ebc6e34b57f02-systemd-resolved.service-7ck5Xm
[fedora@vm-dv ~]$ sudo rm -rf /tmp/*
[fedora@vm-dv ~]$ ls /tmp/
恢复快照
apiVersion: snapshot.kubevirt.io/v1beta1
kind: VirtualMachineRestore
metadata:
name: restore-my-vm
spec:
target:
apiGroup: kubevirt.io
kind: VirtualMachine
name: my-vm
virtualMachineSnapshotName: snap-my-vm
恢复:
[root@base-k8s-master-1 kubevirt]# kubectl apply -f snapshotrestore.yml
The request is invalid: spec.target: VirtualMachine "my-vm" run strategy has to be Halted
[root@base-k8s-master-1 kubevirt]# virtctl stop my-vm
VM my-vm was scheduled to stop
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
my-vm 19d Stopped False
[root@base-k8s-master-1 kubevirt]# kubectl apply -f snapshotrestore.yml
virtualmachinerestore.snapshot.kubevirt.io/restore-my-vm created
[root@base-k8s-master-1 kubevirt]# virtctl start my-vm
VM my-vm was scheduled to start
验证
[root@base-k8s-master-1 kubevirt]# virtctl ssh fedora@my-vm
Last login: Fri Mar 21 17:15:10 2025 from 10.100.239.50
[fedora@vm-dv ~]$ ls /tmp/
systemd-private-be271e2ad3734980a387548d0af0351b-chronyd.service-rMAowE systemd-private-be271e2ad3734980a387548d0af0351b-systemd-logind.service-nYHSPP
systemd-private-be271e2ad3734980a387548d0af0351b-dbus-broker.service-8rwdWL systemd-private-be271e2ad3734980a387548d0af0351b-systemd-oomd.service-hejJfq
systemd-private-be271e2ad3734980a387548d0af0351b-systemd-hostnamed.service-lVMJ4U systemd-private-be271e2ad3734980a387548d0af0351b-systemd-resolved.service-1AHHOZ
TroubleShooting
多个磁盘的虚拟机恢复后未正常引导系统
多个磁盘的虚拟机由于没有设置启动盘,导致恢复快照后虚拟机从数据磁盘引导系统,所以在创建虚拟机时要设置好系统盘,设置系统盘方式如下:
devices:
disks:
- bootOrder: 1
name: root-disk
添加 bootOrder
来设置引导顺序。