apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-hostpath-snap
driver: hostpath.csi.k8s.io (1)
deletionPolicy: Delete
本文档介绍如何使用受支持的容器存储接口 (CSI) 驱动程序的卷快照来帮助保护 OpenShift Container Platform 中免受数据丢失。建议您熟悉持久卷。
快照表示集群中存储卷在特定时间点的状态。卷快照可用于预配新卷。
OpenShift Container Platform 默认支持容器存储接口 (CSI) 卷快照。但是,需要特定的 CSI 驱动程序。
使用 CSI 卷快照,集群管理员可以:
部署支持快照的第三方 CSI 驱动程序。
从现有卷快照创建新的持久卷声明 (PVC)。
对现有的 PVC 进行快照。
将快照恢复为不同的 PVC。
删除现有的卷快照。
使用 CSI 卷快照,应用程序开发人员可以:
使用卷快照作为开发应用程序或集群级存储备份解决方案的构建块。
快速回滚到以前的开发版本。
通过不必每次都进行完整复制来更有效地使用存储。
使用卷快照时,请注意以下事项:
仅支持 CSI 驱动程序。不支持树内和 FlexVolumes。
OpenShift Container Platform 只附带选定的 CSI 驱动程序。对于非 OpenShift Container Platform 驱动程序操作器提供的 CSI 驱动程序,建议使用社区或存储供应商提供的 CSI 驱动程序。请按照 CSI 驱动程序提供商提供的安装说明进行操作。
CSI 驱动程序可能已实现也可能未实现卷快照功能。已提供卷快照支持的 CSI 驱动程序可能会使用csi-external-snapshotter sidecar。有关详细信息,请参阅 CSI 驱动程序提供的文档。
OpenShift Container Platform 提供一个部署到控制平面的快照控制器。此外,您的 CSI 驱动程序供应商提供 CSI 快照 sidecar 作为在 CSI 驱动程序安装期间安装的辅助容器。
CSI 快照控制器和 sidecar 通过 OpenShift Container Platform API 提供卷快照功能。这些外部组件在集群中运行。
外部控制器由 CSI 快照控制器操作器部署。
CSI 快照控制器操作符运行在openshift-cluster-storage-operator命名空间中。它默认情况下由集群版本操作符 (CVO) 在所有集群中安装。
CSI 快照控制器操作符安装 CSI 快照控制器,该控制器运行在openshift-cluster-storage-operator命名空间中。
在 OpenShift Container Platform 安装期间,CSI 快照控制器操作符会在snapshot.storage.k8s.io/v1 API 组中创建以下快照自定义资源定义 (CRD):
VolumeSnapshotContent集群管理员已预配的集群中卷的快照。
类似于PersistentVolume对象,VolumeSnapshotContent CRD 是指向存储后端中实际快照的集群资源。
对于手动预配的快照,集群管理员会创建多个VolumeSnapshotContent CRD。这些 CRD 携带存储系统中实际卷快照的详细信息。
VolumeSnapshotContent CRD 没有命名空间,供集群管理员使用。
VolumeSnapshot类似于PersistentVolumeClaim对象,VolumeSnapshot CRD 定义了开发人员对快照的请求。CSI 快照控制器操作符运行 CSI 快照控制器,该控制器处理VolumeSnapshot CRD 与相应的VolumeSnapshotContent CRD 的绑定。绑定是一对一的映射。
VolumeSnapshot CRD 有命名空间。开发人员使用 CRD 来发出对快照的明确请求。
VolumeSnapshotClass允许集群管理员指定属于VolumeSnapshot对象的不同的属性。这些属性可能在存储系统上对同一卷拍摄的快照之间有所不同,在这种情况下,它们不会使用持久卷声明的相同存储类来表示。
VolumeSnapshotClass CRD 定义了创建快照时csi-external-snapshotter sidecar 要使用的参数。这允许存储后端知道如果支持多种选项,则要动态创建哪种类型的快照。
动态预配的快照使用VolumeSnapshotClass CRD 指定创建快照时要使用的特定于存储提供程序的参数。
VolumeSnapshotContentClass CRD 没有命名空间,供集群管理员使用,以启用其存储后端的全局配置选项。
创建VolumeSnapshot对象时,OpenShift Container Platform 会创建一个卷快照。
登录到正在运行的 OpenShift Container Platform 集群。
使用支持VolumeSnapshot对象的 CSI 驱动程序创建的 PVC。
用于预配存储后端的存储类。
没有 Pod 使用您要拍摄快照的持久卷声明 (PVC)。
|
为正在被 Pod 使用的 PVC 创建卷快照可能会导致未写入的数据和缓存的数据未包含在快照中。为确保所有数据都写入磁盘,请在创建快照之前删除正在使用 PVC 的 Pod。 |
要动态创建卷快照:
创建一个包含以下 YAML 中描述的VolumeSnapshotClass对象的文件:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-hostpath-snap
driver: hostpath.csi.k8s.io (1)
deletionPolicy: Delete
| 1 | 用于创建此VolumeSnapshotClass对象的 CSI 驱动程序的名称。此名称必须与负责正在拍摄快照的 PVC 的存储类的Provisioner字段相同。 |
|
根据您用于配置持久存储的驱动程序,可能需要其他参数。您也可以使用现有的 |
通过输入以下命令来创建您在上一步中保存的对象:
$ oc create -f volumesnapshotclass.yaml
创建VolumeSnapshot对象:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: mysnap
spec:
volumeSnapshotClassName: csi-hostpath-snap (1)
source:
persistentVolumeClaimName: myclaim (2)
| 1 | 卷快照对特定类的请求。如果缺少volumeSnapshotClassName设置并且存在默认卷快照类,则使用默认卷快照类名称创建快照。但是,如果该字段不存在且不存在默认卷快照类,则不会创建快照。 |
| 2 | 绑定到持久卷的PersistentVolumeClaim对象的名称。这定义了您要创建快照的对象。对于动态预配快照是必需的。 |
通过输入以下命令来创建您在上一步中保存的对象:
$ oc create -f volumesnapshot-dynamic.yaml
要手动预配快照:
除了定义卷快照类(如上所示)之外,还要为volumeSnapshotContentName参数提供一个值作为快照的来源。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: snapshot-demo
spec:
source:
volumeSnapshotContentName: mycontent (1)
| 1 | 对于预配的快照,volumeSnapshotContentName参数是必需的。 |
通过输入以下命令来创建您在上一步中保存的对象:
$ oc create -f volumesnapshot-manual.yaml
在集群中创建快照后,可以查看有关快照的其他详细信息。
要显示有关已创建的卷快照的详细信息,请输入以下命令:
$ oc describe volumesnapshot mysnap
以下示例显示有关mysnap卷快照的详细信息:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: mysnap
spec:
source:
persistentVolumeClaimName: myclaim
volumeSnapshotClassName: csi-hostpath-snap
status:
boundVolumeSnapshotContentName: snapcontent-1af4989e-a365-4286-96f8-d5dcd65d78d6 (1)
creationTime: "2020-01-29T12:24:30Z" (2)
readyToUse: true (3)
restoreSize: 500Mi
| 1 | 控制器创建的实际存储内容的指针。 |
| 2 | 创建快照的时间。快照包含在此时间可用的卷内容。 |
| 3 | 如果值为true,则可以使用快照还原为新的 PVC。如果值为 false,则已创建快照。但是,存储后端需要执行其他任务才能使快照可用,以便可以将其还原为新卷。例如,Amazon Elastic Block Store 数据可能会移动到不同的、成本较低的位置,这可能需要几分钟的时间。 |
要验证是否已创建卷快照,请输入以下命令:
$ oc get volumesnapshotcontent
将显示指向实际内容的指针。如果boundVolumeSnapshotContentName字段已填充,则存在VolumeSnapshotContent对象并且已创建快照。
要验证快照是否已准备就绪,请确认VolumeSnapshot对象的readyToUse: true。
您可以配置 OpenShift Container Platform 如何删除卷快照。
在VolumeSnapshotClass对象中指定所需的删除策略,如下例所示:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-hostpath-snap
driver: hostpath.csi.k8s.io
deletionPolicy: Delete (1)
| 1 | 删除卷快照时,如果设置了Delete值,则底层快照将与VolumeSnapshotContent对象一起删除。如果设置了Retain值,则底层快照和VolumeSnapshotContent对象都将保留。如果设置了 Retain值,并且删除了VolumeSnapshot对象而没有删除相应的VolumeSnapshotContent对象,则内容将保留。快照本身也保留在存储后端。 |
输入以下命令删除卷快照
$ oc delete volumesnapshot <volumesnapshot_name>
volumesnapshot.snapshot.storage.k8s.io "mysnapshot" deleted
如果删除策略设置为Retain,则输入以下命令删除卷快照内容
$ oc delete volumesnapshotcontent <volumesnapshotcontent_name>
可选:如果VolumeSnapshot对象未成功删除,请输入以下命令删除剩余资源的任何最终器,以便删除操作可以继续
|
只有在确信持久卷声明或卷快照内容中没有对 |
$ oc patch -n $PROJECT volumesnapshot/$NAME --type=merge -p '{"metadata": {"finalizers":null}}'
volumesnapshotclass.snapshot.storage.k8s.io "csi-ocs-rbd-snapclass" deleted
最终器已删除,卷快照已删除。
VolumeSnapshot CRD 内容可用于将现有卷恢复到以前的状态。
在您的VolumeSnapshot CRD 绑定并且readyToUse值设置为true之后,您可以使用该资源配置一个预先填充了快照数据的新卷。
登录到正在运行的 OpenShift Container Platform 集群。
使用支持卷快照的容器存储接口 (CSI) 驱动程序创建的持久卷声明 (PVC)。
用于预配存储后端的存储类。
卷快照已创建并可以使用。
如以下所示,在 PVC 上指定VolumeSnapshot数据源
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim-restore
spec:
storageClassName: csi-hostpath-sc
dataSource:
name: mysnap (1)
kind: VolumeSnapshot (2)
apiGroup: snapshot.storage.k8s.io (3)
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
| 1 | 表示要作为源使用的快照的VolumeSnapshot对象的名称。 |
| 2 | 必须设置为VolumeSnapshot值。 |
| 3 | 必须设置为snapshot.storage.k8s.io值。 |
输入以下命令创建 PVC
$ oc create -f pvc-restore.yaml
输入以下命令验证已创建恢复的 PVC
$ oc get pvc
将显示新的 PVC,例如myclaim-restore。
vSphere 容器存储接口 (CSI) 中每个卷的默认最大快照数为 3。您可以将每个卷的最大数量更改为最多 32 个。
但是,请注意,增加快照最大值会涉及性能权衡,因此为了获得更好的性能,每个卷只使用 2 到 3 个快照。
有关 VMware 快照性能的更多建议,请参阅其他资源。
具有管理员权限的集群访问权限。
通过运行以下命令检查当前的配置映射
$ oc -n openshift-cluster-csi-drivers get cm/vsphere-csi-config -o yaml
apiVersion: v1
data:
cloud.conf: |+
# Labels with topology values are added dynamically via operator
[Global]
cluster-id = vsphere-01-cwv8p
[VirtualCenter "vcenter.openshift.com"]
insecure-flag = true
datacenters = DEVQEdatacenter
migration-datastore-url = ds:///vmfs/volumes/vsan:527320283a8c3163-2faa6dc5949a3a28/
kind: ConfigMap
metadata:
creationTimestamp: "2024-03-06T09:46:40Z"
name: vsphere-csi-config
namespace: openshift-cluster-csi-drivers
resourceVersion: "126687"
在此示例中,未配置全局最大快照数,因此应用默认值 3。
运行以下命令更改快照限制
设置全局快照限制
$ oc patch clustercsidriver/csi.vsphere.vmware.com --type=merge -p '{"spec":{"driverConfig":{"vSphere":{"globalMaxSnapshotsPerBlockVolume": 10}}}}'
clustercsidriver.operator.openshift.io/csi.vsphere.vmware.com patched
在此示例中,全局限制将更改为 10(globalMaxSnapshotsPerBlockVolume设置为 10)。
设置虚拟卷快照限制
此参数仅设置虚拟卷数据存储的限制。如果设置了虚拟卷最大快照限制,则会覆盖全局约束,但如果未设置,则默认为全局限制。
$ oc patch clustercsidriver/csi.vsphere.vmware.com --type=merge -p '{"spec":{"driverConfig":{"vSphere":{"granularMaxSnapshotsPerBlockVolumeInVVOL": 5}}}}'
clustercsidriver.operator.openshift.io/csi.vsphere.vmware.com patched
在此示例中,虚拟卷限制将更改为 5(granularMaxSnapshotsPerBlockVolumeInVVOL设置为 5)。
设置vSAN快照限制
此参数仅设置 vSAN 数据存储的限制。如果设置了 vSAN 最大快照限制,则会覆盖全局约束,但如果未设置,则默认为全局限制。在 vSAN ESA 设置下,您可以设置最大值为 32。
$ oc patch clustercsidriver/csi.vsphere.vmware.com --type=merge -p '{"spec":{"driverConfig":{"vSphere":{"granularMaxSnapshotsPerBlockVolumeInVSAN": 7}}}}'
clustercsidriver.operator.openshift.io/csi.vsphere.vmware.com patched
在此示例中,vSAN 限制将更改为 7(granularMaxSnapshotsPerBlockVolumeInVSAN设置为 7)。
通过运行以下命令验证您所做的任何更改是否已反映在配置映射中
$ oc -n openshift-cluster-csi-drivers get cm/vsphere-csi-config -o yaml
apiVersion: v1
data:
cloud.conf: |+
# Labels with topology values are added dynamically via operator
[Global]
cluster-id = vsphere-01-cwv8p
[VirtualCenter "vcenter.openshift.com"]
insecure-flag = true
datacenters = DEVQEdatacenter
migration-datastore-url = ds:///vmfs/volumes/vsan:527320283a8c3163-2faa6dc5949a3a28/
[Snapshot]
global-max-snapshots-per-block-volume = 10 (1)
kind: ConfigMap
metadata:
creationTimestamp: "2024-03-06T09:46:40Z"
name: vsphere-csi-config
namespace: openshift-cluster-csi-drivers
resourceVersion: "127118"
uid: f6968303-81d8-4048-99c1-d8211363d0fa
| 1 | global-max-snapshots-per-block-volume现在设置为 10。 |