跳转至

虚拟机快照

虚拟机快照和恢复

kubevirt中,snapshot.kubevirt.io API组 定义了VirtualMachines快照和恢复功能。

使用虚拟机快照有几个前置条件: 1. 必须先安装VolumeSnapshotClass。kubevirt利用k8s CSI驱动程序提供的VolumeSnapshot功能来捕获持久化VirtualMachine的状态,因此, VirtualMachine必须使用支持VolumeSnapshotStorageClass存储类的DataVolume或者PersistentVolumeClaim

# kubectl get vsclass
NAME                      DRIVER             DELETIONPOLICY   AGE
csi-rbdplugin-snapclass   rbd.csi.ceph.com   Delete           6d5h
注意 确保StorageClassprovisioner属性与VolumeSnapshotClassdriver属性匹配,这里,我推荐使用Ceph CSI驱动程序。

  1. 必须开启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状态直到用户手动删除。 若要更改这个默认截止期限,可以在VirtualMachineSnapshotspec中添加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

apiVersion: snapshot.kubevirt.io/v1alpha1
kind: VirtualMachineRestore
metadata:
  name: snap-restore-vm-ubuntu01
spec:
  target: 
    apiGroup: kubevirt.io
    kind: VirtualMachine
    name: vm-ubuntu01
  virtualMachineSnapshotName: snap-vm-ubuntu01

# 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