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。 |