7.3. 关于卷快照
您可以将卷快照与逻辑卷管理器(LVM)精简卷一起使用,以帮助防止在 MicroShift 集群中运行的应用程序丢失数据。MicroShift 只支持逻辑卷管理器存储(LVMS)容器存储接口(CSI)供应商。
LVMS 只支持将存储类的 volumeBindingMode
设置为 WaitForFirstConsumer
。此设置意味着在 pod 准备好挂载它前不会置备存储卷。
部署单个 pod 和 PVC 的工作负载示例
$ oc apply -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-claim-thin spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: topolvm-provisioner-thin --- apiVersion: v1 kind: Pod metadata: name: base spec: containers: - command: - nginx - -g - 'daemon off;' image: registry.redhat.io/rhel8/nginx-122@sha256:908ebb0dec0d669caaf4145a8a21e04fdf9ebffbba5fd4562ce5ab388bf41ab2 name: test-container securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL volumeMounts: - mountPath: /vol name: test-vol securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault volumes: - name: test-vol persistentVolumeClaim: claimName: test-claim-thin EOF
7.3.1. 创建卷快照
要为 MicroShift 存储卷创建快照,您必须首先配置 RHEL for Edge 和集群。在以下示例中,源卷被挂载到的 pod 已被删除。删除 pod 可防止在快照创建过程中写入数据。确保在快照期间不会写入任何数据,这对创建可行的快照至关重要。
先决条件
- 用户对 MicroShift 集群具有 root 访问权限。
- MicroShift 集群正在运行。
- 设备类定义 LVM 精简池。
-
volumeSnapshotClass
指定driver: topolvm.io
。 - 附加到源 PVC 的任何工作负载都会暂停或删除。这有助于避免数据崩溃。
在创建快照时,必须停止对卷的所有写入。如果没有停止写入,您的数据可能会损坏。
流程
使用以下步骤之一防止数据在快照期间写入卷:
运行以下命令,删除 pod 以确保在快照过程中不会写入卷:
$ oc delete my-pod
- 在使用复制控制器管理的 pod 上将副本数扩展到零。将 count 设为零可防止在删除新 pod 时立即创建新 pod。
在对卷的所有写入都停止后,运行类似于下例的命令。插入您自己的配置详情。
快照配置示例
# oc apply -f <<EOF apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot 1 metadata: name: <snapshot_name> 2 spec: volumeSnapshotClassName: topolvm-snapclass 3 source: persistentVolumeClaimName: test-claim-thin 4 EOF
运行以下命令,等待存储驱动程序完成创建快照:
$ oc wait volumesnapshot/<snapshot_name> --for=jsonpath\='{.status.readyToUse}=true'
后续步骤
-
当
volumeSnapshot
对象处于ReadyToUse
状态时,您可以将其恢复为将来 PVC 的卷。重启 pod 或将副本数向上扩展到所需的数量。 - 创建卷快照后,您可以将源 PVC 重新挂载为新 pod。
卷快照位于与原始数据相同的设备上。要将卷快照用作备份,请将快照移到安全位置。
7.3.2. 备份卷快照
在 MicroShift 集群上运行的应用程序的数据快照作为只读逻辑卷(LV)创建,位于与原始数据相同的设备上。在复制为持久性卷(PV)并用作备份副本前,您必须手动挂载本地卷。要使用 MicroShift 存储卷的快照作为备份,请在本地主机中找到它,然后将其移到安全位置。
要查找特定的快照并复制它们,请使用以下步骤。
先决条件
- 有对主机的 root 访问权限。
- 您有一个现有的卷快照。
流程
运行以下命令,获取卷快照的名称:
$ oc get volumesnapshot -n <namespace> <snapshot_name> -o 'jsonpath={.status.volumeSnapshotContentName}'
使用以下命令在存储后端上创建的卷的唯一身份,并插入上一步中获取的名称:
$ oc get volumesnapshotcontent snapcontent-<retrieved_volume_identity> -o 'jsonpath={.status.snapshotHandle}'
运行以下命令,使用您在上一步中获得的卷的唯一身份显示快照:
$ sudo lvdisplay <retrieved_snapshot_handle>
输出示例
--- Logical volume --- LV Path /dev/rhel/732e45ff-f220-49ce-859e-87ccca26b14c LV Name 732e45ff-f220-49ce-859e-87ccca26b14c VG Name rhel LV UUID 6Ojwc0-YTfp-nKJ3-F9FO-PvMR-Ic7b-LzNGSx LV Write Access read only LV Creation host, time rhel-92.lab.local, 2023-08-07 14:45:26 -0500 LV Pool name thinpool LV Thin origin name a2d2dcdc-747e-4572-8c83-56cd873d3b07 LV Status available # open 0 LV Size 1.00 GiB Mapped size 1.04% Current LE 256 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:11
运行以下命令,创建一个用于挂载 LV 的目录:
$ sudo mkdir /mnt/snapshot
运行以下命令,使用检索的快照句柄的设备名称挂载 LV:
$ sudo mount /dev/<retrieved_snapshot_handle> /mnt/snapshot
运行以下命令,从挂载的位置复制文件并将其存储在安全位置:
$ sudo cp -r /mnt/snapshot <destination>
7.3.3. 恢复卷快照
以下工作流演示了快照恢复。在本例中,还提供了验证步骤,以确保写入源持久性卷声明(PVC)的数据被保留并在新的 PVC 上恢复。
快照必须恢复到与快照的源卷相同的 PVC。如果需要更大的 PVC,您可以在成功恢复快照后重新定义 PVC 的大小。
流程
输入以下命令将
VolumeSnapshot
对象指定为持久性卷声明中的数据源来恢复快照:$ oc apply -f <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: snapshot-restore spec: accessModes: - ReadWriteOnce dataSource: apiGroup: snapshot.storage.k8s.io kind: VolumeSnapshot name: my-snap resources: requests: storage: 1Gi storageClassName: topolvm-provisioner-thin --- apiVersion: v1 kind: Pod metadata: name: base spec: containers: - command: - nginx - -g - 'daemon off;' image: registry.redhat.io/rhel8/nginx-122@sha256:908ebb0dec0d669caaf4145a8a21e04fdf9ebffbba5fd4562ce5ab388bf41ab2 name: test-container securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL volumeMounts: - mountPath: /vol name: test-vol securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault volumes: - name: test-vol persistentVolumeClaim: claimName: snapshot-restore EOF
验证
等待 pod 进入
Ready
状态:$ oc wait --for=condition=Ready pod/base
- 当新 pod 就绪时,验证来自应用程序的数据是否正确。
其他资源
7.3.4. 删除卷快照
您可以配置 MicroShift 如何删除卷快照。
流程
指定
VolumeSnapshotClass
对象中所需的删除策略,如下例所示:volumesnapshotclass.yaml
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
值,且在不删除对应的VolumeSnapshotContent
对象的情况下删除了VolumeSnapshot
对象,则内容会保留。快照本身也保留在存储后端中。
输入以下命令删除卷快照:
$ oc delete volumesnapshot <volumesnapshot_name>
输出示例
volumesnapshot.snapshot.storage.k8s.io "mysnapshot" deleted
如果删除策略被设置为
Retain
,请输入以下命令删除卷快照内容:$ oc delete volumesnapshotcontent <volumesnapshotcontent_name>
可选:如果
VolumeSnapshot
对象没有成功删除,请输入以下命令删除左侧资源的所有终结程序,以便删除操作可以继续进行:重要如果您确信不存在来自持久性卷声明或卷快照内容到
VolumeSnapshot
对象的引用时,才删除终结器。即使使用了--force
选项,在删除所有终结器前,删除操作也不会删除快照对象。$ oc patch -n $PROJECT volumesnapshot/$NAME --type=merge -p '{"metadata": {"finalizers":null}}'
输出示例
volumesnapshotclass.snapshot.storage.k8s.io "csi-ocs-rbd-snapclass" deleted
删除终结器并删除卷快照。