ODF 能够为块存储和文件系统存储创建快照和克隆。

快照

ODF 安装完成后,Operator 会自动安装和控制默认的快照类,无法删除和修改。

可以为同一个 PVC 创建多个快照,但无法调度定期创建快照。
同时对于快照会有以下的限制:

  • CephFS,每个 PVC 最多可创建 100 个快照
  • RBB,每个 PVC 最多可创建 512 个快照

创建快照

快照的创建依赖 CSI 提供的 API,由 CSI 驱动程序提供快照的功能。
查看 CSI 默认提供的存储类和卷快照类:

1
2
3
4
5
6
7
8
9
oc get sc | egrep '^NAME|csi'
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
ocs-storagecluster-ceph-rbd openshift-storage.rbd.csi.ceph.com Delete Immediate true 5d19h
ocs-storagecluster-cephfs openshift-storage.cephfs.csi.ceph.com Delete Immediate true 5d19h

oc get volumesnapshotclasses
NAME DRIVER DELETIONPOLICY AGE
ocs-storagecluster-cephfsplugin-snapclass openshift-storage.cephfs.csi.ceph.com Delete 5d19h
ocs-storagecluster-rbdplugin-snapclass openshift-storage.rbd.csi.ceph.com Delete 5d19h

通过 YAML 资源定义为使用 RBD 类型存储的 app-data PVC 创建一个名为 app-data-snap 的快照:

1
2
3
4
5
6
7
8
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: app-data-snap
spec:
volumeSnapshotClassName: ocs-storagecluster-rbdplugin-snapclass 
source:
persistentVolumeClaimName: app-data

快照不属于任何命名空间。
如果是为 CephFS 类型的存储创建快照,只需修改 volumeSnapshotClassName 为 ocs-storagecluster-cephfsplugin-snapclass 即可。

查看已创建的快照:

1
2
3
oc get volumesnapshot
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
app-data-snap true app-data 1Gi ocs-storagecluster-rbdplugin-snapclass snapcontent-44009b59-83e9-458b-af67-c0a92b2aac45 66s 67s

在 Dashboard 中也可以创建和查看快照:

恢复快照

恢复快照时会创建一个新的 PVC,恢复的 PVC 将独立于快照和父 PVC。

通过 YAML 资源定义从快照中创建一个新的 PVC :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
name: app-data-restore
namespace: app-demo
labels:
app: app-data-snap
spec:
accessModes: 
- ReadWriteOnce
storageClassName: ocs-storagecluster-ceph-rbd 
dataSource: 
apiGroup: snapshot.storage.k8s.io
kind: VolumeSnapshot
name: app-data-snap
resources:
requests:
storage: 1Gi

通过 dataSource 参数来指定快照创建新的 PVC。
后续就可以在应用中使用新的 PVC app-data-restore 了。

在 Dashboard 中恢复快照:

克隆

创建克隆的前提是源 PVC 必须处于 Bound 状态,且不得处于使用的状态。

通过在 dataSource 参数中引用源 PVC 来创建 PVC 的克隆:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
name: app-data-clone
namespace: app-demo
labels:
app: postgresql-data-clone
spec:
accessModes: 
- ReadWriteOnce
storageClassName: ocs-storagecluster-ceph-rbd 
dataSource: 
kind: PersistentVolumeClaim
name: app-data
resources:
requests:
storage: 1Gi

在 Dashboard 中创建克隆: