备份和恢复


Red Hat OpenShift Service on AWS 4

备份和恢复 Red Hat OpenShift Service on AWS 集群

摘要

本文档提供了备份集群数据以及从各种灾难场景中恢复的步骤。

第 1 章 OADP 应用程序备份和恢复

1.1. OpenShift API for Data Protection 简介

使用 OpenShift API for Data Protection (OADP)在 Red Hat OpenShift Service on AWS 上保护应用程序、与应用程序相关的集群资源、持久性卷和内部镜像。OADP 备份容器化应用程序和虚拟机(VM)。这有助于您确保灾难恢复。

重要

OADP 支持适用于客户工作负载命名空间和集群范围资源。

不支持完整 集群备份和恢复

1.1.1. OpenShift API for Data Protection API

OADP 提供了 API,它允许多种方法自定义备份,并防止包含不必要的或不当的资源。

OADP 提供以下 API。如需了解更多详细信息,请参阅附加资源部分

  • Backup
  • 恢复
  • 调度
  • BackupStorageLocation
  • VolumeSnapshotLocation
1.1.1.1. 支持 OpenShift API for Data Protection

请参阅 OADP 支持列表,以了解与 Red Hat OpenShift Service on AWS 版本和生命周期策略信息的版本兼容性,包括延长更新支持(EUS)选项。

Expand
表 1.1. 支持的 OADP 版本

Version

Red Hat OpenShift Service on AWS 版本

公开发行(GA)

完全支持结束

维护结束

延长更新支持(EUS)

延长更新支持条款 2 (EUS Term 2)

1.5

  • 4.19
  • 4.20
  • 4.21

2025 年 6 月 17 日

1.6 发行之日

1.7 发行之日

EUS 必须是 Red Hat OpenShift Service on AWS 4.21

EUS Term 2 必须在 Red Hat OpenShift Service on AWS 4.21 中

1.4

  • 4.14
  • 4.15
  • 4.16
  • 4.17
  • 4.18

2024 年 7 月 10 日

1.5 发行之日

1.6 发行之日

2026 年 6 月 27 日

EUS 必须是 Red Hat OpenShift Service on AWS 4.16

2027 年 6 月 27 日

EUS Term 2 必须是 Red Hat OpenShift Service on AWS 4.16

1.3

  • 4.12
  • 4.13
  • 4.14
  • 4.15

2023 年 11 月 29 日

2024 年 7 月 10 日

1.5 发行之日

2025 年 10 月 31 日

EUS 必须是 Red Hat OpenShift Service on AWS 4.14

2026 年 10 月 31 日

EUS Term 2 必须是 Red Hat OpenShift Service on AWS 4.14

1.1.1.1.1. 不支持的 OADP Operator 版本
Expand
表 1.2. 不再支持的 OADP Operator 的早期版本

Version

公开发行(GA)

完全支持结束

维护结束

1.2

2023 年 6 月 14 日

2023 年 11 月 29 日

2024 年 7 月 10 日

1.1

2022 年 9 月 1 日

2023 年 6 月 14 日

2023 年 11 月 29 日

1.0

2022 年 2 月 9 日

2022 年 9 月 1 日

2023 年 6 月 14 日

有关 EUS 的详情,请参阅延长更新支持

有关 EUS Term 2 的详情,请参阅延长更新支持 Term 2

1.2. OADP 发行注记

1.2.1. OADP 1.5 发行注记

OpenShift API for Data Protection (OADP) 1.5 发行注记介绍了新的功能和增强功能、已弃用的功能、产品建议、已知问题和已解决的问题。

注意

有关 OADP 的更多信息,请参阅 OpenShift API for Data Protection (OADP) FAQ

1.2.1.1. OADP 1.5.5 发行注记

OpenShift API for Data Protection (OADP) 1.5.5 发行注记列出了已解决的问题。

1.2.1.1.1. 已解决的问题
OADP 1.5.5 修复以下 CVE
由于 API 初始化前进行 CRD 同步,单节点 OpenShift 集群不再崩溃

在此次更新之前,由于 OpenShift Container Platform 自定义资源定义(CRD)在基于镜像的升级(IBU)前,控制器会在基于镜像的升级过程中崩溃。因此,在 IBU 升级过程中,这个失败会延迟 DataProtectionApplication (DPA)协调。此发行版本解决了这个问题,要求控制器在单节点 OpenShift 上的 IBU 环境之前等待 OpenShift Container Platform CRD 加载,同时禁用领导选举机制。这个更改会缩短 DPA 协调窗口,并改进了单节点 OpenShift 集群的整体升级持续时间。

OADP-7508

1.2.1.2. OADP 1.5.4 发行注记

用于数据保护(OADP) 1.5.4 的 OpenShift API 是一个 Container Grade Only (CGO)发行版本,它被发布来刷新容器的健康状况等级。与 OADP 1.5.3 相比,产品本身中没有更改代码。OADP 1.5.4 引入了一个已知问题,并修复了几个常见漏洞和暴露(CVE)。

1.2.1.2.1. 已知问题
同时更新同一 NonAdminBackupStorageLocationRequest 对象会导致资源冲突

由多个控制器或进程同时更新到同一 NonAdminBackupStorageLocationRequest 对象会导致 OADP 自助服务中的备份创建过程中资源冲突。因此,协调尝试失败并显示 对象被修改 的错误。当前还没有已知的临时解决方案。

OADP-6700

1.2.1.2.2. 已解决的问题
1.2.1.3. OADP 1.5.3 发行注记

OpenShift API for Data Protection (OADP) 1.5.3 是一个 Container Grade Only (CGO)发行版本,它被发布来刷新容器的健康状况等级。与 OADP 1.5.2 相比,产品本身中没有更改代码。

1.2.1.4. OADP 1.5.2 发行注记

OpenShift API for Data Protection (OADP) 1.5.2 发行注记列出了已解决的问题。

1.2.1.4.1. 已解决的问题
内部镜像备份的自签名证书不应破坏其他 BSLs

在此次更新之前,OADP 只会处理在所有备份存储位置(BSLs)中找到的第一个自定义 CA 证书,并在全局范围内应用它。这个行为可防止带有不同 CA 证书的多个 BSLs 正常工作。另外,不会包括系统可信证书,从而导致连接到标准服务时失败。

在这个版本中,OADP 现在:

  • 将 AWS BSLs 的所有唯一 CA 证书连接到单个捆绑包中。
  • 自动包含系统可信证书。
  • 启用具有不同自定义 CA 证书的多个 BSLs 可以同时操作。
  • 仅在启用镜像备份时处理 CA 证书(默认行为)。

此功能增强提高了使用具有不同证书要求的多个存储供应商的环境的兼容性,特别是在使用自签名证书将内部镜像备份到 AWS S3 兼容存储时。

OADP-6765

1.2.1.5. OADP 1.5.1 发行注记

用于数据保护(OADP) 1.5.1 的 OpenShift API 发行注记列出了新功能、已解决的问题、已知问题和已弃用的功能。

1.2.1.5.1. 新功能
CloudStorage API 完全支持

在此版本之前,CloudStorage API 功能作为一个技术预览提供,在 OADP 1.5.1 中被完全支持。CloudStorage API 会自动为对象存储创建存储桶。

OADP-3307

新的 DataProtectionTest 自定义资源可用

DataProtectionTest (DPT) 是一个自定义资源 (CR),它提供验证 OADP 配置的框架。

DPT CR 检查并报告以下参数信息:

  • 将备份上传到对象存储的性能。
  • 持久性卷声明的 Container Storage Interface (CSI) 快照就绪。
  • 存储桶配置,如加密和版本控制。

在 DPT CR 中使用此信息,您可以确保正确配置并正确配置您的数据保护环境,并根据设置配置执行。

请注意,当使用带有 Azure 上的 OADP 的 DPT 时,您必须配置 STORAGE_ACCOUNT_ID

OADP-6300

新的节点代理负载均衡配置可用
  • 节点代理负载关联性: 您可以使用 DataProtectionApplication (DPA) 自定义资源 (CR) 的 spec.podConfig.nodeSelector 对象将节点代理 pod 调度到特定的节点上。您可以使用 DPA spec 中的 nodeagent.loadAffinity 对象对节点代理 pod 调度添加更多限制。
  • 存储库维护作业关联性配置 : 只有在使用 Kopia 作为备份存储库时,您可以使用 DataProtectionApplication (DPA)自定义资源(CR) 中的存储库维护作业关联性配置。

    您可以选择在全局级别上配置负载关联性,会影响所有存储库或每个存储库。您还可以使用全局和每个存储库配置的组合。

  • Velero load 关联性: 您可以使用 podConfig.nodeSelector 对象将 Velero pod 分配给特定的节点。您还可以为 pod 级别关联性和反关联性配置 velero.loadAffinity 对象。

OADP-5832

节点代理负载并发可用
在这个版本中,用户可以控制集群中每个节点上可以同时运行的最大节点代理操作数量。它还启用了更好的资源管理、优化备份和恢复工作流,以提高性能和更精简的体验。
1.2.1.5.2. 已解决的问题
DataProtectionApplicationSpec overflowed 注解限制,从而导致部署出现潜在的错误配置

在此次更新之前,DataProtectionApplicationSpec 使用已弃用的 PodAnnotations,这会导致注解限制溢出。这会导致部署出现潜在的错误配置。在本发行版本中,我们为 Operator 部署的 pod 中的注解添加了 PodConfig,确保最终用户提供一致的注解并改进了可管理性。现在,部署应该更加可靠且更易于管理。

OADP-6454

OADP 控制器管理器的根文件系统现在是只读
在此次更新之前,openshift-adp-controller-manager-* pod 的 manager 容器被配置为使用可写的根文件系统运行。因此,这可能会导致使用容器的文件系统或外部可执行文件的篡改。在这个版本中,容器的安全上下文已被更新,将 root 文件系统设置为只读,同时确保需要写入访问权限所需的功能(如 Kopia 缓存)可以继续正确运行。因此,容器会针对潜在的威胁进行强化。
在多个 DPAs 中,nonAdmin.enable: false 不再导致协调问题

在此次更新之前,当用户尝试在已存在的集群中创建第二个非管理员 DataProtectionApplication (DPA) 时,新的 DPA 无法协调。在这个版本中,每个集群中对 Non-Admin Controller 安装的限制已被删除。因此,用户可以在集群中安装多个 Non-Admin Controller,而不会遇到错误。

OADP-6500

OADP 支持自签名证书

在此次更新之前,使用自签名证书作为带有存储供应商(如 Minio)的备份镜像会导致备份过程中出现 x509: certificate signed by unknown authority 错误。在这个版本中,证书验证已被更新,以支持 OADP 中的自签名证书,确保成功备份。

OADP-641

Velero describe 包括 defaultVolumesToFsBackup

在此次更新之前,velero describe 输出命令会省略 defaultVolumesToFsBackup 标志。这会影响用户的备份配置详情的可见性。在这个版本中,velero describe 输出包含 defaultVolumesToFsBackup 标志信息,改进了备份设置的可见性。

OADP-5762

当安全 s3Url 时,DPT CR 不再失败

在此次更新之前,当 s3Url 是安全的时,因为一个未验证的证书而导致 DataProtectionTest (DPT) 失败,因为 DPT CR 缺少在 spec 字段中跳过或添加 caCert 的功能。因此,因为未验证的证书,数据上传失败。在这个版本中,DPT CR 已更新,可以接受和跳过 spec 字段中的 CA 证书,从而解决了 SSL 验证错误的问题。因此,在使用安全 s3Url 时,DPT 不再失败。

OADP-6235

向 DPA 添加一个其 backupLocation 名称已存在的 backupLocation 时不会被拒绝

在此次更新之前,在 DataProtectionApplication (DPA) 中添加第二个 backupLocation 会导致 OADP 进入无效的状态,从而导致 Backup 和 Restore 失败,因为 Velero 无法读取 Secret 凭证。因此,备份和恢复操作会失败。在这个版本中,DPA 中重复的 backupLocation 名称不再被允许,防止 Backup 和 Restore 失败。因此,重复的 backupLocation 名称会被拒绝,确保无缝的数据保护。

OADP-6459

1.2.1.5.3. 已知问题
恢复使用 Cinder CSI 驱动程序在 OpenStack 上创建的备份会失败

当您为使用 Cinder Container Storage Interface (CSI) 驱动程序的 OpenStack 平台上创建的备份启动恢复操作时,初始备份仅在源应用程序手动缩减后成功。恢复作业失败,使您无法从备份中恢复应用程序的数据和状态。不存在已知的临时解决方案。

OADP-5552

如果节点Agent.loadAffinity 参数有许多元素,在备份过程中调度 dataMover pod

由于 Velero 1.14 及之后的版本中的一个问题,OADP node-agent 只处理 loadAffinity 数组中的第一个 nodeSelector 元素。因此,如果您定义了多个 nodeSelector 对象,会忽略除第一个以外的所有对象,从而可能会导致在备份过程中将数据 pod 调度到意外节点上。

要临时解决这个问题,将来自多个 nodeSelector 对象的所有所需的 matchExpressions 整合到第一个 nodeSelector 对象中。因此,所有节点关联性规则都会被正确应用,确保将数据 pod 调度到适当的节点。

OADP-6469

当使用带有别名的命令的 CA 证书时,OADP Backup 会失败

CA 证书不会作为一个文件存储在运行的 Velero 容器上。因为这个原因,会由于 Velero 容器中缺少 caCert 出现降级的情况,需要手动设置和下载。要临时解决这个问题,在 Velero 部署中手动添加证书。具体步骤请参阅使用带有 velero 部署的 cacert 命令别名

OADP-4668

Data Mover restore 操作不支持 nodeSelector spec

当使用 nodeAgent 参数中设置的 nodeSelector 字段创建数据保护应用程序(DPA)时,Data Mover restore 部分会失败,而不是完成恢复操作。当前还没有已知的临时解决方案。

OADP-4743

当使用 caCert配置 DPA 时,镜像流备份部分失败

在 S3 连接中使用 DataProtectionApplication (DPA) 中的 caCert 备份过程中的未验证证书会导致 ocp-django 应用程序的备份部分失败,并导致数据丢失。当前还没有已知的临时解决方案。

OADP-4817

Kopia 不会删除 worker 节点上的缓存

当配置了 ephemeral-storage 参数并运行文件系统恢复时,缓存不会自动从 worker 节点中删除。因此,在恢复备份过程时 /var 分区会溢出,从而增加了存储使用量并潜在存在资源耗尽的情况。要临时解决这个问题,重启节点代理 pod,这会清除缓存。这样,缓存会被删除。

OADP-4855

因为无效的项目配置,在 Workload Identity 上 Google Cloud VSL 备份会失败

当在 Google Cloud Workload Identity 上执行 volumeSnapshotLocation (VSL) 备份时,如果 Google Cloud 项目也在 DataProtectionApplication (DPA) 的 snapshotLocations 配置中指定,Velero Google Cloud 插件会创建一个无效的 API 请求。因此,Google Cloud API 返回一个 RESOURCE_PROJECT_INVALID 错误,备份作业完成但带有 PartiallyFailed 状态。当前还没有已知的临时解决方案。

OADP-6697

使用 STS 的 AWS 上的 CloudStorage API 的 VSL 备份失败

volumeSnapshotLocation (VSL) 备份失败,因为凭证文件中缺少 AZURE_RESOURCE_GROUP 参数,即使 VSL 的 DataProtectionApplication (DPA) 配置中提到了 AZURE_RESOURCE_GROUP。当前还没有已知的临时解决方案。

OADP-6676

使用 STS 在 Azure 上备份带有 ImageStreams 的应用程序会失败

当使用 STS 在 Azure 集群上备份包含镜像流资源的应用程序时,OADP 插件会错误地尝试为容器 registry 查找基于 secret 的凭证。因此,STS 环境中没有找到所需的 secret,从而导致 ImageStream 自定义备份操作失败。这会导致标记为 PartiallyFailed 的整体备份状态。当前还没有已知的临时解决方案。

OADP-6675

对于 CloudStorageRef 配置,DPA 协调失败

当用户创建存储桶并使用 backupLocations.bucket.cloudStorageRef 配置时,存储桶凭证不会出现在 DataProtectionApplication (DPA) 自定义资源 (CR) 中。因此,即使 CloudStorage CR 中存在存储桶凭证,DPA 协调也会失败。要临时解决这个问题,在 DPA CR 的 backupLocations 部分添加相同的凭证。

OADP-6669

1.2.1.5.4. 弃用的功能
configuration.restic specification 字段已弃用

在 OADP 1.5.0 中,config.restic 规格字段已弃用。使用带有 uploaderType 字段的 nodeAgent 部分选择 kopiarestic 作为 uploaderType。请注意,Restic 在 OADP 1.5.0 中已弃用。

OADP-5158

1.2.1.6. OADP 1.5.0 发行注记

OpenShift API for Data Protection (OADP) 1.5.0 发行注记列出了新功能、解决的问题、已知问题、已弃用的功能和技术预览功能。

1.2.1.6.1. 新功能
OADP 1.5.0 引入了一个新的自助服务功能

OADP 1.5.0 引入了名为 OADP Self-Service 的新功能,启用命名空间管理员用户在 AWS 上的 Red Hat OpenShift Service 上备份和恢复应用程序。在之前的 OADP 版本中,您需要 cluster-admin 角色来执行 OADP 操作,如备份和恢复应用程序、创建备份存储位置等。

从 OADP 1.5.0 开始,您不需要 cluster-admin 角色来执行备份和恢复操作。您可以将 OADP 与命名空间 admin 角色一起使用。命名空间 admin 角色仅对该用户分配到的命名空间具有管理员访问权限。您只能在集群管理员安装 OADP Operator 并提供所需权限后使用 Self-Service 功能。

OADP-4001

使用 must-gather 工具收集日志已使用 Markdown 概述进行了改进

您可以使用 must-gather 工具来收集用于数据保护 (OADP) 自定义资源的日志以及 OpenShift API 的信息。must-gather 数据必须附加到所有客户案例。这个工具使用收集的信息生成 Markdown 输出文件,它位于 must-gather 日志集群目录中。

OADP-5384

dataMoverPrepareTimeoutresourceTimeout 参数现在添加到 DPA 中的 nodeAgent

Data Protection Application (DPA) 中的 nodeAgent 字段现在包含以下参数:

  • dataMoverPrepareTimeout: 定义 DataUploadDataDownload 进程将等待的持续时间。默认值为 30 分钟。
  • resourceTimeout :设置没有被其他特定超时参数解决的资源进程的超时时间。默认值为 10 分钟。

OADP-3736

使用 DPA 中的 spec.configuration.nodeAgent 参数来配置 nodeAgent 守护进程集

Velero 不再使用 node-agent-config 配置映射来配置 nodeAgent 守护进程集。在这个版本中,您必须在数据保护应用程序(DPA)中使用新的 spec.configuration.nodeAgent 参数来配置 nodeAgent 守护进程集。

OADP-5042

现在可以使用备份存储库配置配置映射配置 DPA

使用 Velero 1.15 及之后的版本,您现在可以配置每个存储库缓存的总大小。这可防止因为临时存储不足而无法移除 pod。请参阅以下新参数添加到 DPA 中的 NodeAgentConfig 字段中:

  • cacheLimitMB :以 MB 为单位设置本地数据缓存大小限制。
  • fullMaintenanceInterval :默认值为 24 小时。使用以下覆盖选项控制 Kopia 存储库中的已删除 Velero 备份率:

    • normalGC: 24 小时
    • fastGC: 12 小时
    • eagerGC: 6 小时

OADP-5900

提高 node-agent 安全性

在这个版本中,添加了以下更改:

  • 现在,在 DPA 中的 velero 字段中添加了新的 configuration 选项。
  • disableFsBackup 参数的默认值为 falsenon-existing。在这个版本中,以下选项添加到 SecurityContext 字段中:

    • Privileged: true
    • AllowPrivilegeEscalation: true
  • 如果将 disableFsBackup 参数设置为 true,它会从 node-agent 中删除以下挂载:

    • host-pods
    • host-plugins
  • 修改 node-agent 始终以非 root 用户身份运行。
  • 将 root 文件系统更改为只读方式。
  • 使用写访问权限更新以下挂载点:

    • /home/velero
    • tmp/credentials
  • SeccompProfileTypeRuntimeDefault 选项用于 SeccompProfile 参数。

OADP-5031

为并行项目备份添加 DPA 支持

默认情况下,只有一个线程处理一个项目块。Velero 1.16 支持并行项目备份,其中可以并行处理备份中的多个项目。

您可以使用可选的 Velero 服务器参数 --item-block-worker-count 来运行额外的 worker 线程来并行处理项目。要在 OADP 中启用此功能,请将 dpa.Spec.Configuration.Velero.ItemBlockWorkerCount 参数设置为大于零的整数值。

注意

目前还不支持并行运行多个完整备份。

OADP-5635

OADP 日志现在以 JSON 格式提供

随着 OADP 1.5.0 的发布,日志现在以 JSON 格式提供。它有助于在 Elastic logs 管理系统中包含预解析的数据。

OADP-3391

oc get dpa 命令现在显示 RECONCILED 状态

在这个版本中,oc get dpa 命令会显示 RECONCILED 状态,而不是只显示 NAMEAGE 以改进用户体验。例如:

$ oc get dpa -n openshift-adp
NAME            RECONCILED   AGE
velero-sample   True         2m51s

OADP-1338

1.2.1.6.2. 已解决的问题
容器现在对 terminationMessagePolicy 使用 FallbackToLogsOnError

在这个版本中,terminationMessagePolicy 字段可以为 Data Protection (OADP) Operator 容器(如 operator-manager,velero,node-agent, 和 non-admin-controller )设置 FallbackToLogsOnError 值。

此更改可确保容器退出并显示错误并且终止消息文件为空,OpenShift 会使用容器日志输出的最后一部分作为终止消息。

OADP-5183

命名空间管理员现在可以在恢复后访问应用程序

在以前的版本中,命名空间 admin 无法在恢复操作后执行应用程序。

执行失败并显示以下错误:

  • 不允许 exec 操作,因为 pod 的安全上下文超出您的权限
  • 无法针对任何安全性上下文约束进行验证
  • 用户或 serviceaccount, provider restricted-v2 不可用

在这个版本中,这个问题已被解决,命名空间 admin 可以在恢复后成功访问应用程序。

OADP-5611

现在,可以使用注解在单独的资源实例级别指定状态恢复

在以前的版本中,只有使用 Restore 自定义资源(CR)中的 restoreStatus 字段在资源类型中配置状态恢复。

在这个版本中,您可以使用以下注解在单独的资源实例级别指定状态恢复:

metadata:
  annotations:
    velero.io/restore-status: "true"

OADP-5968

现在,恢复可以成功使用 excludedClusterScopedResources

在以前的版本中,当执行将 excludeClusterScopedResources 字段设置为 storageclasses,Namespace 参数的应用程序备份时,备份可以成功,但恢复会部分失败。在这个版本中,恢复可以成功。

OADP-5239

备份已完成,即使它在 waitingForPluginOperations 阶段被重启

在以前的版本中,备份被标记为 failed,并带有以下错误消息:

failureReason: found a backup with status "InProgress" during the server starting,
mark it as "Failed"

在这个版本中,如果备份在 waitingForPluginOperations 阶段被重启,则会完成备份。

OADP-2941

现在,当 DPA 中的 ` disableFsbackup` 参数设置为 true 时,错误消息更为明确

在以前的版本中,当数据保护应用程序(DPA)的 spec.configuration.velero.disableFsBackup 字段被设置为 true 时,备份部分会失败并显示错误,但信息并不明确。

在这个版本中,错误消息更加明确,有助于对问题进行故障排除。例如,错误消息表示 disableFsBackup: true 是 DPA 中的问题,或者对于非管理员用户,则无法访问 DPA。

OADP-5952

在 parseAWSSecret 中处理 AWS STS 凭证

在以前的版本中,使用 STS 身份验证的 AWS 凭证不会被正确验证。

在这个版本中,parseAWSSecret 功能检测到特定于 STS 的字段,并更新 ensureSecretDataExists 功能来正确处理 STS 配置集。

OADP-6105

repositoryMaintenance 作业关联性配置可用于配置

在以前的版本中,DPA 规格中缺少存储库维护作业 pod 关联性的新配置。

在这个版本中,repositoryMaintenance 作业关联性配置可用于将 BackupRepository 标识符映射到其配置。

OADP-6134

当 CR 规格正确后,ValidationErrors 字段会消失

在以前的版本中,当使用错误 spec.schedule 值创建调度 CR,之后使用正确的值修补了这个值,ValidationErrors 字段仍然存在。因此,即使 spec 正确,ValidationErrors 字段也会显示不正确的信息。

在这个版本中,在 CR 规格正确后,ValidationErrors 字段将不再存在。

OADP-5419

当在 restoreSpec 中使用了 includedNamesapces 字段时,volumeSnapshotContents 自定义资源会被恢复

在以前的版本中,当在恢复规格中使用 includedNamespace 字段触发恢复操作时,恢复操作会成功完成,但没有创建 volumeSnapshotContents 自定义资源 (CR),且 PVC 处于 Pending 状态。

在这个版本中,即使 restoreSpec 中使用 includedNamesapces 字段,volumeSnapshotContents CR 也会被恢复。因此,应用程序 pod 在恢复后处于 Running 状态。

OADP-5939

OADP operator 在 AWS 上成功创建存储桶

在以前的版本中,容器使用 readOnlyRootFilesystem: true 设置进行配置,但代码会尝试使用 os.CreateTemp() 函数在 /tmp 目录中创建临时文件。因此,当将 AWS STS 身份验证与 Cloud Credential Operator (CCO) 流搭配使用时,OADP 无法创建 AWS 凭证处理所需的临时文件,并显示以下错误:

ERROR unable to determine if bucket exists. {"error": "open /tmp/aws-shared-credentials1211864681: read-only file system"}

在这个版本中,添加了以下更改来解决这个问题:

  • 在控制器 pod 规格中,有一个新的名为 tmp-diremptyDir 卷。
  • 一个卷挂载到容器,该容器将此卷挂载到 /tmp 目录中。
  • 对于安全最佳实践,可维护 readOnlyRootFilesystem: true
  • 使用推荐的 os.CreateTemp() 函数替换弃用的 ioutil.TempFile() 函数。
  • 删除了不必要的 io/ioutil 导入,这已不再需要。

OADP-6019

有关本发行版本中解决的所有问题的完整列表,请参阅 JIRA 中的 OADP 1.5.0 解决的问题列表。

1.2.1.6.3. 已知问题
Kopia 在备份过期后不会删除所有工件

在备份过期后,即使删除了备份,Kopia 也不会从 S3 位置的 ${bucket_name}/kopia/$openshift-adp 中删除卷工件。与过期和删除的数据文件相关的信息保留在元数据中。

为确保 OpenShift API for Data Protection (OADP) 可以正常工作,数据不会被删除,并存在于 /kopia/ 目录中,例如:

  • kopia.repository :主仓库格式信息,如加密、版本和其他信息。
  • kopia.blobcfg: 配置如何命名数据 Blob。
  • kopia.maintenance: 跟踪维护所有者,调度和最新成功的构建。
  • log: 日志 blobs.

OADP-5131

有关本发行版本中所有已知问题的完整列表,请参阅 JIRA 中的 OADP 1.5.0 已知问题 列表。

1.2.1.6.4. 弃用的功能
configuration.restic specification 字段已弃用

在 OpenShift API for Data Protection (OADP) 1.5.0 中,config.restic specification 字段已弃用。使用带有 uploaderType 字段的 nodeAgent 部分选择 kopiarestic 作为 uploaderType。请注意,Restic 在 OpenShift API for Data Protection (OADP) 1.5.0 中弃用。

OADP-5158

1.2.1.6.5. 技术预览功能
对 HyperShift 托管 OpenShift 集群的支持作为技术预览提供

OADP 可以作为技术预览支持并促进 HyperShift 托管 OpenShift 集群中的应用程序迁移。它为托管的集群中的应用程序确保无缝的备份和恢复操作。

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

OADP-3930

1.3. OADP 性能

1.4. OADP 功能和插件

请参阅 OpenShift API for Data Protection (OADP)功能和默认插件,这些插件将 Velero 与云供应商集成,以备份和恢复 Red Hat OpenShift Service on AWS 资源。这有助于您为备份和恢复环境选择正确的插件和功能。

1.4.1. OADP 功能

查看 OpenShift API 的备份、恢复和调度功能以进行数据保护(OADP),以保护 Red Hat OpenShift Service on AWS 上的应用程序。这有助于您了解数据保护策略的可用功能。

Backup

您可以使用 OADP 备份 OpenShift Platform 中的所有应用程序,或者您可以根据类型、命名空间或标签过滤资源。

OADP 通过将 Kubernetes 对象和内部镜像保存为对象存储上的存档文件来备份 Kubernetes 对象和内部镜像。OADP 使用原生云快照 API 或通过容器存储接口(CSI)创建快照来备份持久性卷(PV)。对于不支持快照的云供应商,OADP 使用 Restic 备份资源和 PV 数据。

注意

您必须从应用程序的备份中排除 Operator,以便成功备份和恢复。

恢复

您可以从备份中恢复资源和 PV。您可以恢复备份中的所有对象,或者根据命名空间、PV 或标签过滤对象。

注意

您必须从应用程序的备份中排除 Operator,以便成功备份和恢复。

调度
您可以通过指定的间隔调度备份。
钩子
您可以使用 hook 在 pod 上的容器中运行命令,如 fsfreeze 以冻结文件系统。您可以将 hook 配置为在备份或恢复之前或之后运行。恢复 hook 可以在 init 容器或应用程序容器中运行。

1.4.2. OADP 插件

查看 OpenShift API 为与存储供应商集成的数据保护(OADP)提供的默认 Velero 插件,以支持备份和恢复操作。这有助于您为云环境选择和配置正确的插件。

OADP 还为 Red Hat OpenShift Service on AWS 资源备份、OpenShift Virtualization 资源备份和 Container Storage Interface (CSI)快照提供了插件。

Expand
表 1.3. OADP 插件
OADP 插件功能存储位置

aws

备份和恢复 Kubernetes 对象。

AWS S3

使用快照备份和恢复卷。

AWS EBS

openshift

备份和恢复 Red Hat OpenShift Service on AWS 资源。[1]

对象存储

kubevirt

备份和恢复 OpenShift Virtualization 资源。[2]

对象存储

csi

使用 CSI 快照备份和恢复卷。[3]

支持 CSI 快照的云存储

hypershift

备份和恢复 HyperShift 托管集群资源。[4]

对象存储

  1. 必需。
  2. 虚拟机磁盘使用 CSI 快照或 Restic 备份。
  3. csi 插件使用 Kubernetes CSI 快照 API。

    • OADP 1.1 或更高版本使用 snapshot.storage.k8s.io/v1
    • OADP 1.0 使用 snapshot.storage.k8s.io/v1beta1
  4. 如果集群不是 HyperShift 托管的集群,请不要在 DataProtectionApplication 自定义资源中添加 hypershift 插件。

1.4.3. 关于 OADP Velero 插件

查看如何在 OADP 部署期间配置默认云供应商插件或安装自定义插件,以连接您的特定存储解决方案。这有助于您在环境中成功备份和恢复资源。

1.4.3.1. 默认 Velero 云供应商插件

当您在部署过程中配置 oadp_v1alpha1_dpa.yaml 文件时,您可以安装以下默认 Velero 云供应商插件:

  • aws (Amazon Web Services)
  • openshift (OpenShift Velero plugin)
  • csi (Container Storage Interface)
  • kubevirt (KubeVirt)

在部署过程中,您可以在 oadp_v1alpha1_dpa.yaml 文件中指定所需的默认插件。

以下 .yaml 文件会安装 openshiftawsazuregcp 插件:

 apiVersion: oadp.openshift.io/v1alpha1
 kind: DataProtectionApplication
 metadata:
   name: dpa-sample
 spec:
   configuration:
     velero:
       defaultPlugins:
       - openshift
       - aws
       - azure
       - gcp
1.4.3.2. 自定义 Velero 插件

您可在部署期间配置 oadp_v1alpha1_dpa.yaml 文件时,通过指定插件 镜像名称来安装自定义 Velero 插件。

在部署过程中,您可以在 oadp_v1alpha1_dpa.yaml 文件中指定所需的自定义插件。

以下 .yaml 文件会安装默认的 openshiftazuregcp 插件,以及一个自定义插件,其名称为 custom-plugin-example 和镜像 quay.io/example-repo/custom-velero-plugin

apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
metadata:
 name: dpa-sample
spec:
 configuration:
   velero:
     defaultPlugins:
     - openshift
     - azure
     - gcp
     customPlugins:
     - name: custom-plugin-example
       image: quay.io/example-repo/custom-velero-plugin

1.4.4. OADP 和 FIPS

Federal Information Processing Standards (FIPS)是由美国联邦政府利用联邦信息安全管理法案(FISMA)开发的一系列计算机安全标准。

OpenShift API for Data Protection (OADP)已被测试,并可用于启用了 FIPS 的 Red Hat OpenShift Service on AWS 集群。

1.4.5. 避免 Velero 插件 panic 错误

标记自定义备份存储位置(BSL),以便在 镜像流 备份过程中解决 Velero 插件 panic 错误。这有助于您在管理 DataProtectionApplication (DPA) CR 之外的 BSL 时,确保 OADP 控制器创建所需的 registry secret。

缺少 secret 可能会导致镜像流备份过程中 Velero 插件出现 panic 错误。当备份和 BSL 在 DPA 范围内管理时,OADP 控制器不会创建相关的 oadp-<bsl_name>-<bsl_provider>-registry-secret 参数。

在备份操作过程中,OpenShift Velero 插件在 镜像流 备份上 panic,并显示以下错误:

024-02-27T10:46:50.028951744Z time="2024-02-27T10:46:50Z" level=error msg="Error backing up item"
backup=openshift-adp/<backup name> error="error executing custom action (groupResource=imagestreams.image.openshift.io,
namespace=<BSL Name>, name=postgres): rpc error: code = Aborted desc = plugin panicked:
runtime error: index out of range with length 1, stack trace: goroutine 94…

流程

  1. 使用以下命令,使用相关标签标记自定义 BSL:

    $ oc label backupstoragelocations.velero.io <bsl_name> app.kubernetes.io/component=bsl
  2. 在标记 BSL 后,等待 DPA 协调。

    注意

    您可以通过对 DPA 本身进行任何更改来强制进行协调。

验证

  • 协调 DPA 后,使用以下命令确认已创建了参数,并且正确的 registry 数据已填充到其中:

    $ oc -n openshift-adp get secret/oadp-<bsl_name>-<bsl_provider>-registry-secret -o json | jq -r '.data'

在数据保护应用程序(DPA)配置中定义 velerocloudstorage,以防止意外 pod 崩溃。此配置解决了 openshift-adp-controller-manager pod 中在两个组件启用时发生的分段错误。

由于以下设置,openshift-adp-controller-manager pod 会失败并显示崩溃循环分段错误:

  • 如果您同时定义了 velerocloudstorageopenshift-adp-controller-manager 会失败。
  • 如果您没有同时定义 velerocloudstorageopenshift-adp-controller-manager 会失败。

如需更多信息,请参阅 OADP-1054

1.5. OADP 用例

要在 ROSA 上备份和恢复工作负载,您可以使用 OADP。您可以创建工作负载的备份,从备份中恢复它,并验证恢复。当不再需要时,您还可以清理 OADP Operator、备份存储和 AWS 资源。

使用带有 Red Hat OpenShift Service on AWS 的 OpenShift API for Data Protection (OADP)执行备份。以下示例 hello-world 应用没有附加持久性卷 (PV)。

数据保护应用程序 (DPA) 配置都将正常工作。

流程

  1. 运行以下命令,创建一个工作负载来备份:

    $ oc create namespace hello-world
    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
  2. 运行以下命令来公开路由:

    $ oc expose service/hello-openshift -n hello-world
  3. 运行以下命令检查应用程序是否正常工作:

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`

    您应该看到类似以下示例的输出:

    Hello OpenShift!
  4. 运行以下命令来备份工作负载:

    $ cat << EOF | oc create -f -
      apiVersion: velero.io/v1
      kind: Backup
      metadata:
        name: hello-world
        namespace: openshift-adp
      spec:
        includedNamespaces:
        - hello-world
        storageLocation: ${CLUSTER_NAME}-dpa-1
        ttl: 720h0m0s
    EOF
  5. 等待备份完成,然后运行以下命令:

    $ watch "oc -n openshift-adp get backup hello-world -o json | jq .status"

    您应该看到类似以下示例的输出:

    {
      "completionTimestamp": "2022-09-07T22:20:44Z",
      "expiration": "2022-10-07T22:20:22Z",
      "formatVersion": "1.1.0",
      "phase": "Completed",
      "progress": {
        "itemsBackedUp": 58,
        "totalItems": 58
      },
      "startTimestamp": "2022-09-07T22:20:22Z",
      "version": 1
    }
  6. 运行以下命令来删除 demo 工作负载:

    $ oc delete ns hello-world
  7. 运行以下命令,从备份中恢复工作负载:

    $ cat << EOF | oc create -f -
      apiVersion: velero.io/v1
      kind: Restore
      metadata:
        name: hello-world
        namespace: openshift-adp
      spec:
        backupName: hello-world
    EOF
  8. 运行以下命令等待 Restore 完成:

    $ watch "oc -n openshift-adp get restore hello-world -o json | jq .status"

    您应该看到类似以下示例的输出:

    {
      "completionTimestamp": "2022-09-07T22:25:47Z",
      "phase": "Completed",
      "progress": {
        "itemsRestored": 38,
        "totalItems": 38
      },
      "startTimestamp": "2022-09-07T22:25:28Z",
      "warnings": 9
    }
  9. 运行以下命令检查工作负载是否已恢复:

    $ oc -n hello-world get pods

    您应该看到类似以下示例的输出:

    NAME                              READY   STATUS    RESTARTS   AGE
    hello-openshift-9f885f7c6-kdjpj   1/1     Running   0          90s
  10. 运行以下命令来检查 JSONPath:

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`

    您应该看到类似以下示例的输出:

    Hello OpenShift!
    注意

    有关故障排除提示,请参阅 故障排除文档

1.5.1.2. 使用 OADP 和 ROSA STS 的备份后清理集群

将 Data Protection (OADP) Operator 的 OpenShift API 与 hello-world 示例中的备份和 S3 存储桶一起卸载。

流程

  1. 运行以下命令来删除工作负载:

    $ oc delete ns hello-world
  2. 运行以下命令来删除数据保护应用程序 (DPA):

    $ oc -n openshift-adp delete dpa ${CLUSTER_NAME}-dpa
  3. 运行以下命令来删除云存储:

    $ oc -n openshift-adp delete cloudstorage ${CLUSTER_NAME}-oadp
    警告

    如果这个命令挂起,您可能需要通过运行以下命令来删除终结器:

    $ oc -n openshift-adp patch cloudstorage ${CLUSTER_NAME}-oadp -p '{"metadata":{"finalizers":null}}' --type=merge
  4. 如果不再需要 Operator,请运行以下命令删除它:

    $ oc -n openshift-adp delete subscription oadp-operator
  5. 从 Operator 中删除命名空间:

    $ oc delete ns openshift-adp
  6. 如果不再需要备份和恢复资源,请运行以下命令从集群中删除它们:

    $ oc delete backups.velero.io hello-world
  7. 要删除 AWS S3 中的备份、恢复和远程对象,请运行以下命令:

    $ velero backup delete hello-world
  8. 如果您不再需要自定义资源定义 (CRD),请运行以下命令从集群中删除它们:

    $ for CRD in `oc get crds | grep velero | awk '{print $1}'`; do oc delete crd $CRD; done
  9. 运行以下命令来删除 AWS S3 存储桶:

    $ aws s3 rm s3://${CLUSTER_NAME}-oadp --recursive
    $ aws s3api delete-bucket --bucket ${CLUSTER_NAME}-oadp
  10. 运行以下命令,将策略从角色分离:

    $ aws iam detach-role-policy --role-name "${ROLE_NAME}"  --policy-arn "${POLICY_ARN}"
  11. 运行以下命令来删除角色:

    $ aws iam delete-role --role-name "${ROLE_NAME}"

以下是使用 OADP 和 ODF 备份应用程序的用例。

1.5.2.1. 使用 OADP 和 ODF 备份应用程序

在这种情况下,您可以使用 OADP 备份应用程序,并将备份存储在 Red Hat OpenShift Data Foundation (ODF) 提供的对象存储中。

  • 您可以创建一个对象存储桶声明(OBC)来配置备份存储位置。您可以使用 ODF 配置 Amazon S3 兼容对象存储桶。ODF 提供 MultiCloud Object Gateway (NooBaa MCG) 和 Ceph 对象网关,也称为 RADOS 网关(RGW)、对象存储服务。在这种情况下,您可以使用 NooBaa MCG 作为备份存储位置。
  • 您可以使用 aws 供应商插件在 OADP 中使用 NooBaa MCG 服务。
  • 您可以使用备份存储位置(BSL)配置数据保护应用程序(DPA)。
  • 您可以创建备份自定义资源(CR)并指定要备份的应用程序命名空间。
  • 您可以创建并验证备份。

先决条件

  • 已安装 OADP Operator。
  • 已安装 ODF Operator。
  • 您有一个应用程序,其数据库在单独的命名空间中运行。

流程

  1. 创建一个 OBC 清单文件来请求 NooBaa MCG 存储桶,如下例所示:

    apiVersion: objectbucket.io/v1alpha1
    kind: ObjectBucketClaim
    metadata:
      name: test-obc
      namespace: openshift-adp
    spec:
      storageClassName: openshift-storage.noobaa.io
      generateBucketName: test-backup-bucket

    其中:

    test-obc
    指定对象存储桶声明的名称。
    test-backup-bucket
    指定存储桶的名称。
  2. 运行以下命令来创建 OBC:

    $ oc create -f <obc_file_name>

    其中:

    <obc_file_name>
    指定对象存储桶声明清单的文件名。
  3. 当您创建 OBC 时,ODF 会创建一个 secret 和一个配置映射,其名称与对象存储桶声明相同。secret 具有存储桶凭证,配置映射有访问存储桶的信息。要从生成的配置映射中获取存储桶名称和存储桶主机,请运行以下命令:

    $ oc extract --to=- cm/test-obc

    test-obc 是 OBC 的名称。

    输出示例

    # BUCKET_NAME
    backup-c20...41fd
    # BUCKET_PORT
    443
    # BUCKET_REGION
    
    # BUCKET_SUBREGION
    
    # BUCKET_HOST
    s3.openshift-storage.svc

  4. 要从生成的 secret 获取存储桶凭证,请运行以下命令:

    $ oc extract --to=- secret/test-obc

    输出示例

    # AWS_ACCESS_KEY_ID
    ebYR....xLNMc
    # AWS_SECRET_ACCESS_KEY
    YXf...+NaCkdyC3QPym

  5. 运行以下命令,从 openshift-storage 命名空间中的 s3 路由获取 S3 端点的公共 URL:

    $ oc get route s3 -n openshift-storage
  6. 使用对象存储桶凭证创建一个 cloud-credentials 文件,如下所示:

    [default]
    aws_access_key_id=<AWS_ACCESS_KEY_ID>
    aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>
  7. 使用 cloud-credentials 文件内容创建 cloud-credentials secret,如下所示:

    $ oc create secret generic \
      cloud-credentials \
      -n openshift-adp \
      --from-file cloud=cloud-credentials
  8. 配置 Data Protection Application (DPA),如下例所示:

    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
      name: oadp-backup
      namespace: openshift-adp
    spec:
      configuration:
        nodeAgent:
          enable: true
          uploaderType: kopia
        velero:
          defaultPlugins:
            - aws
            - openshift
            - csi
          defaultSnapshotMoveData: true
      backupLocations:
        - velero:
            config:
              profile: "default"
              region: noobaa
              s3Url: https://s3.openshift-storage.svc
              s3ForcePathStyle: "true"
              insecureSkipTLSVerify: "true"
            provider: aws
            default: true
            credential:
              key: cloud
              name:  cloud-credentials
            objectStorage:
              bucket: <bucket_name>
              prefix: oadp

    其中:

    defaultSnapshotMoveData
    设置为 true 来使用 OADP Data Mover 将 Container Storage Interface (CSI)快照移动到远程对象存储。
    s3Url
    指定 ODF 存储的 S3 URL。
    <bucket_name>
    指定存储桶名称。
  9. 运行以下命令来创建 DPA:

    $ oc apply -f <dpa_filename>
  10. 运行以下命令,验证 DPA 是否已成功创建。在示例输出中,您可以看到 status 对象将 type 字段设置为 Reconciled。这意味着 DPA 已被成功创建。

    $ oc get dpa -o yaml

    输出示例

    apiVersion: v1
    items:
    - apiVersion: oadp.openshift.io/v1alpha1
      kind: DataProtectionApplication
      metadata:
        namespace: openshift-adp
        #...#
      spec:
        backupLocations:
        - velero:
            config:
              #...#
      status:
        conditions:
        - lastTransitionTime: "20....9:54:02Z"
          message: Reconcile complete
          reason: Complete
          status: "True"
          type: Reconciled
    kind: List
    metadata:
      resourceVersion: ""

  11. 运行以下命令,验证备份存储位置(BSL)是否可用:

    $ oc get backupstoragelocations.velero.io -n openshift-adp

    输出示例

    NAME           PHASE       LAST VALIDATED   AGE   DEFAULT
    dpa-sample-1   Available   3s               15s   true

  12. 配置备份 CR,如下例所示:

    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: test-backup
      namespace: openshift-adp
    spec:
      includedNamespaces:
      - <application_namespace>

    其中:

    <application_namespace>
    指定要备份的应用程序的命名空间。
  13. 运行以下命令来创建备份 CR:

    $ oc apply -f <backup_cr_filename>

验证

  • 运行以下命令,验证备份对象是否处于 Completed 阶段。如需了解更多详细信息,请参阅示例输出。

    $ oc describe backup test-backup -n openshift-adp

    输出示例

    Name:         test-backup
    Namespace:    openshift-adp
    # ....#
    Status:
      Backup Item Operations Attempted:  1
      Backup Item Operations Completed:  1
      Completion Timestamp:              2024-09-25T10:17:01Z
      Expiration:                        2024-10-25T10:16:31Z
      Format Version:                    1.1.0
      Hook Status:
      Phase:  Completed
      Progress:
        Items Backed Up:  34
        Total Items:      34
      Start Timestamp:    2024-09-25T10:16:31Z
      Version:            1
    Events:               <none>

以下是使用 OADP 的用例将备份恢复到不同的命名空间。

使用 OADP 将应用程序的备份恢复到新目标命名空间 test-restore-application。要恢复备份,请创建一个恢复自定义资源 (CR),如下例所示。在恢复 CR 中,源命名空间指的是您在备份中包含的应用程序命名空间。然后,您可以通过将项目更改为新的恢复的命名空间并验证资源来验证恢复。

先决条件

  • 已安装 OADP Operator。
  • 您已备份要恢复的应用程序。

流程

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

    apiVersion: velero.io/v1
    kind: Restore
    metadata:
      name: test-restore
      namespace: openshift-adp
    spec:
      backupName: <backup_name>
      restorePVs: true
      namespaceMapping:
        <application_namespace>: test-restore-application

    其中:

    test-restore
    指定恢复 CR 的名称。
    <backup_name>
    指定备份的名称。
    <application_namespace>
    指定要恢复到的目标命名空间。namespaceMapping 将源应用程序命名空间映射到目标应用程序命名空间。test-restore-application 是您要恢复备份的目标命名空间的名称。
  2. 运行以下命令来应用恢复 CR:

    $ oc apply -f <restore_cr_filename>

验证

  1. 运行以下命令验证恢复是否处于 Completed 阶段:

    $ oc describe restores.velero.io <restore_name> -n openshift-adp
  2. 运行以下命令,进入恢复的命名空间 test-restore-application

    $ oc project test-restore-application
  3. 运行以下命令,验证恢复的资源,如持久性卷声明(pvc)、服务(svc)、部署、secret 和配置映射:

    $ oc get pvc,svc,deployment,secret,configmap

    输出示例

    NAME                          STATUS   VOLUME
    persistentvolumeclaim/mysql   Bound    pvc-9b3583db-...-14b86
    
    NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    service/mysql      ClusterIP   172....157     <none>        3306/TCP   2m56s
    service/todolist   ClusterIP   172.....15     <none>        8000/TCP   2m56s
    
    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/mysql   0/1     1            0           2m55s
    
    NAME                                         TYPE                      DATA   AGE
    secret/builder-dockercfg-6bfmd               kubernetes.io/dockercfg   1      2m57s
    secret/default-dockercfg-hz9kz               kubernetes.io/dockercfg   1      2m57s
    secret/deployer-dockercfg-86cvd              kubernetes.io/dockercfg   1      2m57s
    secret/mysql-persistent-sa-dockercfg-rgp9b   kubernetes.io/dockercfg   1      2m57s
    
    NAME                                 DATA   AGE
    configmap/kube-root-ca.crt           1      2m57s
    configmap/openshift-service-ca.crt   1      2m57s

1.5.4. 在备份过程中包括自签名 CA 证书

您可以在数据保护应用程序(DPA)中包括自签名证书颁发机构(CA)证书,然后备份应用程序。您可以将备份存储在 Red Hat OpenShift Data Foundation (ODF) 提供的 NooBaa 存储桶中。

1.5.4.1. 备份应用程序及其自签名 CA 证书

ODF 提供的 s3.openshift-storage.svc 服务使用使用自签名服务 CA 签名的传输层安全协议 (TLS) 证书。

要防止 由未知颁发机构签名的证书,您必须在 DataProtectionApplication 自定义资源(CR)的备份存储位置(BSL)部分包含自签名 CA 证书。在这种情况下,您必须完成以下任务:

  • 通过创建对象存储桶声明(OBC)来请求 NooBaa 存储桶。
  • 提取存储桶详情。
  • DataProtectionApplication CR 中包含自签名 CA 证书。
  • 备份应用程序。

先决条件

  • 已安装 OADP Operator。
  • 已安装 ODF Operator。
  • 您有一个应用程序,其数据库在单独的命名空间中运行。

流程

  1. 创建 OBC 清单以请求 NooBaa 存储桶,如下例所示:

    apiVersion: objectbucket.io/v1alpha1
    kind: ObjectBucketClaim
    metadata:
      name: test-obc
      namespace: openshift-adp
    spec:
      storageClassName: openshift-storage.noobaa.io
      generateBucketName: test-backup-bucket

    其中:

    test-obc
    指定对象存储桶声明的名称。
    test-backup-bucket
    指定存储桶的名称。
  2. 运行以下命令来创建 OBC:

    $ oc create -f <obc_file_name>
  3. 当您创建 OBC 时,ODF 会创建一个 secret 和一个配置映射,其名称与对象存储桶声明相同。secret 对象包含存储桶凭证,ConfigMap 对象包含用于访问存储桶的信息。要从生成的配置映射中获取存储桶名称和存储桶主机,请运行以下命令:

    $ oc extract --to=- cm/test-obc

    test-obc 是 OBC 的名称。

    输出示例

    # BUCKET_NAME
    backup-c20...41fd
    # BUCKET_PORT
    443
    # BUCKET_REGION
    
    # BUCKET_SUBREGION
    
    # BUCKET_HOST
    s3.openshift-storage.svc

  4. 要从 secret 对象获取存储桶凭证,请运行以下命令:

    $ oc extract --to=- secret/test-obc

    输出示例

    # AWS_ACCESS_KEY_ID
    ebYR....xLNMc
    # AWS_SECRET_ACCESS_KEY
    YXf...+NaCkdyC3QPym

  5. 使用以下示例配置创建带有对象存储桶凭证的 cloud-credentials 文件:

    [default]
    aws_access_key_id=<AWS_ACCESS_KEY_ID>
    aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>
  6. 运行以下命令,创建带有 cloud-credentials 文件内容的 cloud-credentials secret:

    $ oc create secret generic \
      cloud-credentials \
      -n openshift-adp \
      --from-file cloud=cloud-credentials
  7. 运行以下命令,从 openshift-service-ca.crt 配置映射中提取服务 CA 证书。确保您以 Base64 格式编码证书,并记录下一步中使用的值。

    $ oc get cm/openshift-service-ca.crt \
      -o jsonpath='{.data.service-ca\.crt}' | base64 -w0; echo

    输出示例

    LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0...
    ....gpwOHMwaG9CRmk5a3....FLS0tLS0K

  8. 使用存储桶名称和 CA 证书配置 DataProtectionApplication CR 清单文件,如下例所示:

    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
      name: oadp-backup
      namespace: openshift-adp
    spec:
      configuration:
        nodeAgent:
          enable: true
          uploaderType: kopia
        velero:
          defaultPlugins:
            - aws
            - openshift
            - csi
          defaultSnapshotMoveData: true
      backupLocations:
        - velero:
            config:
              profile: "default"
              region: noobaa
              s3Url: https://s3.openshift-storage.svc
              s3ForcePathStyle: "true"
              insecureSkipTLSVerify: "false"
            provider: aws
            default: true
            credential:
              key: cloud
              name:  cloud-credentials
            objectStorage:
              bucket: <bucket_name>
              prefix: oadp
              caCert: <ca_cert>

    其中:

    insecureSkipTLSVerify
    指定是否启用了 SSL/TLS 安全性。如果设置为 true,则禁用 SSL/TLS 安全性。如果设置为 false,则启用 SSL/TLS 安全。
    <bucket_name>
    指定上一步中提取的存储桶的名称。
    <ca_cert>
    指定上一步中的 Base64 编码证书。
  9. 运行以下命令来创建 DataProtectionApplication CR:

    $ oc apply -f <dpa_filename>
  10. 运行以下命令验证 DataProtectionApplication CR 是否已成功创建:

    $ oc get dpa -o yaml

    输出示例

    apiVersion: v1
    items:
    - apiVersion: oadp.openshift.io/v1alpha1
      kind: DataProtectionApplication
      metadata:
        namespace: openshift-adp
        #...#
      spec:
        backupLocations:
        - velero:
            config:
              #...#
      status:
        conditions:
        - lastTransitionTime: "20....9:54:02Z"
          message: Reconcile complete
          reason: Complete
          status: "True"
          type: Reconciled
    kind: List
    metadata:
      resourceVersion: ""

  11. 运行以下命令,验证备份存储位置(BSL)是否可用:

    $ oc get backupstoragelocations.velero.io -n openshift-adp

    输出示例

    NAME           PHASE       LAST VALIDATED   AGE   DEFAULT
    dpa-sample-1   Available   3s               15s   true

  12. 使用以下示例配置 Backup CR:

    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: test-backup
      namespace: openshift-adp
    spec:
      includedNamespaces:
      - <application_namespace>

    其中:

    <application_namespace>
    指定要备份的应用程序的命名空间。
  13. 运行以下命令来创建 Backup CR:

    $ oc apply -f <backup_cr_filename>

验证

  • 运行以下命令,验证 Backup 对象是否处于 Completed 阶段:

    $ oc describe backup test-backup -n openshift-adp

    输出示例

    Name:         test-backup
    Namespace:    openshift-adp
    # ....#
    Status:
      Backup Item Operations Attempted:  1
      Backup Item Operations Completed:  1
      Completion Timestamp:              2024-09-25T10:17:01Z
      Expiration:                        2024-10-25T10:16:31Z
      Format Version:                    1.1.0
      Hook Status:
      Phase:  Completed
      Progress:
        Items Backed Up:  34
        Total Items:      34
      Start Timestamp:    2024-09-25T10:16:31Z
      Version:            1
    Events:               <none>

1.6. 安装和配置 OADP

1.6.1. 安装 OADP

在 Red Hat OpenShift Service on AWS 集群中使用 OpenShift API 进行数据保护(OADP)来备份和恢复应用程序数据。

在为数据保护(OADP)安装 OpenShift API 前,您必须为 OADP 设置角色和策略凭证,以便它可以使用 Amazon Web Services API。

这个过程在以下两个阶段执行:

  1. 准备 AWS 凭证
  2. 安装 OADP Operator 并为其提供 IAM 角色
1.6.1.1. 为 OADP 准备 AWS 凭证

准备并配置 Amazon Web Services 帐户,以便为数据保护(OADP)安装 OpenShift API。

流程

  1. 运行以下命令来创建以下环境变量:

    重要

    更改集群名称来匹配您的集群,并确保以管理员身份登录到集群。在继续操作前,确保所有字段被正常输出。

    $ export CLUSTER_NAME=<my_cluster>

    <my_cluster > 替换为您的集群名称。

    $ export ROSA_CLUSTER_ID=$(rosa describe cluster -c ${CLUSTER_NAME} --output json | jq -r .id)
    $ export REGION=$(rosa describe cluster -c ${CLUSTER_NAME} --output json | jq -r .region.id)
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o jsonpath='{.spec.serviceAccountIssuer}' | sed 's|^https://||')
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export CLUSTER_VERSION=$(rosa describe cluster -c ${CLUSTER_NAME} -o json | jq -r .version.raw_id | cut -f -2 -d '.')
    $ export ROLE_NAME="${CLUSTER_NAME}-openshift-oadp-aws-cloud-credentials"
    $ export SCRATCH="/tmp/${CLUSTER_NAME}/oadp"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster ID: ${ROSA_CLUSTER_ID}, Region: ${REGION}, OIDC Endpoint:
      ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"
  2. 在 AWS 帐户中,创建一个 IAM 策略以允许访问 AWS S3:

    1. 运行以下命令,检查策略是否存在:

      $ POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='RosaOadpVer1'].{ARN:Arn}" --output text)
      • RosaOadp :将 RosaOadp 替换为您的策略名称。
    2. 输入以下命令来创建策略 JSON 文件,然后创建策略:

      注意

      如果没有找到策略 ARN,命令会创建策略。如果策略 ARN 已存在,则 if 语句会有意跳过策略创建。

      $ if [[ -z "${POLICY_ARN}" ]]; then
        cat << EOF > ${SCRATCH}/policy.json
        {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "s3:CreateBucket",
              "s3:DeleteBucket",
              "s3:PutBucketTagging",
              "s3:GetBucketTagging",
              "s3:PutEncryptionConfiguration",
              "s3:GetEncryptionConfiguration",
              "s3:PutLifecycleConfiguration",
              "s3:GetLifecycleConfiguration",
              "s3:GetBucketLocation",
              "s3:ListBucket",
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObject",
              "s3:ListBucketMultipartUploads",
              "s3:AbortMultipartUpload",
              "s3:ListMultipartUploadParts",
              "ec2:DescribeSnapshots",
              "ec2:DescribeVolumes",
              "ec2:DescribeVolumeAttribute",
              "ec2:DescribeVolumesModifications",
              "ec2:DescribeVolumeStatus",
              "ec2:CreateTags",
              "ec2:CreateVolume",
              "ec2:CreateSnapshot",
              "ec2:DeleteSnapshot"
            ],
            "Resource": "*"
          }
        ]}
      EOF
      
        POLICY_ARN=$(aws iam create-policy --policy-name "RosaOadpVer1" \
        --policy-document file:///${SCRATCH}/policy.json --query Policy.Arn \
        --tags Key=rosa_openshift_version,Value=${CLUSTER_VERSION} Key=rosa_role_prefix,Value=ManagedOpenShift Key=operator_namespace,Value=openshift-oadp Key=operator_name,Value=openshift-oadp \
        --output text)
        fi
      • SCRATCH:SCRATCH 是为环境变量创建的临时目录的名称。
    3. 运行以下命令来查看策略 ARN:

      $ echo ${POLICY_ARN}
  3. 为集群创建 IAM 角色信任策略:

    1. 运行以下命令来创建信任策略文件:

      $ cat <<EOF > ${SCRATCH}/trust-policy.json
        {
            "Version": "2012-10-17",
            "Statement": [{
              "Effect": "Allow",
              "Principal": {
                "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_ENDPOINT}"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                "StringEquals": {
                  "${OIDC_ENDPOINT}:sub": [
                    "system:serviceaccount:openshift-adp:openshift-adp-controller-manager",
                    "system:serviceaccount:openshift-adp:velero"]
                }
              }
            }]
        }
      EOF
    2. 运行以下命令来创建角色:

      $ ROLE_ARN=$(aws iam create-role --role-name \
        "${ROLE_NAME}" \
        --assume-role-policy-document file://${SCRATCH}/trust-policy.json \
        --tags Key=rosa_cluster_id,Value=${ROSA_CLUSTER_ID} \
               Key=rosa_openshift_version,Value=${CLUSTER_VERSION} \
               Key=rosa_role_prefix,Value=ManagedOpenShift \
               Key=operator_namespace,Value=openshift-adp \
               Key=operator_name,Value=openshift-oadp \
        --query Role.Arn --output text)
    3. 运行以下命令来查看角色 ARN:

      $ echo ${ROLE_ARN}
  4. 运行以下命令,将 IAM 策略附加到 IAM 角色:

    $ aws iam attach-role-policy --role-name "${ROLE_NAME}" \
      --policy-arn ${POLICY_ARN}
1.6.1.2. 安装 OADP Operator 并提供 IAM 角色

在使用 AWS STS 的集群中安装用于数据保护(OADP)的 OpenShift API。AWS 安全令牌服务 (AWS STS) 是一个全局 Web 服务,它为 IAM 或联邦用户提供简短凭证。使用 STS 的 Red Hat OpenShift Service on AWS 是推荐的凭证模式。

重要

不支持 Restic。

在备份不支持 Container Storage Interface (CSI)快照的文件系统时,支持使用 Kopia 文件系统备份(FSB)。

文件系统示例包括:

  • Amazon Elastic File System (EFS)
  • 网络文件系统 (NFS)
  • emptyDir
  • 本地卷

对于备份卷,使用 AWS STS 的 OADP on ROSA 仅支持原生快照和 Container Storage Interface (CSI) 快照。Data Mover 备份被支持,但可能会比原生快照慢。

在使用 STS 验证的 Amazon ROSA 集群中,不支持在不同的 AWS 区域中恢复备份数据。

先决条件

  • 具有所需访问和令牌的 Red Hat OpenShift Service on AWS 集群。具体步骤请查看为 OADP 准备 AWS 凭证。如果您计划使用两个不同的集群来备份和恢复,您必须为每个集群准备 AWS 凭证,包括 ROLE_ARN

流程

  1. 输入以下命令,从 AWS 令牌文件创建 Red Hat OpenShift Service on AWS secret:

    1. 创建凭证文件:

      $ cat <<EOF > ${SCRATCH}/credentials
        [default]
        role_arn = ${ROLE_ARN}
        web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
        region = <aws_region>
      EOF

      <aws_region> 替换为用于 STS 端点的 AWS 区域。

    2. 为 OADP 创建命名空间:

      $ oc create namespace openshift-adp
    3. 创建 Red Hat OpenShift Service on AWS secret:

      $ oc -n openshift-adp create secret generic cloud-credentials \
        --from-file=${SCRATCH}/credentials
      注意

      在 Red Hat OpenShift Service on AWS 4.15 及之后的版本中,OADP Operator 通过 Operator Lifecycle Manager (OLM)和 Cloud Credentials Operator (CCO)支持新的标准化 STS 工作流。在此工作流中,您不需要创建上述 secret,您只需要在使用 Red Hat OpenShift Service on AWS Web 控制台安装 OLM 管理的 Operator 的过程中提供角色 ARN,以了解有关 使用 Web 控制台从软件目录安装 的更多信息。

      前面的 secret 由 CCO 自动创建。

  2. 安装 OADP Operator:

    1. 在 Red Hat OpenShift Service on AWS web 控制台中浏览 生态系统Software Catalog
    2. 搜索 OADP Operator
    3. role_ARN 字段中,粘贴之前创建的 role_arn,再点 Install
  3. 输入以下命令,使用 AWS 凭证创建 AWS 云存储:

    $ cat << EOF | oc create -f -
      apiVersion: oadp.openshift.io/v1alpha1
      kind: CloudStorage
      metadata:
        name: ${CLUSTER_NAME}-oadp
        namespace: openshift-adp
      spec:
        creationSecret:
          key: credentials
          name: cloud-credentials
        enableSharedConfig: true
        name: ${CLUSTER_NAME}-oadp
        provider: aws
        region: $REGION
    EOF
  4. 输入以下命令检查应用程序的存储默认存储类:

    $ oc get pvc -n <namespace>
    NAME     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    applog   Bound    pvc-351791ae-b6ab-4e8b-88a4-30f73caf5ef8   1Gi        RWO            gp3-csi        4d19h
    mysql    Bound    pvc-16b8e009-a20a-4379-accc-bc81fedd0621   1Gi        RWO            gp3-csi        4d19h
  5. 运行以下命令来获取存储类:

    $ oc get storageclass
    NAME                PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    gp2                 kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   true                   4d21h
    gp2-csi             ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h
    gp3                 ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h
    gp3-csi (default)   ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h
    注意

    以下存储类可以正常工作:

    • gp3-csi
    • gp2-csi
    • gp3
    • gp2

    如果要备份的应用程序或应用程序都使用带有 Container Storage Interface (CSI) 的持久性卷 (PV),建议在 OADP DPA 配置中包含 CSI 插件。

  6. 创建 DataProtectionApplication 资源,以配置存储备份和卷快照的存储的连接:

    1. 如果您只使用 CSI 卷,请输入以下命令部署数据保护应用程序:

      $ cat << EOF | oc create -f -
        apiVersion: oadp.openshift.io/v1alpha1
        kind: DataProtectionApplication
        metadata:
          name: ${CLUSTER_NAME}-dpa
          namespace: openshift-adp
        spec:
          backupImages: true
          features:
            dataMover:
              enable: false
          backupLocations:
          - bucket:
              cloudStorageRef:
                name: ${CLUSTER_NAME}-oadp
              credential:
                key: credentials
                name: cloud-credentials
              prefix: velero
              default: true
              config:
                region: ${REGION}
          configuration:
            velero:
              defaultPlugins:
              - openshift
              - aws
              - csi
            nodeAgent:
              enable: false
              uploaderType: kopia
      EOF

      其中:

      backupImages
      Red Hat OpenShift Service on AWS 支持内部镜像备份。如果您不想使用镜像备份,请将此字段设置为 false
      nodeAgent
      请参阅此流程末尾的 nodeAgent 属性的重要备注。
      uploaderType
      指定上传器的类型。内置 Data Mover 使用 Kopia 作为默认的上传程序机制,无论 uploaderType 字段的值是什么。
    2. 如果使用 CSI 或非 CSI 卷,请输入以下命令来部署数据保护应用程序:

      $ cat << EOF | oc create -f -
        apiVersion: oadp.openshift.io/v1alpha1
        kind: DataProtectionApplication
        metadata:
          name: ${CLUSTER_NAME}-dpa
          namespace: openshift-adp
        spec:
          backupImages: true
          backupLocations:
          - bucket:
              cloudStorageRef:
                name: ${CLUSTER_NAME}-oadp
              credential:
                key: credentials
                name: cloud-credentials
              prefix: velero
              default: true
              config:
                region: ${REGION}
          configuration:
            velero:
              defaultPlugins:
              - openshift
              - aws
            nodeAgent:
              enable: false
              uploaderType: restic
          snapshotLocations:
            - velero:
                config:
                  credentialsFile: /tmp/credentials/openshift-adp/cloud-credentials-credentials
                  enableSharedConfig: "true"
                  profile: default
                  region: ${REGION}
                provider: aws
      EOF

      其中:

      backupImages
      Red Hat OpenShift Service on AWS 支持内部镜像备份。如果您不想使用镜像备份,请将此字段设置为 false
      nodeAgent
      请参阅此流程末尾的 nodeAgent 属性的重要备注。
      credentialsFile
      指定 pod 上存储桶凭证的挂载位置。
      enableSharedConfig
      指定 snapshotLocations 是否可以共享,或重复使用为存储桶定义的凭证。
      配置集
      指定 AWS 凭证文件中设置的配置集名称。
      region

      指定 AWS 区域。这必须与集群区域相同。

      现在,您可以备份和恢复 Red Hat OpenShift Service on AWS 应用程序,如 备份应用程序 中所述。

      重要

      此配置中的 resticenable 参数设置为 false,因为 OADP 不支持 Red Hat OpenShift Service on AWS 环境中的 Restic。

    如果要使用两个不同的集群来备份和恢复,则两个集群必须在云存储 CR 和 OADP DataProtectionApplication 配置中具有相同的 AWS S3 存储名称。

1.6.1.3. 更新 OADP Operator 订阅中 IAM 角色 ARN

更新 OADP Operator 订阅,修复安装错误,因为 IAM 角色 Amazon Resource Name (ARN)不正确。

在 Red Hat OpenShift Service on AWS 集群上安装 OADP Operator 时,如果您提供不正确的 IAM 角色 Amazon Resource Name (ARN),openshift-adp-controller pod 会出错。生成的凭证请求包含错误的 IAM 角色 ARN。要使用正确的 IAM 角色 ARN 更新凭证请求对象,您可以编辑 OADP Operator 订阅并使用正确的值修补 IAM 角色 ARN。通过编辑 OADP Operator 订阅,您不必卸载和重新安装 OADP 来更新 IAM 角色 ARN。

先决条件

  • 您有一个带有所需访问和令牌的 Red Hat OpenShift Service on AWS 集群。
  • 您已在 ROSA STS 集群中安装了 OADP。

流程

  1. 要验证 OADP 订阅是否有错误的 IAM 角色 ARN 环境变量设置,请运行以下命令:

    $ oc get sub -o yaml redhat-oadp-operator

    订阅示例

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      annotations:
      creationTimestamp: "2025-01-15T07:18:31Z"
      generation: 1
      labels:
        operators.coreos.com/redhat-oadp-operator.openshift-adp: ""
      name: redhat-oadp-operator
      namespace: openshift-adp
      resourceVersion: "77363"
      uid: 5ba00906-5ad2-4476-ae7b-ffa90986283d
    spec:
      channel: stable-1.4
      config:
        env:
        - name: ROLEARN
          value: arn:aws:iam::11111111:role/wrong-role-arn
      installPlanApproval: Manual
      name: redhat-oadp-operator
      source: prestage-operators
      sourceNamespace: openshift-marketplace
      startingCSV: oadp-operator.v1.4.2

    其中:

    ROLEARN
    验证您要更新的 ROLEARN 的值。
  2. 运行以下命令,使用正确的角色 ARN 更新订阅的 ROLEARN 字段:

    $ oc patch subscription redhat-oadp-operator -p '{"spec": {"config": {"env": [{"name": "ROLEARN", "value": "<role_arn>"}]}}}' --type='merge'

    其中:

    <role_arn>
    指定要更新的 IAM 角色 ARN。例如,arn:aws:iam::160…​..6956:role/oadprosa…​.8wlf.
  3. 运行以下命令,验证 secret 对象是否使用正确的角色 ARN 值更新:

    $ oc get secret cloud-credentials -o jsonpath='{.data.credentials}' | base64 -d

    输出示例

    [default]
    sts_regional_endpoints = regional
    role_arn = arn:aws:iam::160.....6956:role/oadprosa.....8wlf
    web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token

  4. 配置 DataProtectionApplication 自定义资源(CR)清单文件,如下例所示:

    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
      name: test-rosa-dpa
      namespace: openshift-adp
    spec:
      backupLocations:
      - bucket:
          config:
            region: us-east-1
          cloudStorageRef:
            name: <cloud_storage>
          credential:
            name: cloud-credentials
            key: credentials
          prefix: velero
          default: true
      configuration:
        velero:
          defaultPlugins:
          - aws
          - openshift

    其中:

    <cloud_storage>
    指定 CloudStorage CR。
  5. 运行以下命令来创建 DataProtectionApplication CR:

    $ oc create -f <dpa_manifest_file>
  6. 运行以下命令,验证 DataProtectionApplication CR 是否已协调,状态 是否已设置为 "True"

    $  oc get dpa -n openshift-adp -o yaml

    DataProtectionApplication示例

    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    ...
    status:
        conditions:
        - lastTransitionTime: "2023-07-31T04:48:12Z"
          message: Reconcile complete
          reason: Complete
          status: "True"
          type: Reconciled

  7. 运行以下命令,验证 BackupStorageLocation CR 是否处于 available 状态:

    $ oc get backupstoragelocations.velero.io -n openshift-adp

    BackupStorageLocation示例

    NAME       PHASE       LAST VALIDATED   AGE   DEFAULT
    ts-dpa-1   Available   3s               6s    true

1.7. OADP 备份

1.7.1. 备份应用程序

通过使用 Kopia 或 Restic 的快照、CSI 或文件系统备份创建 Backup 自定义资源(CR)来备份应用程序。

频繁备份可能会消耗备份存储位置的存储。如果使用非本地备份,请检查备份、保留时间以及持久性卷(PV)的数据量的频率,如 S3 存储桶。由于所有备份都会保留直到它们过期,因此请检查调度生存时间(TTL)设置。

参阅以下有关使用 OADP 备份应用程序的信息:

Backup CR 为 Kubernetes 资源和 S3 对象存储上的内部镜像创建备份文件。

重要

…​/.snapshot 目录是一个快照复制目录,由多个 NFS 服务器使用。该目录默认具有只读访问权限,因此 Velero 无法恢复到这个目录中。

不要向 Velero 提供对 .snapshot 目录的写入权限,并禁用客户端对这个目录的访问。

1.7.1.1. 在运行备份和恢复前预览资源

通过空运行备份和恢复操作,预先预览备份和恢复资源。这有助于您在提交完整备份或恢复前验证将包含哪些资源。

OADP 根据类型、命名空间或标签备份应用程序资源。这意味着您可以在备份完成后查看资源。同样,您可以在恢复操作完成后根据命名空间、持久性卷(PV)或标签查看恢复的对象。

先决条件

  • 已安装 OADP Operator。

流程

  1. 要在运行实际备份前预览备份中包含的资源,请运行以下命令:

    $ velero backup create <backup-name> --snapshot-volumes false

    --snapshot-volumes 参数的值 指定为 false

  2. 要了解有关备份资源的更多详细信息,请运行以下命令:

    $ velero describe backup <backup_name> --details

    <backup_name > 替换为备份的名称。

  3. 要在运行实际恢复前预览恢复中包含的资源,请运行以下命令:

    $ velero restore create --from-backup <backup_name>

    <backup_name > 替换为备份的名称。

    重要

    velero restore create 命令在集群中创建恢复资源。在查看资源后,您必须删除作为恢复的一部分创建的资源。

  4. 要了解有关恢复资源的更多详细信息,请运行以下命令:

    $ velero describe restore <restore_name> --details

    <restore_name > 替换为恢复的名称。

1.7.2. 创建备份 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.velero.io -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>
      includedResources: []
      excludedResources: []
      storageLocation: <velero-sample-1>
      ttl: 720h0m0s
      labelSelector:
        matchLabels:
          app: <label_1>
          app: <label_2>
          app: <label_3>
      orLabelSelectors:
      - matchLabels:
          app: <label_1>
          app: <label_2>
          app: <label_3>

    其中:

    <namespace>
    指定要备份的命名空间数组。
    includedResources
    可选:指定要包含在备份中的资源数组。资源可以是缩写方式(例如,po 代表 pods)或完全限定的方式。如果未指定,则会包含所有资源。
    excludedResources
    可选:指定要从备份中排除的资源数组。资源可以是缩写方式(例如,po 代表 pods)或完全限定的方式。
    <velero-sample-1>
    指定 backupStorageLocations CR 的名称。
    labelSelector
    指定 具有所有 指定标签的备份资源的 {key,value} 对映射。
    orLabelSelectors
    指定 具有一个或多个 指定标签的备份资源的 {key,value} 对映射。
  3. 验证 Backup CR 的状态是否为 Completed

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

1.7.3. 创建备份 hook

通过编辑 Backup 自定义资源(CR)来创建备份 hook,以便在 pod 中的容器中运行命令。这有助于您运行 pre-backup 和 post-backup 操作,如静止数据库或清空数据到磁盘。

可将命令配置为在任何自定义操作处理(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>
            excludedNamespaces:
            - <namespace>
            includedResources: []
            - pods
            excludedResources: []
            labelSelector:
              matchLabels:
                app: velero
                component: server
            pre:
              - exec:
                  container: <container>
                  command:
                  - /bin/uname
                  - -a
                  onError: Fail
                  timeout: 30s
            post:
    ...

    其中:

    <namespace>
    可选:指定 hook 应用的命名空间。如果没有指定这个值,则 hook 适用于所有命名空间。
    excludedNamespaces
    可选:指定 hook 不应用到的命名空间。
    pods
    目前,pod 是唯一可以应用 hook 的支持的资源。
    excludedResources
    可选:指定 hook 不应用到的资源。
    labelSelector
    可选:此 hook 仅适用于与标签匹配的对象。如果没有指定这个值,则 hook 适用于所有对象。
    pre
    指定在备份前运行的一组 hook。
    <container>
    可选:指定命令运行的容器。如果没有指定容器,该命令将在 pod 中的第一个容器中运行。
    /bin/uname
    指定正在添加的 init 容器的入口点。
    onError: Fail
    指定错误处理行为。允许的值是 FailContinue。默认值为 Fail
    Timeout: 30s
    可选:指定等待命令运行的时间。默认值为 30s
    post
    指定在备份后运行的一组 hook,其参数与 pre-backup hook 相同。

1.7.4. 使用 Schedule CR 调度备份

通过使用 Cron 表达式创建 Schedule 自定义资源(CR)来调度备份操作。这有助于您定期自动重复应用程序数据备份。

您可以通过创建 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 * * *
      template:
        hooks: {}
        includedNamespaces:
        - <namespace>
        storageLocation: <velero-sample-1>
        defaultVolumesToFsBackup: true
        ttl: 720h0m0s
    EOF

    其中:

    schedule: 0 7 * *

    指定调度备份的 cron 表达式,例如 0 7 * * * 在每天 7:00 执行备份。

    注意

    要以特定间隔调度备份,以以下格式输入 <duration_in_minutes>

      schedule: "*/10 * * * *"

    在引号 (" ") 之间输入分钟值。

    <namespace>
    指定要备份的命名空间数组。
    <velero-sample-1>
    指定 backupStorageLocations CR 的名称。
    defaultVolumesToFsBackup: true
    可选:在 OADP 版本 1.2 及更高版本中,在使用 Restic 进行卷备份时,将 defaultVolumesToFsBackup: true 键值对添加到您的配置中。在 OADP 版本 1.1 中,在使用 Restic 备份卷时添加 defaultVolumesToRestic: true 键值对。

验证

  • 在调度的备份运行后验证 Schedule CR 的状态是否为 Completed

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

1.7.5. 删除备份

通过创建 DeleteBackupRequest 自定义资源(CR)或运行 velero 备份 delete 命令删除备份。这有助于您释放存储空间并删除过时的备份工件。

根据备份的方法,卷备份工件会在不同的时间删除:

  • Restic:在删除备份后,工件会在下一个完整的维护周期中删除。
  • Container Storage Interface (CSI):当删除备份时,工件会被立即删除。
  • Kopia:在删除备份后,工件会在 Kopia 存储库的三个完整维护周期后删除。

通过创建 DeleteBackupRequest 自定义资源(CR)来删除备份。这有助于您从存储中删除特定的备份及其关联的卷工件。

先决条件

  • 您已运行应用程序的备份。

流程

  1. 创建 DeleteBackupRequest CR 清单文件:

    apiVersion: velero.io/v1
    kind: DeleteBackupRequest
    metadata:
      name: deletebackuprequest
      namespace: openshift-adp
    spec:
      backupName: <backup_name>

    <backup_name > 替换为备份的名称。

  2. 应用 DeleteBackupRequest CR 以删除备份:

    $ oc apply -f <deletebackuprequest_cr_filename>
1.7.5.2. 使用 Velero CLI 删除备份

使用 Velero CLI 删除备份来运行 velero 备份 delete 命令。这有助于您快速从存储中删除备份及其关联的卷工件。

先决条件

  • 您已运行应用程序的备份。
  • 下载 Velero CLI,并可以访问集群中的 Velero 二进制文件。

流程

  • 要删除备份,请运行以下 Velero 命令:

    $ velero backup delete <backup_name> -n openshift-adp

    <backup_name > 替换为备份的名称。

1.7.5.3. 关于 Kopia 仓库维护

Kopia 存储库维护有两种类型,即快速和全,自动运行以优化索引性能并执行垃圾回收。了解这两种类型可帮助您了解维护周期以及备份工件所需的时间。

快速维护
  • 每小时运行一次,以保持索引 Blob (n) 数量较低。大量索引对 Kopia 操作的性能会造成负面影响。
  • 在没有确定存在同一元数据的另一个副本的情况下,请勿从仓库中删除任何元数据。
完整维护
  • 每 24 小时运行一次,以对不再需要仓库内容进行垃圾回收处理。
  • snapshot-gc 是一个完整的维护任务,它会找到所有无法从快照清单访问的文件和目录列表,并将其标记为已删除。
  • 完整维护操作有较高的资源成不,因为它需要扫描集群中所有活跃的快照中的所有目录。
1.7.5.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 小时。

1.7.5.4. 删除备份仓库

删除 backuprepository 自定义资源(CR)以完成备份删除过程。这有助于您确保所有备份元数据和工件都从存储中完全移除。

在删除备份后,当 Kopia 仓库维护周期删除了相关工件后,备份不再被任何元数据或清单对象引用。

先决条件

  • 您已删除应用程序的备份。
  • 在备份被删除后,您最多等待 72 小时。在此期间 Kopia 可以运行仓库维护周期。

流程

  1. 要获取备份的备份仓库 CR 的名称,请运行以下命令:

    $ oc get backuprepositories.velero.io -n openshift-adp
  2. 要删除备份仓库 CR,请运行以下命令:

    $ oc delete backuprepository <backup_repository_name> -n openshift-adp

    <backup_repository_name > 替换为备份存储库的名称。

1.8. OADP 恢复

1.8.1. 恢复应用程序

在运行恢复前,通过预览资源来恢复应用程序备份,创建 Restore 自定义资源(CR),并配置 restore hook 在恢复的 pod 中运行命令。这有助于您在控制恢复过程时恢复应用程序数据和配置。

1.8.1.1. 在运行备份和恢复前预览资源

通过空运行备份和恢复操作,预先预览备份和恢复资源。这有助于您在提交完整备份或恢复前验证将包含哪些资源。

OADP 根据类型、命名空间或标签备份应用程序资源。这意味着您可以在备份完成后查看资源。同样,您可以在恢复操作完成后根据命名空间、持久性卷(PV)或标签查看恢复的对象。

先决条件

  • 已安装 OADP Operator。

流程

  1. 要在运行实际备份前预览备份中包含的资源,请运行以下命令:

    $ velero backup create <backup-name> --snapshot-volumes false

    --snapshot-volumes 参数的值 指定为 false

  2. 要了解有关备份资源的更多详细信息,请运行以下命令:

    $ velero describe backup <backup_name> --details

    <backup_name > 替换为备份的名称。

  3. 要在运行实际恢复前预览恢复中包含的资源,请运行以下命令:

    $ velero restore create --from-backup <backup_name>

    <backup_name > 替换为备份的名称。

    重要

    velero restore create 命令在集群中创建恢复资源。在查看资源后,您必须删除作为恢复的一部分创建的资源。

  4. 要了解有关恢复资源的更多详细信息,请运行以下命令:

    $ velero describe restore <restore_name> --details

    <restore_name > 替换为恢复的名称。

1.8.1.2. 创建恢复 CR

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

当您恢复使用 azurefile-csi 存储类的有状态应用程序时,恢复操作会保留在 Finalizing 阶段。

先决条件

  • 您必须安装用于数据保护(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>
      includedResources: []
      excludedResources:
      - nodes
      - events
      - events.events.k8s.io
      - backups.velero.io
      - restores.velero.io
      - resticrepositories.velero.io
      restorePVs: true

    其中:

    <backup>
    指定 Backup CR 的名称。
    includedResources
    可选:指定要包含在恢复过程中的资源数组。资源可以是缩写方式(例如,po 代表 pods)或完全限定的方式。如果未指定,则会包含所有资源。
    restorePVs: true
    可选: restorePV 参数可以设置为 false,以从 Container Storage Interface (CSI) 快照的 VolumeSnapshot 或配置 VolumeSnapshotLocation 时从原生快照中恢复 PersistentVolume
  2. 输入以下命令验证 Restore CR 的状态是否为 Completed

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

    $ oc get all -n <namespace>

    其中:

    <namespace>
    指定您备份的命名空间。
  4. 如果您使用卷恢复 DeploymentConfig,或使用 post-restore hook,请输入以下命令运行 dc-post-restore.sh cleanup 脚本:

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

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

    #!/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}"
    }
    
    if [[ $# -ne 1 ]]; then
        echo "usage: ${BASH_SOURCE} restore-name"
        exit 1
    fi
    
    echo "restore: $1"
    
    label=$(label_name $1)
    echo "label:   $label"
    
    echo Deleting disconnected restore pods
    oc delete pods --all-namespaces -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
1.8.1.3. 创建恢复 hook

通过编辑 Restore 自定义资源(CR)来创建恢复 hook,以便在 pod 中的容器中运行命令。

您可以创建两种类型的恢复 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>
            excludedNamespaces:
            - <namespace>
            includedResources:
            - pods
            excludedResources: []
            labelSelector:
              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:
            - exec:
                container: <container>
                command:
                - /bin/bash
                - -c
                - "psql < /backup/backup.sql"
                waitTimeout: 5m
                execTimeout: 1m
                onError: Continue

    其中:

    <namespace>
    可选:指定 hook 应用的命名空间数组。如果没有指定这个值,则 hook 适用于所有命名空间。
    pods
    目前,pod 是唯一可以应用 hook 的支持的资源。
    labelSelector
    可选:此 hook 仅适用于与标签选择器匹配的对象。
    timeout
    可选:指定 Velero 等待 initContainers 完成的最大时间长度。
    <container>
    可选:指定命令运行的容器。如果没有指定容器,该命令将在 pod 中的第一个容器中运行。
    /bin/bash
    指定添加的 init 容器的入口点。
    waitTimeout: 5m
    可选:指定等待容器就绪的时间。这应该足够长,以便容器可以启动,在相同容器中的任何以前的 hook 可以完成。如果没有设置,恢复过程会无限期等待。
    execTimeout: 1m
    可选:指定等待命令运行的时间。默认值为 30s
    onError: Continue

    指定错误处理行为。允许的值是 FailContinue

    • Continue: 只记录命令失败。
    • Fail: 任何 pod 中的任何容器中没有更多恢复 hook 运行。Restore CR 的状态将是 PartiallyFailed

在文件系统备份(FSB)恢复操作中,引用 ImageStreamDeployment 资源没有被正确恢复。恢复运行 FSB 的 pod,postHook 会被提前终止。

这是因为在恢复操作中,OpenShift 控制器使用更新的 ImageStreamTag 哈希更新 Deployment 资源中的 spec.template.spec.containers[0].image 字段。更新会触发新 pod 的推出,终止 velero 运行 FSB 和后恢复 hook 的 pod。有关镜像流触发器的更多信息,请参阅"镜像流更改的触发更新"。

这个行为的临时解决方案分为两个步骤:

  1. 首先,执行排除 Deployment 资源的恢复,例如:

    $ velero restore create <RESTORE_NAME> \
      --from-backup <BACKUP_NAME> \
      --exclude-resources=deployment.apps
  2. 第一次恢复成功后,通过包含这些资源来执行第二次恢复,例如:

    $ velero restore create <RESTORE_NAME> \
      --from-backup <BACKUP_NAME> \
      --include-resources=deployment.apps
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

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

让开源更具包容性

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

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部