PVC快照功能和使用云服务器或者虚拟机的快照功能类似,可以针对存储某一刻的状态进行一个快照,无论数据出现严重丢失或者其他情况,都可以回滚数据。快照功能无论是块存储还是文件存储,操作步骤和原理一致。
注意:PVC快照功能需要Kubernetes版本在1.17以上,并且高于1.19时,需要单独安装Snapshot控制器,另外需要注意快照功能也需要后端存储的支持。
一、共享文件存储快照¶
特别说明:下面操作是基于之前的环境进行操作的,详细请点击---使用共享文件系统存储,这里就不重复演示部署环境了。
1.1 创建快照¶
1.创建snapshotClass
$ cd /root/rook/deploy/examples/csi/cephfs
$ k create -f snapshotclass.yaml
说明:文件默认即可,不用修改
2.验证snapshotClass是否创建成功,观察到已成功创建
[root@k8s-master01 cephfs]# k get volumesnapshotclass
NAME DRIVER DELETIONPOLICY AGE
csi-cephfsplugin-snapclass rook-ceph.cephfs.csi.ceph.com Delete 5m55s
3.创建快照
$ cd /root/rook/deploy/examples/csi/cephfs
$ k create -f snapshot.yaml

注意:snapshot.yaml文件中的PVC需要根据自己实际环境进行修改
4.验证快照是否创建成功,观察到已成功创建
[root@k8s-master01 cephfs]# k get volumesnapshot
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
cephfs-pvc-snapshot true nginx-share-pvc 2Gi csi-cephfsplugin-snapclass snapcontent-c6767763-2d43-455e-aeeb-7807b56c92b7 43s 43s
5.登录Ceph进一步验证快照是否创建成功,观察到已成功创建

6.上面快照名字和我们自己查到快照名snapcontent-c6767763-2d43-455e-aeeb-7807b56c92b7是不一样的,如果想要查找ceph上快照名的对应关系,需要借助VolumeSnapshotContent,下面简单介绍下VolumeSnapshotContent
VolumeSnapshotContent(卷快照内容)是 Kubernetes 中的一个资源对象,用于表示卷快照的内容或数据。它与 VolumeSnapshot(卷快照)资源一起使用,用于创建和管理卷的快照。
VolumeSnapshotContent 包含了以下信息:
- metadata:元数据部分包含关于
VolumeSnapshotContent的基本信息,如名称、命名空间、标签等。 - spec:规格部分定义了
VolumeSnapshotContent的配置和属性。 - volumeSnapshotRef:指定与该快照内容关联的
VolumeSnapshot对象的引用。它包含了VolumeSnapshot的名称和 UID。 - driver:指定了用于创建卷快照的驱动程序。这是一个字符串值,表示 Kubernetes 中已安装的卷快照驱动程序的名称。
- source:指定了用于创建卷快照的卷的来源信息。它可以是
PersistentVolumeClaim(持久卷声明)或VolumeSnapshot。 - snapshotHandle:指定了底层存储系统中快照的句柄。它是一个字符串值,用于唯一标识底层存储系统中的快照。
- status:状态部分包含了
VolumeSnapshotContent的当前状态信息。 - creationTime:表示创建
VolumeSnapshotContent的时间戳。 - readyToUse:表示卷快照内容是否已准备就绪,可以用于还原或复制卷。
- restoreSize:表示卷快照内容的还原大小。
VolumeSnapshotContent 可以通过 kubectl 命令或 Kubernetes API 进行创建和管理。它与 VolumeSnapshot 一起使用,用于跟踪和管理卷的快照数据。通过使用 VolumeSnapshotContent 和 VolumeSnapshot,可以实现卷的备份、还原和复制等操作,提供更强大的数据管理和保护能力。
[root@k8s-master01 cephfs]# k get VolumeSnapshotContent snapcontent-c6767763-2d43-455e-aeeb-7807b56c92b7 -oyaml

1.2 回滚PVC数据¶
1.根据pvc-restore.yaml文件核对storageClassName、name、storage大小(不能小于实际大小)
[root@k8s-master01 cephfs]# k get VolumeSnapshot cephfs-pvc-snapshot
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
cephfs-pvc-snapshot true nginx-share-pvc 2Gi csi-cephfsplugin-snapclass snapcontent-c6767763-2d43-455e-aeeb-7807b56c92b7 82m 82m
[root@k8s-master01 cephfs]# k get sc rook-cephfs
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-cephfs rook-ceph.cephfs.csi.ceph.com Delete Immediate true 24h
2.核对后进行相应的修改
$ cd /root/rook/deploy/examples/csi/cephfs
$ vim pvc-restore.yaml

3.将快照恢复到新的PVC
$ cd /root/rook/deploy/examples/csi/cephfs
$ k create -f pvc-restore.yaml
4.验证恢复PVC
[root@k8s-master01 cephfs]# k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
cephfs-pvc-restore Bound pvc-eb384ad1-ca09-4112-b64b-4b6fe62b9cc2 2Gi RWX rook-cephfs 11s
nginx-share-pvc Bound pvc-b94bb9f8-f7e4-48cd-82be-db9dee6c451d 2Gi RWX rook-cephfs 11h
1.3 快照资源清理¶
使用如下命令清除集群中本示例创建的资源
$ cd /root/rook/deploy/examples/csi/cephfs
$ k delete -f pvc-restore.yaml
$ k delete -f snapshot.yaml
$ k delete -f snapshotclass.yaml
二、块存储快照¶
特别说明:下面操作是基于之前的环境进行操作的,详细请点击---使用ceph块存储,这里就不重复演示部署环境了。
2.1 创建snapshotClass¶
1.创建snapshotClass
$ cd /root/rook/deploy/examples/csi/rbd
$ k create -f snapshotclass.yaml
说明:文件默认即可,不用修改
2.验证snapshotClass是否创建成功,观察到已成功创建
[root@k8s-master01 rbd]# k get volumesnapshotclass
NAME DRIVER DELETIONPOLICY AGE
csi-rbdplugin-snapclass rook-ceph.rbd.csi.ceph.com Delete 4m36s
3.创建快照
$ cd /root/rook/deploy/examples/csi/rbd
$ k create -f snapshot.yaml

注意:snapshot.yaml文件中的PVC需要根据自己实际环境进行修改
4.验证快照是否创建成功,观察到已成功创建
[root@k8s-master01 rbd]# k get volumesnapshot
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
rbd-pvc-snapshot true mysql-pv-claim 8Gi csi-rbdplugin-snapclass snapcontent-aa01a48a-fac7-4aec-aacd-4e2768cd9f3c 61s 61s
5.登录Ceph进一步验证快照是否创建成功,观察到已成功创建

6.上面快照名字和我们自己查到快照名snapcontent-aa01a48a-fac7-4aec-aacd-4e2768cd9f3c是不一样的,如果想要查找ceph上快照名的对应关系,需要借助VolumeSnapshotContent。
[root@k8s-master01 cephfs]# k get VolumeSnapshotContent snapcontent-aa01a48a-fac7-4aec-aacd-4e2768cd9f3c -oyaml

2.2 回滚PVC数据¶
1.根据pvc-restore.yaml文件核对storageClassName、name、storage大小(不能小于实际大小)
[root@k8s-master01 rbd]# k get VolumeSnapshot rbd-pvc-snapshot
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
rbd-pvc-snapshot true mysql-pv-claim 8Gi csi-rbdplugin-snapclass snapcontent-aa01a48a-fac7-4aec-aacd-4e2768cd9f3c 44m 44m
[root@k8s-master01 rbd]# k get sc rook-ceph-block
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 9h
2.核对后进行相应的修改
$ cd /root/rook/deploy/examples/csi/rbd
$ vim pvc-restore.yaml

3.将快照恢复到新的PVC
$ cd /root/rook/deploy/examples/csi/cephfs
$ k create -f pvc-restore.yaml
4.验证恢复PVC
[root@k8s-master01 rbd]# k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-f1f26550-43e5-4cc3-bf80-986ed5f7639f 8Gi RWO rook-ceph-block 9h
rbd-pvc-restore Bound pvc-2238d971-d572-4970-8003-2523e5ae9ca4 8Gi RWO rook-ceph-block 6s
2.3 快照资源清理¶
使用如下命令清除集群中本示例创建的资源
$ cd /root/rook/deploy/examples/csi/rbd
$ k delete -f pvc-restore.yaml
$ k delete -f snapshot.yaml
$ k delete -f snapshotclass.yaml