4.4. 备份和恢复

4.4.1. 备份应用程序

您可以通过创建一个 Backup 自定义资源 (CR) 来备份应用程序。请参阅创建备份 CR

Backup CR 为 Kubernetes 资源和内部镜像(S3 对象存储)和持久性卷(PV)创建备份文件,如果云供应商使用原生快照 API 或 Container Storage Interface (CSI) 来创建快照,如 OpenShift Data Foundation 4。

有关 CSI 卷快照的更多信息,请参阅 CSI 卷快照

重要

S3 存储的 CloudStorage API 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

  • 如果您的云供应商有原生快照 API 或支持 CSI 快照,则 Backup CR 通过创建快照来备份持久性卷 (PV)。有关使用 CSI 快照的更多信息,请参阅使用 CSI 快照备份持久性卷
  • 如果您的云供应商不支持快照,或者应用程序位于 NFS 数据卷中,您可以使用 Restic 创建备份。请参阅使用 Restic 备份应用程序
重要

OpenShift API for Data Protection (OADP) 不支持对由其他软件创建的卷快照进行备份。

您可以创建备份 hook,以便在备份操作之前或之后运行命令。请参阅创建备份 hook

您可以通过创建一个 Schedule CR 而不是 Backup CR 来调度备份。请参阅调度备份

4.4.1.1. 创建备份 CR

您可以通过创建 Backup 备份自定义资源(CR)来备份 Kubernetes 镜像、内部镜像和持久性卷(PV)。

先决条件

  • 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
  • DataProtectionApplication CR 必须处于 Ready 状态。
  • 备份位置先决条件:

    • 您必须为 Velero 配置 S3 对象存储。
    • 您必须在 DataProtectionApplication CR 中配置了一个备份位置。
  • 快照位置先决条件:

    • 您的云供应商必须具有原生快照 API 或支持 Container Storage Interface(CSI)快照。
    • 对于 CSI 快照,您必须创建一个 VolumeSnapshotClass CR 来注册 CSI 驱动程序。
    • 您必须在 DataProtectionApplication CR 中配置了一个卷位置。

流程

  1. 输入以下命令来检索 backupStorageLocations CR:

    $ oc get backupStorageLocations -n openshift-adp

    输出示例

    NAMESPACE       NAME              PHASE       LAST VALIDATED   AGE   DEFAULT
    openshift-adp   velero-sample-1   Available   11s              31m

  2. 创建一个 Backup CR,如下例所示:

    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: <backup>
      labels:
        velero.io/storage-location: default
      namespace: openshift-adp
    spec:
      hooks: {}
      includedNamespaces:
      - <namespace> 1
      includedResources: [] 2
      excludedResources: [] 3
      storageLocation: <velero-sample-1> 4
      ttl: 720h0m0s
      labelSelector: 5
        matchLabels:
          app=<label_1>
          app=<label_2>
          app=<label_3>
      orLabelSelectors: 6
      - matchLabels:
          app=<label_1>
          app=<label_2>
          app=<label_3>
    1
    指定要备份的命名空间数组。
    2
    可选:指定一个要包含在备份中的资源的数组。资源可以是缩写方式(例如,'po' 代表 'pods')或完全限定的方式。如果未指定,则会包含所有资源。
    3
    可选:指定要从备份中排除的资源数组。资源可以是缩写方式(例如,'po' 代表 'pods')或完全限定的方式。
    4
    指定 backupStorageLocations CR 的名称。
    5
    具有所有指定标签的备份资源的 {key,value} 对映射。
    6
    具有一个或多个指定标签的备份资源的 {key,value} 对映射。
  3. 验证 Backup CR 的状态是否为 Completed

    $ oc get backup -n openshift-adp <backup> -o jsonpath='{.status.phase}'

4.4.1.2. 使用 CSI 快照备份持久性卷

在创建 Backup CR 前,您可以编辑云存储的 VolumeSnapshotClass 自定义资源(CR)来备份持久性卷(CSI)快照。

先决条件

  • 云供应商必须支持 CSI 快照。
  • 您必须在 DataProtectionApplication CR 中启用 CSI。

流程

  • metadata.labels.velero.io/csi-volumesnapshot-class: "true" 键值对添加到 VolumeSnapshotClass CR:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: <volume_snapshot_class_name>
      labels:
        velero.io/csi-volumesnapshot-class: "true"
    driver: <csi_driver>
    deletionPolicy: Retain

现在,您可以创建一个 Backup CR。

4.4.1.3. 使用 Restic 备份应用程序

您可以通过编辑备份自定义资源(CR)来使用 Restic Backup 资源、内部镜像和持久性卷备份 Kubernetes 资源。

您不需要在 DataProtectionApplication CR 中指定快照位置。

重要

Restic 不支持备份 hostPath 卷。如需更多信息,请参阅其他 Restic 限制

先决条件

  • 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
  • 您不能将 DataProtectionApplication CR 中的 spec.configuration.restic.enable 设置为 false 来禁用默认的 Restic 安装。
  • DataProtectionApplication CR 必须处于 Ready 状态。

流程

  • 编辑 Backup CR,如下例所示:

    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: <backup>
      labels:
        velero.io/storage-location: default
      namespace: openshift-adp
    spec:
      defaultVolumesToRestic: true 1
    ...
    1
    defaultVolumesToRestic: true 添加到 spec 块中。

4.4.1.4. 对 CSI 快照使用 Data Mover

OADP Data Mover 可让客户将 Container Storage Interface (CSI) 卷快照备份到远程对象存储。

启用 Data Mover 时,如果出现故障、意外删除或集群崩溃,您可以使用从对象存储中提取的 CSI 卷快照来恢复有状态的应用程序。

Data Mover 解决方案使用 VolSync 的 Restic 选项。

数据 Mover 支持 CSI 卷快照的备份和恢复。

在 OADP 1.2 Data Mover 中,VolumeSnapshotBackups (VSBs) 和 VolumeSnapshotRestores (VSR) 使用 VolumeSnapshotMover (VSM) 排队。通过指定 VSB 和 VSR 同时处于 InProgress 的并发数量,可以提高 VSM 的性能。在所有异步插件操作都完成后,备份将标记为完成。

注意

OADP 1.1 Data Mover 是一个技术预览功能。

OADP 1.2 Data Mover 显著提高了特性和性能,但它现在还仅是一个技术预览功能。

重要

OADP Data Mover 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

注意

红帽建议使用 OADP 1.2 Data Mover 来备份和恢复 ODF CephFS 卷,升级或安装 OpenShift Container Platform 版本 4.12 或更高版本以提高性能。OADP Data Mover 可以利用 OpenShift Container Platform 版本 4.12 或更高版本中的 CephFS shouldow 卷,基于我们的测试,这可以提高备份时间的性能。

先决条件

  • 已确认 StorageClassVolumeSnapshotClass 自定义资源 (CR) 支持 CSI。
  • 您已确认只有一个 volumeSnapshotClass CR 带有注解 snapshot.storage.kubernetes.io/is-default-class: true

    注意

    在 OpenShift Container Platform 版本 4.12 或更高版本中,验证这是唯一的默认 volumeSnapshotClass

  • 您已确认 VolumeSnapshotClass CR 的 deletionPolicy 被设置为 Retain
  • 已确认只有一个 storageClass CR 带有注解 storageclass.kubernetes.io/is-default-class: true
  • 您已在 VolumeSnapshotClass CR 中包含标签 velero.io/csi-volumesnapshot-class: 'true'
  • 您已确认 OADP 命名空间具有 oc annotate --overwrite namespace/openshift-adp volsync.backube/privileged-movers='true' 注解。

    注意

    在 OADP 1.1 中,上述设置是必须的。

    在 OADP 1.2 中,多数情况下不需要 privileged-movers 设置。恢复容器权限应该足以满足 Volsync 副本。在某些用户场景中,可能会有权限错误,privileged-mover= true 设置应被解析。

  • 已使用 Operator Lifecycle Manager (OLM) 安装 VolSync Operator。

    注意

    使用 OADP Data Mover 需要 VolSync Operator。

  • 已使用 OLM 安装 OADP operator。

流程

  1. 通过创建 .yaml 文件来配置 Restic secret:

    apiVersion: v1
    kind: Secret
    metadata:
      name: <secret_name>
    type: Opaque
    stringData:
    # The repository encryption key
      RESTIC_PASSWORD: my-secure-restic-password
  2. 创建类似以下示例的 DPA CR。默认插件包括 CSI。
  3. 将上面的步骤中的 restic secret 名称添加到 DPA CR 中,作为 spec.features.dataMover.credentialName。如果未完成此步骤,则默认为 secret 名称 dm-credential

    注意

    在这个 DPA 中,CSIVSM 作为 defaultPlugins 包含在内。同时也包括了 dataMover.enable 标志。

    数据保护应用程序 (DPA) CR 示例

    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
      name: velero-sample
      namespace: openshift-adp
    spec:
      features:
        dataMover:
          enable: true
          credentialName: <secret-name>
          maxConcurrentBackupVolumes: "3" 1
          maxConcurrentRestoreVolumes: "3" 2
          pruneInterval: "14" 3
          volumeOptionsForStorageClasses: 4
            gp2-csi-copy-1:
              destinationVolumeOptions:
                storageClassName: csi-copy-2
              sourceVolumeOptions:
                storageClassName: csi-copy-1
      backupLocations:
        - velero:
            config:
              profile: default
              region: us-east-1
            credential:
              key: cloud
              name: cloud-credentials
            default: true
            objectStorage:
              bucket: <bucket_name>
              prefix: <bucket-prefix>
            provider: aws
      configuration:
        restic:
          enable: false
        velero:
          defaultPlugins:
            - openshift
            - aws
            - csi
            - vsm 5

    1
    仅限 OADP 1.2。可选:指定允许排队进行备份的快照数量的上限。默认值为 10。
    2
    仅限 OADP 1.2。可选:指定允许排队进行恢复的快照数量的上限。默认值为 10。
    3
    仅限 OADP 1.2。可选:指定存储库上运行的 Restic 修剪之间的天数。修剪操作会重新打包数据以释放可用的空间,但在操作过程中也会生成大量的 I/O 流量。设置此选项可在存储性能和使用成本间进行权衡。
    4
    仅限 OADP 1.2。可选:指定用于备份和恢复的 VolumeSync 卷选项。
    5
    仅限 OADP 1.2。

    OADP Operator 安装两个自定义资源定义 (CRD)、VolumeSnapshotBackupVolumeSnapshotRestore

    VolumeSnapshotBackup CRD 示例

    apiVersion: datamover.oadp.openshift.io/v1alpha1
    kind: VolumeSnapshotBackup
    metadata:
      name: <vsb_name>
      namespace: <namespace_name> 1
    spec:
      volumeSnapshotContent:
        name: <snapcontent_name>
      protectedNamespace: <adp_namespace>
      resticSecretRef:
        name: <restic_secret_name>

    1
    指定卷快照所在的命名空间。

    VolumeSnapshotRestore CRD 示例

    apiVersion: datamover.oadp.openshift.io/v1alpha1
    kind: VolumeSnapshotRestore
    metadata:
      name: <vsr_name>
      namespace: <namespace_name> 1
    spec:
      protectedNamespace: <protected_ns> 2
      resticSecretRef:
        name: <restic_secret_name>
      volumeSnapshotMoverBackupRef:
        sourcePVCData:
          name: <source_pvc_name>
          size: <source_pvc_size>
        resticrepository: <your_restic_repo>
        volumeSnapshotClassName: <vsclass_name>

    1
    指定卷快照所在的命名空间。
    2
    指定安装 Operator 的命名空间。默认值为 openshift-adp
  4. 您可以执行以下步骤备份卷快照:

    1. 创建备份 CR:

      apiVersion: velero.io/v1
      kind: Backup
      metadata:
        name: <backup_name>
        namespace: <protected_ns> 1
      spec:
        includedNamespaces:
        - <app_ns>
        storageLocation: velero-sample-1
      1
      指定安装 Operator 的命名空间。默认命名空间是 openshift-adp
    2. 等待 10 分钟,并输入以下命令来检查 VolumeSnapshotBackup CR 状态是否为 Completed

      $ oc get vsb -n <app_ns>
      $ oc get vsb <vsb_name> -n <app_ns> -o jsonpath="{.status.phase}"

      在对象存储中创建快照是在 DPA 中配置。

      注意

      如果 VolumeSnapshotBackup CR 的状态变为 Failed,请参阅 Velero 日志进行故障排除。

  5. 您可以执行以下步骤来恢复卷快照:

    1. 删除由 Velero CSI 插件创建的 application 命名空间和 volumeSnapshotContent
    2. 创建 Restore CR,并将 restorePV 设置为 true

      Restore CR 示例

      apiVersion: velero.io/v1
      kind: Restore
      metadata:
        name: <restore_name>
        namespace: <protected_ns>
      spec:
        backupName: <previous_backup_name>
        restorePVs: true

    3. 等待 10 分钟,并通过输入以下命令来检查 VolumeSnapshotRestore CR 状态是否为 Completed

      $ oc get vsr -n <app_ns>
      $ oc get vsr <vsr_name> -n <app_ns> -o jsonpath="{.status.phase}"
    4. 检查您的应用程序数据和资源是否已恢复。

      注意

      如果 VolumeSnapshotRestore CR 的状态变成 'Failed',请参阅 Velero 日志进行故障排除。

4.4.1.5. 使用带有 Ceph 存储的 OADP 1.2 Data Mover

您可以使用 OADP 1.2 Data Mover,为使用 CephFS、CephRBD 或这两者的集群备份和恢复应用程序数据。

OADP 1.2 Data Mover 会利用支持大规模环境的 Ceph 功能。其中之一是 shallow copy 方法,可用于 OpenShift Container Platform 4.12 及更新的版本。此功能支持备份和恢复源持久性卷声明 (PVC) 上找到的 StorageClassAccessMode 资源。

重要

CephFS shallow copy 是一个备份功能。它不是恢复操作的一部分。

4.4.1.5.1. 在 Ceph 存储中使用 OADP 1.2 Data Mover 的先决条件

以下先决条件适用于在使用 Ceph 存储的集群中通过 OpenShift API for Data Protection (OADP) 1.2 Data Mover 进行数据备份和恢复的操作:

  • 已安装 OpenShift Container Platform 4.12 或更高版本。
  • 已安装 OADP Operator。
  • 您已在命名空间 openshift-adp 中创建了 secret cloud-credentials
  • 已安装 Red Hat OpenShift Data Foundation。
  • 已使用 Operator Lifecycle Manager 安装最新的 VolSync Operator。
4.4.1.5.2. 定义用于 OADP 1.2 Data Mover 的自定义资源

安装 Red Hat OpenShift Data Foundation 时,它会自动创建默认的 CephFS 和 CephRBD StorageClassVolumeSnapshotClass 自定义资源 (CR)。您必须定义这些 CR 以用于 OpenShift API for Data Protection (OADP) 1.2 Data Mover。

定义 CR 后,您必须对环境进行一些其他更改,然后才能执行备份和恢复操作。

4.4.1.5.3. 定义 CephFS 自定义资源以用于 OADP 1.2 Data Mover

安装 Red Hat OpenShift Data Foundation 时,它会自动创建默认的 CephFS StorageClass 自定义资源 (CR) 和默认的 CephFS VolumeSnapshotClass CR。您可以定义这些 CR 以用于 OpenShift API for Data Protection (OADP) 1.2 Data Mover。

流程

  1. 定义 VolumeSnapshotClass CR,如下例所示:

    Example VolumeSnapshotClass CR

    apiVersion: snapshot.storage.k8s.io/v1
    deletionPolicy: Retain 1
    driver: openshift-storage.cephfs.csi.ceph.com
    kind: VolumeSnapshotClass
    metadata:
      annotations:
        snapshot.storage.kubernetes.io/is-default-class: true 2
      labels:
        velero.io/csi-volumesnapshot-class: true 3
      name: ocs-storagecluster-cephfsplugin-snapclass
    parameters:
      clusterID: openshift-storage
      csi.storage.k8s.io/snapshotter-secret-name: rook-csi-cephfs-provisioner
      csi.storage.k8s.io/snapshotter-secret-namespace: openshift-storage

    1
    必须设置为 Retain
    2
    必须设置为 true
    3
    必须设置为 true
  2. 定义 StorageClass CR,如下例所示:

    StorageClass CR 示例

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: ocs-storagecluster-cephfs
      annotations:
        description: Provides RWO and RWX Filesystem volumes
        storageclass.kubernetes.io/is-default-class: true 1
    provisioner: openshift-storage.cephfs.csi.ceph.com
    parameters:
      clusterID: openshift-storage
      csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
      csi.storage.k8s.io/controller-expand-secret-namespace: openshift-storage
      csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
      csi.storage.k8s.io/node-stage-secret-namespace: openshift-storage
      csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
      csi.storage.k8s.io/provisioner-secret-namespace: openshift-storage
      fsName: ocs-storagecluster-cephfilesystem
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    volumeBindingMode: Immediate

    1
    必须设置为 true
4.4.1.5.4. 定义 CephRBD 自定义资源以用于 OADP 1.2 Data Mover

安装 Red Hat OpenShift Data Foundation 时,它会自动创建默认的 CephRBD StorageClass 自定义资源 (CR) 和默认的 CephRBD VolumeSnapshotClass CR。您可以定义这些 CR 以用于 OpenShift API for Data Protection (OADP) 1.2 Data Mover。

流程

  1. 定义 VolumeSnapshotClass CR,如下例所示:

    Example VolumeSnapshotClass CR

    apiVersion: snapshot.storage.k8s.io/v1
    deletionPolicy: Retain 1
    driver: openshift-storage.rbd.csi.ceph.com
    kind: VolumeSnapshotClass
    metadata:
      labels:
        velero.io/csi-volumesnapshot-class: true 2
      name: ocs-storagecluster-rbdplugin-snapclass
    parameters:
      clusterID: openshift-storage
      csi.storage.k8s.io/snapshotter-secret-name: rook-csi-rbd-provisioner
      csi.storage.k8s.io/snapshotter-secret-namespace: openshift-storage

    1
    必须设置为 Retain
    2
    必须设置为 true
  2. 定义 StorageClass CR,如下例所示:

    StorageClass CR 示例

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: ocs-storagecluster-ceph-rbd
      annotations:
        description: 'Provides RWO Filesystem volumes, and RWO and RWX Block volumes'
    provisioner: openshift-storage.rbd.csi.ceph.com
    parameters:
      csi.storage.k8s.io/fstype: ext4
      csi.storage.k8s.io/provisioner-secret-namespace: openshift-storage
      csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
      csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
      csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
      imageFormat: '2'
      clusterID: openshift-storage
      imageFeatures: layering
      csi.storage.k8s.io/controller-expand-secret-namespace: openshift-storage
      pool: ocs-storagecluster-cephblockpool
      csi.storage.k8s.io/node-stage-secret-namespace: openshift-storage
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    volumeBindingMode: Immediate

4.4.1.5.5. 定义用于 OADP 1.2 Data Mover 的额外自定义资源

在重新定义默认 StorageClass 和 CephRBD VolumeSnapshotClass 自定义资源 (CR) 后,您必须创建以下 CR:

  • 定义为使用 shallow 复制功能的 CephFS StorageClass CR
  • Rustic Secret CR

流程

  1. 创建 CephFS StorageClass CR,并将 backingSnapshot 参数设置为 true,如下例所示:

    backingSnapshot 设置为 true 的 CephFS StorageClass CR 示例

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: ocs-storagecluster-cephfs-shallow
      annotations:
        description: Provides RWO and RWX Filesystem volumes
        storageclass.kubernetes.io/is-default-class: false
    provisioner: openshift-storage.cephfs.csi.ceph.com
    parameters:
      csi.storage.k8s.io/provisioner-secret-namespace: openshift-storage
      csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
      csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
      csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
      clusterID: openshift-storage
      fsName: ocs-storagecluster-cephfilesystem
      csi.storage.k8s.io/controller-expand-secret-namespace: openshift-storage
      backingSnapshot: true 1
      csi.storage.k8s.io/node-stage-secret-namespace: openshift-storage
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    volumeBindingMode: Immediate

    1
    必须设置为 true
    重要

    确保 CephFS VolumeSnapshotClassStorageClass CR 对 provisioner 有相同的值。

  2. 配置 Restic Secret CR,如下例所示:

    Restic Secret CR 示例

    apiVersion: v1
    kind: Secret
    metadata:
      name: <secret_name>
      namespace: <namespace>
    type: Opaque
    stringData:
      RESTIC_PASSWORD: <restic_password>

4.4.1.5.6. 使用 OADP 1.2 Data Mover 和 CephFS 存储备份和恢复数据

您可以通过启用 CephFS 的 shallow copy 功能,使用 OpenShift API for Data Protection (OADP) 1.2 Data Mover 来备份和恢复使用 CephFS 存储的数据。

先决条件

  • 有状态应用在单独的命名空间中运行,并将 CephFS 用作置备程序的持久性卷声明 (PVC)。
  • 为 CephFS 和 OADP 1.2 Data Mover 定义 StorageClassVolumeSnapshotClass 自定义资源 (CR)。
  • openshift-adp 命名空间中有一个 secret cloud-credentials
4.4.1.5.7. 创建用于 CephFS 存储的 DPA

在通过 OpenShift API for Data Protection (OADP) 1.2 Data Mover 来备份和存储使用 CephFS 存储的数据时,需要先创建一个 Data Protection Application (DPA) CR。

流程

  1. 运行以下命令,验证 VolumeSnapshotClass CR 的 deletionPolicy 字段是否已设置为 Retain

    $ oc get volumesnapshotclass -A  -o jsonpath='{range .items[*]}{"Name: "}{.metadata.name}{"  "}{"Retention Policy: "}{.deletionPolicy}{"\n"}{end}'
  2. 运行以下命令,验证 VolumeSnapshotClass CR 的标签是否已设置为 true

    $ oc get volumesnapshotclass -A  -o jsonpath='{range .items[*]}{"Name: "}{.metadata.name}{"  "}{"labels: "}{.metadata.labels}{"\n"}{end}'
  3. 运行以下命令,验证 StorageClass CR 的 storageclass.kubernetes.io/is-default-class 注解是否已设置为 true

    $ oc get storageClass -A  -o jsonpath='{range .items[*]}{"Name: "}{.metadata.name}{"  "}{"annotations: "}{.metadata.annotations}{"\n"}{end}'
  4. 创建一个类似以下示例的 Data Protection Application (DPA) CR:

    DPA CR 示例

    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
      name: velero-sample
      namespace: openshift-adp
    spec:
      backupLocations:
        - velero:
            config:
              profile: default
              region: us-east-1
            credential:
              key: cloud
              name: cloud-credentials
            default: true
            objectStorage:
              bucket: <my_bucket>
              prefix: velero
           provider: aws
        configuration:
          restic:
            enable: false  1
          velero:
            defaultPlugins:
              - openshift
              - aws
              - csi
              - vsm
        features:
          dataMover:
            credentialName: <restic_secret_name> 2
            enable: true 3
            volumeOptionsForStorageClasses:
              ocs-storagecluster-cephfs:
                sourceVolumeOptions:
                  accessMode: ReadOnlyMany
                  cacheAccessMode: ReadWriteMany
                  cacheStorageClassName: ocs-storagecluster-cephfs
                  storageClassName: ocs-storagecluster-cephfs-shallow

    1
    enable 字段没有默认值。有效值为 true 或者 false
    2
    使用您在准备环境时创建的 Restic Secret,以用于 OADP 1.2 Data Mover 和 Ceph。如果没有使用 Restic Secret,则 CR 会将默认值 dm-credential 用于此参数。
    3
    enable 字段没有默认值。有效值为 true 或者 false
4.4.1.5.8. 使用 OADP 1.2 Data Mover 和 CephFS 存储备份数据

您可以通过启用 CephFS 存储的 shallow copy 功能,使用 OpenShift API for Data Protection (OADP) 1.2 Data Mover 来备份使用 CephFS 存储的数据。

流程

  1. 如以下示例所示,创建一个 Backup CR:

    Backup CR 示例

    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: <backup_name>
      namespace: <protected_ns>
    spec:
      includedNamespaces:
      - <app_ns>
      storageLocation: velero-sample-1

  2. 通过完成以下步骤来监控 VolumeSnapshotBackup CR 的进度:

    1. 要检查所有 VolumeSnapshotBackup CR 的进度,请运行以下命令:

      $ oc get vsb -n <app_ns>
    2. 要检查特定 VolumeSnapshotBackup CR 的进度,请运行以下命令:

      $ oc get vsb <vsb_name> -n <app_ns> -ojsonpath="{.status.phase}`
  3. 等待几分钟,直到 VolumeSnapshotBackup CR 的状态为 Completed
  4. 验证 Restic Secret 中至少有一个快照在对象存储中提供。您可以在带有前缀 /<OADP_namespace> 的目标 BackupStorageLocation 存储供应商中检查这个快照。
4.4.1.5.9. 使用 OADP 1.2 Data Mover 和 CephFS 存储恢复数据

如果备份过程启用了 CephFS 存储的 shallow copy 功能,您可以使用 OpenShift API for Data Protection (OADP) 1.2 Data Mover 来恢复使用 CephFS 存储的数据。修剪复制功能没有在恢复过程中使用。

流程

  1. 运行以下命令来删除应用程序命名空间:

    $ oc delete vsb -n <app_namespace> --all
  2. 运行以下命令,删除在备份过程中创建的 VolumeSnapshotContent CR:

    $ oc delete volumesnapshotcontent --all
  3. 创建一个 Restore CR,如下例所示:

    Restore CR 示例

    apiVersion: velero.io/v1
    kind: Restore
    metadata:
      name: <restore_name>
      namespace: <protected_ns>
    spec:
      backupName: <previous_backup_name>

  4. 通过执行以下操作来监控 VolumeSnapshotRestore CR 的进度:

    1. 要检查所有 VolumeSnapshotRestore CR 的进度,请运行以下命令:

      $ oc get vsr -n <app_ns>
    2. 要检查特定 VolumeSnapshotRestore CR 的进度,请运行以下命令:

      $ oc get vsr <vsr_name> -n <app_ns> -ojsonpath="{.status.phase}
  5. 运行以下命令验证您的应用程序数据是否已恢复:

    $ oc get route <route_name> -n <app_ns> -ojsonpath="{.spec.host}"
4.4.1.5.10. 使用 OADP 1.2 Data Mover 和 split 卷 (CephFS 和 Ceph RBD) 备份和恢复数据

您可以使用 OpenShift API for Data Protection (OADP) 1.2 Data Mover 在具有 分割卷 的环境中备份和恢复数据,即使用 CephFS 和 CephRBD 的环境。

先决条件

  • 有状态应用在单独的命名空间中运行,并将 CephFS 用作置备程序的持久性卷声明 (PVC)。
  • 为 CephFS 和 OADP 1.2 Data Mover 定义 StorageClassVolumeSnapshotClass 自定义资源 (CR)。
  • openshift-adp 命名空间中有一个 secret cloud-credentials
4.4.1.5.11. 创建用于分割卷的 DPA

在使用 OpenShift API for Data Protection (OADP) 1.2 Data Mover 来使用分割卷来备份和恢复数据前,您必须创建一个数据保护应用程序 (DPA) CR。

流程

  • 创建一个数据保护应用程序 (DPA) CR,如下例所示:

    带有分割卷的环境的 DPA CR 示例

    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
      name: velero-sample
      namespace: openshift-adp
    spec:
      backupLocations:
        - velero:
            config:
              profile: default
              region: us-east-1
            credential:
              key: cloud
              name: cloud-credentials
            default: true
            objectStorage:
              bucket: <my-bucket>
              prefix: velero
            provider: aws
      configuration:
        restic:
          enable: false
        velero:
          defaultPlugins:
            - openshift
            - aws
            - csi
            - vsm
      features:
        dataMover:
          credentialName: <restic_secret_name> 1
          enable: true
          volumeOptionsForStorageClasses: 2
            ocs-storagecluster-cephfs:
              sourceVolumeOptions:
                accessMode: ReadOnlyMany
                cacheAccessMode: ReadWriteMany
                cacheStorageClassName: ocs-storagecluster-cephfs
                storageClassName: ocs-storagecluster-cephfs-shallow
            ocs-storagecluster-ceph-rbd:
              sourceVolumeOptions:
                storageClassName: ocs-storagecluster-ceph-rbd
                cacheStorageClassName: ocs-storagecluster-ceph-rbd
            destinationVolumeOptions:
                storageClassName: ocs-storagecluster-ceph-rbd
                cacheStorageClassName: ocs-storagecluster-ceph-rbd

    1
    使用您在准备环境时创建的 Restic Secret,以用于 OADP 1.2 Data Mover 和 Ceph。如果没有,则 CR 会将默认值 dm-credential 用于此参数。
    2
    可以为每个 storageClass 卷定义不同的 VolumeOptionsForStorageClass 标签,从而允许备份具有不同供应商的卷。
4.4.1.5.12. 使用 OADP 1.2 Data Mover 和 split 卷备份数据

您可以使用 OpenShift API 进行数据保护 (OADP) 1.2 Data Mover 在有分割卷的环境中备份数据。

流程

  1. 如以下示例所示,创建一个 Backup CR:

    Backup CR 示例

    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: <backup_name>
      namespace: <protected_ns>
    spec:
      includedNamespaces:
      - <app_ns>
      storageLocation: velero-sample-1

  2. 通过完成以下步骤来监控 VolumeSnapshotBackup CR 的进度:

    1. 要检查所有 VolumeSnapshotBackup CR 的进度,请运行以下命令:

      $ oc get vsb -n <app_ns>
    2. 要检查特定 VolumeSnapshotBackup CR 的进度,请运行以下命令:

      $ oc get vsb <vsb_name> -n <app_ns> -ojsonpath="{.status.phase}`
  3. 等待几分钟,直到 VolumeSnapshotBackup CR 的状态为 Completed
  4. 验证 Restic Secret 中至少有一个快照在对象存储中提供。您可以在带有前缀 /<OADP_namespace> 的目标 BackupStorageLocation 存储供应商中检查这个快照。
4.4.1.5.13. 使用 OADP 1.2 Data Mover 和 split 卷恢复数据

如果备份过程启用了 CephFS 存储的 shallow copy 功能,您可以使用 OpenShift API 进行数据保护 (OADP) 1.2 Data Mover 在带有分割卷的环境中恢复数据。修剪复制功能没有在恢复过程中使用。

流程

  1. 运行以下命令来删除应用程序命名空间:

    $ oc delete vsb -n <app_namespace> --all
  2. 运行以下命令,删除在备份过程中创建的 VolumeSnapshotContent CR:

    $ oc delete volumesnapshotcontent --all
  3. 创建一个 Restore CR,如下例所示:

    Restore CR 示例

    apiVersion: velero.io/v1
    kind: Restore
    metadata:
      name: <restore_name>
      namespace: <protected_ns>
    spec:
      backupName: <previous_backup_name>

  4. 通过执行以下操作来监控 VolumeSnapshotRestore CR 的进度:

    1. 要检查所有 VolumeSnapshotRestore CR 的进度,请运行以下命令:

      $ oc get vsr -n <app_ns>
    2. 要检查特定 VolumeSnapshotRestore CR 的进度,请运行以下命令:

      $ oc get vsr <vsr_name> -n <app_ns> -ojsonpath="{.status.phase}
  5. 运行以下命令验证您的应用程序数据是否已恢复:

    $ oc get route <route_name> -n <app_ns> -ojsonpath="{.spec.host}"

4.4.1.6. 使用 OADP 1.1 Data Mover 进行备份后的清除处理

对于 OADP 1.1 Data Mover,在执行备份后必须执行数据清理。

清理过程会删除以下资源:

  • 存储桶中的快照
  • 集群资源
  • 在由一个调度运行或重复运行的备份过程后的卷快照备份 (VSB)
4.4.1.6.1. 删除存储桶中的快照

在备份后,OADP 1.1 Data Mover 可能会在存储桶中保留一个或多个快照。您可以删除所有快照或删除单个快照。

流程

  • 要删除存储桶中的所有快照,请删除在数据保护应用程序(DPA) .spec.backupLocation.objectStorage.bucket 资源中指定的 /<protected_namespace> 文件夹。
  • 删除单个快照:

    1. 浏览到在 DPA .spec.backupLocation.objectStorage.bucket 资源中指定的 /<protected_namespace>
    2. 删除前缀为 /<volumeSnapshotContent name>-pvc 的适当文件夹,其中 <VolumeSnapshotContent_name> 是根据每个 PVC 创建的 VolumeSnapshotContent
4.4.1.6.2. 删除集群资源

无论是成功将容器存储接口 (CSI) 卷快照备份到远程对象存储,OADP 1.1 Data Mover 都可能会保留集群资源。

4.4.1.6.2.1. 在使用 Data Mover 成功备份和恢复后,删除集群资源

您使用 Data Mover 成功备份和恢复后,可以删除保留在您的应用程序命名空间中的 VolumeSnapshotBackupVolumeSnapshotRestore CR。

流程

  1. 在使用 Data Mover 备份后,删除位于应用程序命名空间中、带有应用程序 PVC 的命名空间来备份和恢复的集群资源:

    $ oc delete vsb -n <app_namespace> --all
  2. 删除在使用 Data Mover 恢复后保留的集群资源:

    $ oc delete vsr -n <app_namespace> --all
  3. 如果需要,删除使用 Data Mover 备份和恢复后保留的任何 VolumeSnapshotContent 资源:

    $ oc delete volumesnapshotcontent --all
4.4.1.6.2.2. 在使用 Data Mover 备份部分成功或失败后删除集群资源

如果使用 Data Mover 进行的备份和恢复操作部分成功或完全失败,您需要清理应用程序命名空间中存在的任何 VolumeSnapshotBackup (VSB) 或 VolumeSnapshotRestore 自定义资源定义(CRD),并清理这些控制器中创建的任何额外资源。

流程

  1. 输入以下命令清理使用 Data Mover 的备份操作后保留的集群资源:

    1. 删除应用程序命名空间中的 VSB CRD,带有应用程序 PVC 的命名空间用于备份和恢复:

      $ oc delete vsb -n <app_namespace> --all
    2. 删除 VolumeSnapshot CR:

      $ oc delete volumesnapshot -A --all
    3. 删除 VolumeSnapshotContent CR:

      $ oc delete volumesnapshotcontent --all
    4. 删除受保护的命名空间中的任何 PVC,在其中安装 Operator 的命名空间。

      $ oc delete pvc -n <protected_namespace> --all
    5. 删除命名空间中的所有 ReplicationSource 资源。

      $ oc delete replicationsource -n <protected_namespace> --all
  2. 输入以下命令,清理使用 Data Mover 进行的恢复操作后保留的集群资源:

    1. 删除 VSR CRD:

      $ oc delete vsr -n <app-ns> --all
    2. 删除 VolumeSnapshot CR:

      $ oc delete volumesnapshot -A --all
    3. 删除 VolumeSnapshotContent CR:

      $ oc delete volumesnapshotcontent --all
    4. 删除命名空间中的所有 ReplicationDestination 资源。

      $ oc delete replicationdestination -n <protected_namespace> --all

4.4.1.7. 创建备份 hook

您可以通过编辑备份自定义资源(CR)来创建 Backup hook 以在 pod 中运行的容器中运行命令。

在 pod 备份前运行 Pre hook。在备份后运行 Post hook。

流程

  • Backup CR 的 spec.hooks 块中添加 hook,如下例所示:

    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: <backup>
      namespace: openshift-adp
    spec:
      hooks:
        resources:
          - name: <hook_name>
            includedNamespaces:
            - <namespace> 1
            excludedNamespaces: 2
            - <namespace>
            includedResources: []
            - pods 3
            excludedResources: [] 4
            labelSelector: 5
              matchLabels:
                app: velero
                component: server
            pre: 6
              - exec:
                  container: <container> 7
                  command:
                  - /bin/uname 8
                  - -a
                  onError: Fail 9
                  timeout: 30s 10
            post: 11
    ...
    1
    可选:您可以指定 hook 应用的命名空间。如果没有指定这个值,则 hook 适用于所有命名空间。
    2
    可选:您可以指定 hook 不应用到的命名空间。
    3
    目前,pod 是唯一可以应用 hook 的支持的资源。
    4
    可选:您可以指定 hook 不应用到的资源。
    5
    可选:此 hook 仅适用于与标签匹配的对象。如果没有指定这个值,则 hook 适用于所有命名空间。
    6
    备份前要运行的 hook 数组。
    7
    可选:如果没有指定容器,该命令将在 pod 的第一个容器中运行。
    8
    这是正在添加的 init 容器的入口点。
    9
    错误处理允许的值是 FailContinue。默认值为 Fail
    10
    可选:等待命令运行的时间。默认值为 30s
    11
    此块定义了在备份后运行的一组 hook,其参数与 pre-backup hook 相同。

4.4.1.8. 调度备份

您可以通过创建 Schedule 自定义资源(CR)而不是 Backup CR 来调度备份。

警告

在您的备份调度中留有足够的时间,以便在创建另一个备份前完成了当前的备份。

例如,如果对一个命名空间进行备份通常需要 10 分钟才能完成,则调度的备份频率不应该超过每 15 分钟一次。

先决条件

  • 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
  • DataProtectionApplication CR 必须处于 Ready 状态。

流程

  1. 检索 backupStorageLocations CR:

    $ oc get backupStorageLocations -n openshift-adp

    输出示例

    NAMESPACE       NAME              PHASE       LAST VALIDATED   AGE   DEFAULT
    openshift-adp   velero-sample-1   Available   11s              31m

  2. 创建一个 Schedule CR,如下例所示:

    $ cat << EOF | oc apply -f -
    apiVersion: velero.io/v1
    kind: Schedule
    metadata:
      name: <schedule>
      namespace: openshift-adp
    spec:
      schedule: 0 7 * * * 1
      template:
        hooks: {}
        includedNamespaces:
        - <namespace> 2
        storageLocation: <velero-sample-1> 3
        defaultVolumesToRestic: true 4
        ttl: 720h0m0s
    EOF
    1
    调度备份的 cron 表达式,例如 0 7 * * * 代表在每天 7:00 执行备份。
    2
    要备份的命名空间数组。
    3
    backupStorageLocations CR 的名称。
    4
    可选:如果使用 Restic 备份卷,请添加 defaultVolumesToRestic: true 键-值对。
  3. 在调度的备份运行后验证 Schedule CR 的状态是否为 Completed

    $ oc get schedule -n openshift-adp <schedule> -o jsonpath='{.status.phase}'

4.4.1.9. 删除备份

您可以通过删除 Backup 自定义资源 (CR) 来删除备份文件。

警告

删除 Backup CR 和关联的对象存储数据后,您无法恢复删除的数据。

先决条件

  • 您创建了 Backup CR。
  • 您知道 Backup CR 的名称以及包含它的命名空间。
  • 下载 Velero CLI 工具。
  • 您可以访问集群中的 Velero 二进制文件。

流程

  • 选择以下操作之一来删除 Backup CR:

    • 要删除 Backup CR 并保留关联的对象存储数据,请运行以下命令:

      $ oc delete backup <backup_CR_name> -n <velero_namespace>
    • 要删除 Backup CR 并删除关联的对象存储数据,请运行以下命令:

      $ velero backup delete <backup_CR_name> -n <velero_namespace>

      其中:

      <backup_CR_name>
      指定 Backup 自定义资源的名称。
      <velero_namespace>
      指定包含 Backup 自定义资源的命名空间。

4.4.2. 恢复应用程序

您可以通过创建一个 Restore 自定义资源 (CR) 来恢复应用程序备份。请参阅创建 Restore CR

您可以创建恢复 hook,以便在 pod 中的容器中运行命令,同时通过编辑 Restore (CR) 恢复应用程序。请参阅创建恢复 hook

4.4.2.1. 创建恢复 CR

您可以通过创建一个 Restore CR 来恢复 Backup 自定义资源(CR)。

先决条件

  • 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
  • DataProtectionApplication CR 必须处于 Ready 状态。
  • 您必须具有 Velero Backup CR。
  • 调整请求的大小,以便持久性卷 (PV) 容量与备份时请求的大小匹配。

流程

  1. 创建一个 Restore CR,如下例所示:

    apiVersion: velero.io/v1
    kind: Restore
    metadata:
      name: <restore>
      namespace: openshift-adp
    spec:
      backupName: <backup> 1
      includedResources: [] 2
      excludedResources:
      - nodes
      - events
      - events.events.k8s.io
      - backups.velero.io
      - restores.velero.io
      - resticrepositories.velero.io
      restorePVs: true 3
    1
    备份 CR 的名称
    2
    可选:指定要包含在恢复过程中的资源数组。资源可以是缩写方式(例如,po 代表 pods)或完全限定的方式。如果未指定,则会包含所有资源。
    3
    可选:restorePV 参数可以被设置为 false,以便在配置了 VolumeSnapshotLocation 时从 VolumeSnapshot Container Storage Interface (CSI) 快照中关闭 PersistentVolume
  2. 输入以下命令验证 Restore CR 的状态是否为 Completed

    $ oc get restore -n openshift-adp <restore> -o jsonpath='{.status.phase}'
  3. 输入以下命令验证备份资源是否已恢复:

    $ oc get all -n <namespace> 1
    1
    备份的命名空间。
  4. 如果您使用 Restic 恢复 DeploymentConfig 对象,或使用 post-restore hook,请输入以下命令运行 dc-restic-post-restore.sh cleanup 脚本:

    $ bash dc-restic-post-restore.sh <restore-name>
    注意

    在恢复过程中,OADP Velero 插件会缩减 DeploymentConfig 对象,并将 pod 恢复为独立 pod,以防止集群在恢复时立即删除恢复的 DeploymentConfig pod,并允许 Restic 和 post-restore hook 在恢复的 pod 上完成其操作。清理脚本会删除这些断开连接的 pod,并将任何 DeploymentConfig 对象扩展至适当的副本数。

    例 4.1. dc-restic-post-restore.sh cleanup 脚本

    #!/bin/bash
    set -e
    
    # if sha256sum exists, use it to check the integrity of the file
    if command -v sha256sum >/dev/null 2>&1; then
      CHECKSUM_CMD="sha256sum"
    else
      CHECKSUM_CMD="shasum -a 256"
    fi
    
    label_name () {
        if [ "${#1}" -le "63" ]; then
    	echo $1
    	return
        fi
        sha=$(echo -n $1|$CHECKSUM_CMD)
        echo "${1:0:57}${sha:0:6}"
    }
    
    OADP_NAMESPACE=${OADP_NAMESPACE:=openshift-adp}
    
    if [[ $# -ne 1 ]]; then
        echo "usage: ${BASH_SOURCE} restore-name"
        exit 1
    fi
    
    echo using OADP Namespace $OADP_NAMESPACE
    echo restore: $1
    
    label=$(label_name $1)
    echo label: $label
    
    echo Deleting disconnected restore pods
    oc delete pods -l oadp.openshift.io/disconnected-from-dc=$label
    
    for dc in $(oc get dc --all-namespaces -l oadp.openshift.io/replicas-modified=$label -o jsonpath='{range .items[*]}{.metadata.namespace}{","}{.metadata.name}{","}{.metadata.annotations.oadp\.openshift\.io/original-replicas}{","}{.metadata.annotations.oadp\.openshift\.io/original-paused}{"\n"}')
    do
        IFS=',' read -ra dc_arr <<< "$dc"
        if [ ${#dc_arr[0]} -gt 0 ]; then
    	echo Found deployment ${dc_arr[0]}/${dc_arr[1]}, setting replicas: ${dc_arr[2]}, paused: ${dc_arr[3]}
    	cat <<EOF | oc patch dc  -n ${dc_arr[0]} ${dc_arr[1]} --patch-file /dev/stdin
    spec:
      replicas: ${dc_arr[2]}
      paused: ${dc_arr[3]}
    EOF
        fi
    done

4.4.2.2. 创建恢复 hook

您可以创建恢复 hook,以便在 pod 中运行的容器运行命令,同时通过编辑 Restore 自定义资源(CR)恢复应用程序。

您可以创建两种类型的恢复 hook:

  • init hook 将 init 容器添加到 pod,以便在应用程序容器启动前执行设置任务。

    如果您恢复 Restic 备份,则会在恢复 hook init 容器前添加 restic-wait init 容器。

  • exec hook 在恢复的 pod 的容器中运行命令或脚本。

流程

  • Restore CR 的 spec.hooks 块中添加 hook,如下例所示:

    apiVersion: velero.io/v1
    kind: Restore
    metadata:
      name: <restore>
      namespace: openshift-adp
    spec:
      hooks:
        resources:
          - name: <hook_name>
            includedNamespaces:
            - <namespace> 1
            excludedNamespaces:
            - <namespace>
            includedResources:
            - pods 2
            excludedResources: []
            labelSelector: 3
              matchLabels:
                app: velero
                component: server
            postHooks:
            - init:
                initContainers:
                - name: restore-hook-init
                  image: alpine:latest
                  volumeMounts:
                  - mountPath: /restores/pvc1-vm
                    name: pvc1-vm
                  command:
                  - /bin/ash
                  - -c
                timeout: 4
            - exec:
                container: <container> 5
                command:
                - /bin/bash 6
                - -c
                - "psql < /backup/backup.sql"
                waitTimeout: 5m 7
                execTimeout: 1m 8
                onError: Continue 9
    1
    可选: hook 应用的命名空间数组。如果没有指定这个值,则 hook 适用于所有命名空间。
    2
    目前,pod 是唯一可以应用 hook 的支持的资源。
    3
    可选:此 hook 仅适用于与标签选择器匹配的对象。
    4
    可选:超时指定了 Velero 等待 initContainers 完成的最大时间长度。
    5
    可选:如果没有指定容器,该命令将在 pod 的第一个容器中运行。
    6
    这是正在添加的 init 容器的入口点。
    7
    可选:等待容器就绪的时间。这应该足够长,以便容器可以启动,在相同容器中的任何以前的 hook 可以完成。如果没有设置,恢复过程会无限期等待。
    8
    可选:等待命令运行的时间。默认值为 30s
    9
    错误处理的允许值为 FailContinue
    • Continue: 只记录命令失败。
    • Fail: 任何 pod 中的任何容器中没有更多恢复 hook 运行。Restore CR 的状态将是 PartiallyFailed