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 的任何工作负载都会暂停或删除。这有助于避免数据崩溃。
重要

在创建快照时,必须停止对卷的所有写入。如果没有停止写入,您的数据可能会损坏。

流程

  1. 使用以下步骤之一防止数据在快照期间写入卷:

    1. 运行以下命令,删除 pod 以确保在快照过程中不会写入卷:

      $ oc delete my-pod
    2. 在使用复制控制器管理的 pod 上将副本数扩展到零。将 count 设为零可防止在删除新 pod 时立即创建新 pod。
  2. 在对卷的所有写入都停止后,运行类似于下例的命令。插入您自己的配置详情。

    快照配置示例

    # 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

    1
    创建 VolumeSnapshot 对象。
    2
    您为快照指定的名称。
    3
    指定 VolumeSnapshotClass 对象所需的名称。
    4
    指定 persistentVolumeClaimNamevolumeSnapshotContentName。在本例中,从名为 test-claim-thin 的 PVC 创建快照。
  3. 运行以下命令,等待存储驱动程序完成创建快照:

    $ oc wait volumesnapshot/<snapshot_name> --for=jsonpath\='{.status.readyToUse}=true'

后续步骤

  1. volumeSnapshot 对象处于 ReadyToUse 状态时,您可以将其恢复为将来 PVC 的卷。重启 pod 或将副本数向上扩展到所需的数量。
  2. 创建卷快照后,您可以将源 PVC 重新挂载为新 pod。
重要

卷快照位于与原始数据相同的设备上。要将卷快照用作备份,请将快照移到安全位置。

7.3.2. 备份卷快照

在 MicroShift 集群上运行的应用程序的数据快照作为只读逻辑卷(LV)创建,位于与原始数据相同的设备上。在复制为持久性卷(PV)并用作备份副本前,您必须手动挂载本地卷。要使用 MicroShift 存储卷的快照作为备份,请在本地主机中找到它,然后将其移到安全位置。

要查找特定的快照并复制它们,请使用以下步骤。

先决条件

  • 有对主机的 root 访问权限。
  • 您有一个现有的卷快照。

流程

  1. 运行以下命令,获取卷快照的名称:

    $ oc get volumesnapshot -n <namespace> <snapshot_name> -o 'jsonpath={.status.volumeSnapshotContentName}'
  2. 使用以下命令在存储后端上创建的卷的唯一身份,并插入上一步中获取的名称:

    $ oc get volumesnapshotcontent snapcontent-<retrieved_volume_identity> -o 'jsonpath={.status.snapshotHandle}'
  3. 运行以下命令,使用您在上一步中获得的卷的唯一身份显示快照:

    $ 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

  4. 运行以下命令,创建一个用于挂载 LV 的目录:

    $ sudo mkdir /mnt/snapshot
  5. 运行以下命令,使用检索的快照句柄的设备名称挂载 LV:

    $ sudo mount /dev/<retrieved_snapshot_handle> /mnt/snapshot
  6. 运行以下命令,从挂载的位置复制文件并将其存储在安全位置:

    $ sudo cp -r /mnt/snapshot <destination>

7.3.3. 恢复卷快照

以下工作流演示了快照恢复。在本例中,还提供了验证步骤,以确保写入源持久性卷声明(PVC)的数据被保留并在新的 PVC 上恢复。

重要

快照必须恢复到与快照的源卷相同的 PVC。如果需要更大的 PVC,您可以在成功恢复快照后重新定义 PVC 的大小。

流程

  1. 输入以下命令将 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

验证

  1. 等待 pod 进入 Ready 状态:

    $ oc wait --for=condition=Ready pod/base
  2. 当新 pod 就绪时,验证来自应用程序的数据是否正确。

其他资源

7.3.4. 删除卷快照

您可以配置 MicroShift 如何删除卷快照。

流程

  1. 指定 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 对象,则内容会保留。快照本身也保留在存储后端中。
  2. 输入以下命令删除卷快照:

    $ oc delete volumesnapshot <volumesnapshot_name>

    输出示例

    volumesnapshot.snapshot.storage.k8s.io "mysnapshot" deleted

  3. 如果删除策略被设置为 Retain,请输入以下命令删除卷快照内容:

    $ oc delete volumesnapshotcontent <volumesnapshotcontent_name>
  4. 可选:如果 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

    删除终结器并删除卷快照。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.