虚拟机快照
虚拟机快照和恢复¶
在
kubevirt中,snapshot.kubevirt.ioAPI组 定义了VirtualMachines快照和恢复功能。使用虚拟机快照有几个前置条件: 1. 必须先安装
VolumeSnapshotClass。kubevirt利用k8s CSI驱动程序提供的VolumeSnapshot功能来捕获持久化VirtualMachine的状态,因此,VirtualMachine必须使用支持VolumeSnapshot的StorageClass存储类的DataVolume或者PersistentVolumeClaim。注意 确保# kubectl get vsclass NAME DRIVER DELETIONPOLICY AGE csi-rbdplugin-snapclass rbd.csi.ceph.com Delete 6d5hStorageClass的provisioner属性与VolumeSnapshotClass的driver属性匹配,这里,我推荐使用Ceph CSI驱动程序。
- 必须开启
feature_gates(特性门控) 中的Snapshot
创建虚拟机快照¶
创建虚拟机快照时,无论是在线还是已关闭的虚拟机,都支持创建快照。 当对运行中的虚拟机进行快照时,控制器会检查虚拟机内部是否存在
qemu-guest-agent。如果发现有,则会在拍摄快照前冻结虚拟机的文件系统,在快照完成后解冻。 为了获得更好的一致性快照效果,推荐在安装了qemu-guest-agent的情况下执行在线快照操作。如果虚拟机内没有安装或没有启用qemu-guest-agent, KubeVirt 仍然会尽力去创建一个最佳可能状态的快照,但无法保证数据的一致性。
注意 检查虚拟机是否安装了qemu-guest-agent,可以通过kubectl describe vm vmName命令查看,在Status中有Type: AgentConnected就表示安装了qemu-guest-agent。
以下示例,是为名为vm-ubuntu01的虚拟机创建快照。
apiVersion: snapshot.kubevirt.io/v1alpha1
kind: VirtualMachineSnapshot
metadata:
name: snap-vm-ubuntu01-1
spec:
source:
apiGroup: kubevirt.io
kind: VirtualMachine
name: vm-ubuntu01
failureDeadline: 5m
# kubectl apply -f snap-vm-ubuntu01.yaml
# kubectl wait vmsnapshot snap-vm-ubuntu01-1 --for condition=Ready
# kubectl get vmsnapshot
NAME SOURCEKIND SOURCENAME PHASE READYTOUSE CREATIONTIME ERROR
snap-vm-ubuntu01-1 VirtualMachine vm-ubuntu01 Succeeded true 90s
vmsnapshot中有以下几种状态(phase)
- InProgress
- Succeeded
- Failed
虚拟机快照默认有一个5分钟的完成期限(failureDeadline),如果在截止期限内未能成功完成
vmSnapshot,它将被标记为Failed状态。 此时,虚拟机会被解冻,并根据需要清理已创建的快照内容。失败的vmSnapshot对象将保持在Failed状态直到用户手动删除。 若要更改这个默认截止期限,可以在VirtualMachineSnapshot的spec中添加FailureDeadline字段并设置新的值。 允许使用的格式是一个符合duration规范的时间字符串,即一个可能带有正负号、可选小数部分以及单位后缀的十进制数字序列, 例如 "300ms"(表示300毫秒)、"-1.5h"(表示负1.5小时)或 "2h45m"(表示2小时45分钟)。也可以设置无限截止时间,即将
failureDeadline设置为0(不推荐)。apiVersion: snapshot.kubevirt.io/v1alpha1 kind: VirtualMachineSnapshot metadata: name: snap-vm-ubuntu01-2 spec: source: apiGroup: kubevirt.io kind: VirtualMachine name: vm-ubuntu01 failureDeadline: "0"# kubectl describe vmsnapshot snap-vm-ubuntu01-2 Name: snap-vm-ubuntu01-2 Namespace: default Labels: <none> Annotations: <none> API Version: snapshot.kubevirt.io/v1alpha1 Kind: VirtualMachineSnapshot Metadata: Creation Timestamp: 2024-02-17T08:13:06Z Finalizers: snapshot.kubevirt.io/vmsnapshot-protection Generation: 5 Resource Version: 1032771 UID: 60a5d83c-ecd8-4420-a80f-528fbe3ff673 Spec: # 这里是 0s Failure Deadline: 0s Source: API Group: kubevirt.io Kind: VirtualMachine Name: vm-ubuntu01 Status: Conditions: Last Probe Time: <nil> Last Transition Time: 2024-02-17T08:13:09Z Reason: Operation complete Status: False Type: Progressing Last Probe Time: <nil> Last Transition Time: 2024-02-17T08:13:09Z Reason: Operation complete Status: True Type: Ready Creation Time: 2024-02-17T08:13:09Z Indications: Online GuestAgent Phase: Succeeded Ready To Use: true Snapshot Volumes: Excluded Volumes: cloudinitdisk Included Volumes: root-disk Source UID: 267c5a5b-8981-498d-8982-8cb0265ff3ef Virtual Machine Snapshot Content Name: vmsnapshot-content-60a5d83c-ecd8-4420-a80f-528fbe3ff673 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulVirtualMachineSnapshotContentCreate 26s snapshot-controller Successfully created VirtualMachineSnapshotContent vmsnapshot-content-60a5d83c-ecd8-4420-a80f-528fbe3ff673
基于虚拟机快照恢复虚拟机¶
要想从虚拟机快照(VirtualMachineSnapshot)中恢复虚拟机,先要停止目标虚拟机,然后执行如下yaml
# kubectl apply -f snap-restore-vm-ubuntu01.yaml
virtualmachinerestore.snapshot.kubevirt.io/snap-restore-vm-ubuntu01 created
# kubectl wait vmrestore snap-restore-vm-ubuntu01 --for condition=Ready
# kubectl get vmrestore
## 状态COMPLETE为true表示完成
NAME TARGETKIND TARGETNAME COMPLETE RESTORETIME ERROR
snap-restore-vm-ubuntu01 VirtualMachine vm-ubuntu01 true 4s
删除虚拟机快照¶
如果希望再次使用快照进行恢复,请保留
VirtualMachineSnapshots及其相应的VirtualMachineSnapshotContents。如果恢复已经完成,不需要这个快照了,是可以直接删除的,不影响已经恢复的虚拟机。# kubectl get vmsnapshot NAME SOURCEKIND SOURCENAME PHASE READYTOUSE CREATIONTIME ERROR snap-vm-ubuntu01 VirtualMachine vm-ubuntu01 Succeeded true 67m snap-vm-ubuntu01-2 VirtualMachine vm-ubuntu01 Succeeded true 49m # kubectl get vsc NAME READYTOUSE RESTORESIZE DELETIONPOLICY DRIVER VOLUMESNAPSHOTCLASS VOLUMESNAPSHOT VOLUMESNAPSHOTNAMESPACE AGE snapcontent-09eff7ed-7b94-48f6-a1d6-944fd22fcacb true 10737418240 Delete rbd.csi.ceph.com csi-rbdplugin-snapclass vmsnapshot-52eec954-f1b5-48d5-a7c2-c3f98f769466-volume-root-disk default 68m snapcontent-5bf10d73-2af1-4a24-b802-75fb21cfaa82 true 10737418240 Delete rbd.csi.ceph.com csi-rbdplugin-snapclass vmsnapshot-60a5d83c-ecd8-4420-a80f-528fbe3ff673-volume-root-disk default 49m # kubectl delete vmsnapshot snap-vm-ubuntu01 virtualmachinesnapshot.snapshot.kubevirt.io "snap-vm-ubuntu01" deleted # kubectl delete vmsnapshot snap-vm-ubuntu01-2 virtualmachinesnapshot.snapshot.kubevirt.io "snap-vm-ubuntu01-2" deleted # kubectl get vsc No resources found