4.17. OADP 备份
4.17.1. 备份应用程序 复制链接链接已复制到粘贴板!
频繁备份可能会消耗备份存储位置的存储。如果使用非本地备份,请检查备份、保留时间以及持久性卷(PV)的数据量的频率,如 S3 存储桶。因为所有生成的备份在过期前都会保留,因此还会检查调度的 TTL(time to live)设置。
您可以通过创建一个 Backup 自定义资源 (CR) 来备份应用程序。如需更多信息,请参阅创建备份 CR。以下是 Backup CR 的不同备份类型:
-
BackupCR 为 Kubernetes 资源和 S3 对象存储上的内部镜像创建备份文件。 - 如果您使用 Velero 的快照功能备份存储在持久性卷中的数据,则只有快照相关信息会与 Openshift 对象数据一起存储在 S3 存储桶中。
-
如果您的云供应商有原生快照 API 或支持 CSI 快照,则
BackupCR 通过创建快照来备份持久性卷 (PV)。有关使用 CSI 快照的更多信息,请参阅使用 CSI 快照备份持久性卷。
如果底层存储或备份存储桶是同一集群的一部分,则当出现灾难时数据可能会丢失。
有关 CSI 卷快照的更多信息,请参阅 CSI 卷快照。
CloudStorage API(它自动为对象存储创建一个存储桶)只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
当使用 CloudStorage 对象,并希望 OADP 使用 CloudStorage API 自动创建 S3 存储桶以用作 BackupStorageLocation 时,CloudStorage API 只是一个技术预览功能。
CloudStorage API 支持通过指定一个现有的 S3 存储桶来手动创建 BackupStorageLocation 对象。自动创建 S3 存储桶的 CloudStorage API 目前只为 AWS S3 存储启用。
- 如果您的云供应商不支持快照,或者应用程序位于 NFS 数据卷中,您可以使用 Kopia 或 Restic 创建备份。请参阅使用文件系统备份备份应用程序:Kopia 或 Restic。
…/.snapshot: read-only file system 错误
…/.snapshot 目录是一个快照复制目录,由多个 NFS 服务器使用。该目录默认具有只读访问权限,因此 Velero 无法恢复到这个目录中。
不要向 Velero 提供对 .snapshot 目录的写入权限,并禁用客户端对这个目录的访问。
OpenShift API for Data Protection (OADP) 不支持对由其他软件创建的卷快照进行备份。
4.17.1.1. 在运行备份和恢复前预览资源 复制链接链接已复制到粘贴板!
OADP 根据类型、命名空间或标签备份应用程序资源。这意味着您可以在备份完成后查看资源。同样,您可以在恢复操作完成后根据命名空间、持久性卷(PV)或标签查看恢复的对象。要提前预览资源,您可以空运行备份和恢复操作。
先决条件
- 已安装 OADP Operator。
流程
要在运行实际备份前预览备份中包含的资源,请运行以下命令:
$ velero backup create <backup-name> --snapshot-volumes false1 - 1
- 将
--snapshot-volumes 参数的值指定为false。
要了解有关备份资源的更多详细信息,请运行以下命令:
$ velero describe backup <backup_name> --details1 - 1
- 指定备份的名称。
要在运行实际恢复前预览恢复中包含的资源,请运行以下命令:
$ velero restore create --from-backup <backup-name>1 - 1
- 指定为查看备份资源而创建的备份名称。
重要velero restore create命令在集群中创建恢复资源。在查看资源后,您必须删除作为恢复的一部分创建的资源。要了解有关恢复资源的更多详细信息,请运行以下命令:
$ velero describe restore <restore_name> --details1 - 1
- 指定恢复的名称。
您可以创建备份 hook,以便在备份操作之前或之后运行命令。请参阅创建备份 hook。
您可以通过创建一个 Schedule CR 而不是 Backup CR 来调度备份。请参阅使用 Schedule CR 调度备份。
4.17.1.2. 已知问题 复制链接链接已复制到粘贴板!
OpenShift Container Platform 4.15 强制执行一个 pod 安全准入(PSA)策略,该策略可以在 Restic 恢复过程中阻止 pod 的就绪状态。
这个问题已在 OADP 1.1.6 和 OADP 1.2.2 版本中解决,因此建议用户升级到这些版本。
如需更多信息,请参阅 因为更改了 PSA 策略,在 OCP 4.15 上进行 Restic 恢复部分失败。
4.17.2. 创建备份 CR 复制链接链接已复制到粘贴板!
您可以通过创建 Backup 备份自定义资源(CR)来备份 Kubernetes 镜像、内部镜像和持久性卷(PV)。
先决条件
- 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
-
DataProtectionApplicationCR 必须处于Ready状态。 备份位置先决条件:
- 您必须为 Velero 配置 S3 对象存储。
-
您必须在
DataProtectionApplicationCR 中配置了一个备份位置。
快照位置先决条件:
- 您的云供应商必须具有原生快照 API 或支持 Container Storage Interface(CSI)快照。
-
对于 CSI 快照,您必须创建一个
VolumeSnapshotClassCR 来注册 CSI 驱动程序。 -
您必须在
DataProtectionApplicationCR 中配置了一个卷位置。
流程
输入以下命令来检索
backupStorageLocationsCR:$ oc get backupstoragelocations.velero.io -n openshift-adp输出示例
NAMESPACE NAME PHASE LAST VALIDATED AGE DEFAULT openshift-adp velero-sample-1 Available 11s 31m创建一个
BackupCR,如下例所示: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: 720h0m0s5 labelSelector:6 matchLabels: app: <label_1> app: <label_2> app: <label_3> orLabelSelectors:7 - matchLabels: app: <label_1> app: <label_2> app: <label_3>- 1
- 指定要备份的命名空间数组。
- 2
- 可选:指定一个要包含在备份中的资源的数组。资源可以是缩写方式(例如,'po' 代表 'pods')或完全限定的方式。如果未指定,则会包含所有资源。
- 3
- 可选:指定要从备份中排除的资源数组。资源可以是缩写方式(例如,'po' 代表 'pods')或完全限定的方式。
- 4
- 指定
backupStorageLocationsCR 的名称。 - 5
ttl字段定义所创建的备份和备份数据的保留时间。例如,如果您使用 Restic 作为备份工具,则备份的持久性卷(PV)的数据项和数据内容会存储,直到备份过期为止。但是,存储这些数据会在目标备份位置消耗更多空间。频繁备份会使用额外的存储,即使在其他未过期的备份之前也会创建它们,这些存储可能会超时。- 6
- 具有所有指定标签的备份资源的 {key,value} 对映射。
- 7
- 具有一个或多个指定标签的备份资源的 {key,value} 对映射。
验证
BackupCR 的状态是否为Completed:$ oc get backups.velero.io -n openshift-adp <backup> -o jsonpath='{.status.phase}'
4.17.3. 使用 CSI 快照备份持久性卷 复制链接链接已复制到粘贴板!
在创建 Backup CR 前,您可以编辑云存储的 VolumeSnapshotClass 自定义资源(CR) 来使用 Container Storage Interface (CSI) 快照备份持久性卷,请参阅 CSI 卷快照。
如需更多信息,请参阅创建备份 CR。
先决条件
- 云供应商必须支持 CSI 快照。
-
您必须在
DataProtectionApplicationCR 中启用 CSI。
流程
将
metadata.labels.velero.io/csi-volumesnapshot-class: "true"键值对添加到VolumeSnapshotClassCR:配置文件示例
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: <volume_snapshot_class_name> labels: velero.io/csi-volumesnapshot-class: "true"1 annotations: snapshot.storage.kubernetes.io/is-default-class: true2 driver: <csi_driver> deletionPolicy: <deletion_policy_type>3
后续步骤
-
现在,您可以创建一个
BackupCR。
4.17.4. 使用文件系统备份对应用程序进行备份:Kopia 或 Restic 复制链接链接已复制到粘贴板!
您可以使用 OADP 从卷的文件系统备份和恢复附加到 pod 的 Kubernetes 卷。这个过程称为文件系统备份 (FSB) 或 Pod 卷备份 (PVB)。它通过使用来自开源备份工具 Restic 或 Kopia 的模块来完成。
如果您的云供应商不支持快照,或者应用程序位于 NFS 数据卷中,您可以使用 FSB 创建备份。
FSB 与 OADP 集成提供了一种解决方案,用于备份和恢复几乎任何类型的 Kubernetes 卷。这个集成是 OADP 的一个额外功能,不是现有功能的替代品。
您可以通过编辑 Backup 备份自定义资源 (CR) 来使用 Kopia 或 Restic 对 Kubernetes 资源、内部镜像和持久性卷备份。
您不需要在 DataProtectionApplication CR 中指定快照位置。
在 OADP 版本 1.3 及更高版本中,您可以使用 Kopia 或 Restic 备份应用程序。
对于 Built-in DataMover,您必须使用 Kopia。
在 OADP 版本 1.2 及更早版本中,您只能使用 Restic 备份应用程序。
FSB 不支持对 hostPath 卷进行备份。如需更多信息,请参阅 FSB 限制。
…/.snapshot: read-only file system 错误
…/.snapshot 目录是一个快照复制目录,由多个 NFS 服务器使用。该目录默认具有只读访问权限,因此 Velero 无法恢复到这个目录中。
不要向 Velero 提供对 .snapshot 目录的写入权限,并禁用客户端对这个目录的访问。
先决条件
- 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
-
您不能通过将
DataProtectionApplicationCR 中的spec.configuration.nodeAgent.enabletofalse来禁用默认的nodeAgent安装。 -
您必须在
DataProtectionApplicationCR 中将spec.configuration.nodeAgent.uploaderType设置为kopia或restic来选择 Kopia 或 Restic 作为 uploader。 -
DataProtectionApplicationCR 必须处于Ready状态。
流程
创建
BackupCR,如下例所示:apiVersion: velero.io/v1 kind: Backup metadata: name: <backup> labels: velero.io/storage-location: default namespace: openshift-adp spec: defaultVolumesToFsBackup: true1 ...- 1
- 在 OADP 版本 1.2 及更高版本中,在
spec块中添加defaultVolumesToFsBackup: true设置。在 OADP 版本 1.1 中,添加defaultVolumesToRestic: true。
4.17.5. 创建备份 hook 复制链接链接已复制到粘贴板!
在执行备份时,可以根据正在备份的 pod,指定在 pod 内要执行的一个或多个命令。
可将命令配置为在任何自定义操作处理(Pre hook)或所有自定义操作完成后执行,且由自定义操作指定的任何其他项目都已备份(Post hook)。
您可以通过编辑备份自定义资源(CR)来创建 Backup hook 以在 pod 中运行的容器中运行命令。
流程
在
BackupCR 的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: [] - pods3 excludedResources: []4 labelSelector:5 matchLabels: app: velero component: server pre:6 - exec: container: <container>7 command: - /bin/uname8 - -a onError: Fail9 timeout: 30s10 post:11 ...- 1
- 可选:您可以指定 hook 应用的命名空间。如果没有指定这个值,则 hook 适用于所有命名空间。
- 2
- 可选:您可以指定 hook 不应用到的命名空间。
- 3
- 目前,pod 是唯一可以应用 hook 的支持的资源。
- 4
- 可选:您可以指定 hook 不应用到的资源。
- 5
- 可选:此 hook 仅适用于与标签匹配的对象。如果没有指定这个值,则 hook 适用于所有对象。
- 6
- 备份前要运行的 hook 数组。
- 7
- 可选:如果没有指定容器,该命令将在 pod 的第一个容器中运行。
- 8
- 这是添加
init容器的入口点。 - 9
- 错误处理允许的值是
Fail和Continue。默认值为Fail。 - 10
- 可选:等待命令运行的时间。默认值为
30s。 - 11
- 此块定义了在备份后运行的一组 hook,其参数与 pre-backup hook 相同。
4.17.6. 使用 Schedule CR 调度备份 复制链接链接已复制到粘贴板!
调度操作允许您在特定时间创建由 Cron 表达式指定的数据的备份。
您可以通过创建 Schedule 自定义资源(CR)而不是 Backup CR 来调度备份。
在您的备份调度中留有足够的时间,以便在创建另一个备份前完成了当前的备份。
例如,如果对一个命名空间进行备份通常需要 10 分钟才能完成,则调度的备份频率不应该超过每 15 分钟一次。
先决条件
- 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
-
DataProtectionApplicationCR 必须处于Ready状态。
流程
检索
backupStorageLocationsCR:$ oc get backupStorageLocations -n openshift-adp输出示例
NAMESPACE NAME PHASE LAST VALIDATED AGE DEFAULT openshift-adp velero-sample-1 Available 11s 31m创建一个
ScheduleCR,如下例所示:$ 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 defaultVolumesToFsBackup: true4 ttl: 720h0m0s5 EOF注意要以特定间隔调度备份,以以下格式输入
<duration_in_minutes>:schedule: "*/10 * * * *"在引号 (
" ") 之间输入分钟值。- 1
- 调度备份的
cron表达式,例如0 7 * * *代表在每天 7:00 执行备份。 - 2
- 要备份的命名空间数组。
- 3
backupStorageLocationsCR 的名称。- 4
- 可选:在 OADP 版本 1.2 及更高版本中,在使用 Restic 进行卷备份时,将
defaultVolumesToFsBackup: true键值对添加到您的配置中。在 OADP 版本 1.1 中,在使用 Restic 备份卷时添加defaultVolumesToRestic: true键值对。 - 5
ttl字段定义所创建的备份和备份数据的保留时间。例如,如果您使用 Restic 作为备份工具,则备份的持久性卷(PV)的数据项和数据内容会存储,直到备份过期为止。但是,存储这些数据会在目标备份位置消耗更多空间。频繁备份会使用额外的存储,即使在其他未过期的备份之前也会创建它们,这些存储可能会超时。
在调度的备份运行后验证
ScheduleCR 的状态是否为Completed:$ oc get schedule -n openshift-adp <schedule> -o jsonpath='{.status.phase}'
4.17.7. 删除备份 复制链接链接已复制到粘贴板!
您可以通过创建 DeleteBackupRequest 自定义资源 (CR) 或运行 velero backup delete 来删除备份(在以下介绍)。
根据备份的方法,卷备份工件会在不同的时间删除:
- Restic:在删除备份后,工件会在下一个完整的维护周期中删除。
- Container Storage Interface (CSI):当删除备份时,工件会被立即删除。
- Kopia:在删除备份后,工件会在 Kopia 存储库的三个完整维护周期后删除。
4.17.7.1. 通过创建 DeleteBackupRequest CR 来删除备份 复制链接链接已复制到粘贴板!
您可以通过创建一个 DeleteBackupRequest 自定义资源 (CR) 来删除备份。
先决条件
- 您已运行应用程序的备份。
流程
创建
DeleteBackupRequestCR 清单文件:apiVersion: velero.io/v1 kind: DeleteBackupRequest metadata: name: deletebackuprequest namespace: openshift-adp spec: backupName: <backup_name>1 - 1
- 指定备份的名称。
应用
DeleteBackupRequestCR 以删除备份:$ oc apply -f <deletebackuprequest_cr_filename>
4.17.7.2. 使用 Velero CLI 删除备份 复制链接链接已复制到粘贴板!
您可以使用 Velero CLI 删除备份。
先决条件
- 您已运行应用程序的备份。
- 下载 Velero CLI,并可以访问集群中的 Velero 二进制文件。
流程
要删除备份,请运行以下 Velero 命令:
$ velero backup delete <backup_name> -n openshift-adp1 - 1
- 指定备份的名称。
4.17.7.3. 关于 Kopia 仓库维护 复制链接链接已复制到粘贴板!
有两种 Kopia 存储库维护类型:
- 快速维护
- 每小时运行一次,以保持索引 Blob (n) 数量较低。大量索引对 Kopia 操作的性能会造成负面影响。
- 在没有确定存在同一元数据的另一个副本的情况下,请勿从仓库中删除任何元数据。
- 完整维护
- 每 24 小时运行一次,以对不再需要仓库内容进行垃圾回收处理。
-
snapshot-gc是一个完整的维护任务,它会找到所有无法从快照清单访问的文件和目录列表,并将其标记为已删除。 - 完整维护操作有较高的资源成不,因为它需要扫描集群中所有活跃的快照中的所有目录。
4.17.7.3.1. OADP 中的 Kopia 维护 复制链接链接已复制到粘贴板!
repo-maintain-job 作业是在安装 OADP 的命名空间中执行的,如下例所示:
pod/repo-maintain-job-173...2527-2nbls 0/1 Completed 0 168m
pod/repo-maintain-job-173....536-fl9tm 0/1 Completed 0 108m
pod/repo-maintain-job-173...2545-55ggx 0/1 Completed 0 48m
您可以检查 repo-maintain-job 的日志,以了解清理以及在备份对象存储中删除工件的更多详情。当需要进行下一个完整维护时,您可以在 repo-maintain-job 中看到一个相关的信息,如下例所示:
not due for full maintenance cycle until 2024-00-00 18:29:4
将对象从备份对象存储中删除需要已成功执行了三个完整维护周期。这意味着,要删除备份对象存储中的所有工件,最多需要 72 小时。
4.17.7.4. 删除备份仓库 复制链接链接已复制到粘贴板!
在删除备份后,当 Kopia 仓库维护周期删除了相关工件后,备份不再被任何元数据或清单对象引用。然后,您可以删除 backuprepository 自定义资源 (CR) 来完成备份删除过程。
先决条件
- 您已删除应用程序的备份。
- 在备份被删除后,您最多等待 72 小时。在此期间 Kopia 可以运行仓库维护周期。
流程
要获取备份的备份仓库 CR 的名称,请运行以下命令:
$ oc get backuprepositories.velero.io -n openshift-adp要删除备份仓库 CR,请运行以下命令:
$ oc delete backuprepository <backup_repository_name> -n openshift-adp1 - 1
- 指定上一步中备份仓库的名称。
4.17.8. 关于 Kopia 复制链接链接已复制到粘贴板!
Kopia 是一个快速安全的开源备份和恢复工具,可让您创建数据的加密快照,并将快照保存到您选择的远程或云存储中。
Kopia 支持网络和本地存储位置,以及许多云或远程存储位置,包括:
- Amazon S3 以及与 S3 兼容的任何云存储
- Azure Blob Storage
- Google Cloud Storage 平台
Kopia 对快照使用可内容访问的存储:
- 快照始终是以增量方式进行的;已包含在之前快照中的数据不会重新上传到存储库。仅当文件被修改时,文件才会再次上传到存储库。
- 存储的数据会被去除重复数据;如果存在同一文件的多个副本,则仅存储其中一个文件。
- 如果文件被移动或重命名,Kopia 可以识别它们具有相同的内容,且不会重新上传它们。
4.17.8.1. OADP 与 Kopia 集成 复制链接链接已复制到粘贴板!
除了 Restic 外,OADP 1.3 还支持 Kopia 作为 pod 卷备份的备份机制。您需要在安装时通过在 DataProtectionApplication 自定义资源(CR) 中设置 uploaderType 字段来选择其中一个。可能的值为 restic 或 kopia。如果没有指定 uploaderType,OADP 1.3 默认为使用 Kopia 作为备份机制。数据会从一个统一的存储库中读取或写入。
不支持使用 Kopia 客户端修改 Kopia 备份存储库,并可能会影响 Kopia 备份的完整性。OADP 不支持直接连接到 Kopia 存储库,且只能以最佳方式提供支持。
以下示例显示了配置了使用 Kopia 的 DataProtectionApplication CR:
apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
metadata:
name: dpa-sample
spec:
configuration:
nodeAgent:
enable: true
uploaderType: kopia
# ...