备份和恢复
备份和恢复 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)选项。
| Version | Red Hat OpenShift Service on AWS 版本 | 公开发行(GA) | 完全支持结束 | 维护结束 | 延长更新支持(EUS) | 延长更新支持条款 2 (EUS Term 2) |
| 1.5 |
| 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 |
| 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 |
| 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 版本 复制链接链接已复制到粘贴板!
| 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 集群的整体升级持续时间。
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 自助服务中的备份创建过程中资源冲突。因此,协调尝试失败并显示对象被修改的错误。当前还没有已知的临时解决方案。
1.2.1.2.2. 已解决的问题 复制链接链接已复制到粘贴板!
- OADP 1.5.4 修复以下 CVE
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 兼容存储时。
1.2.1.5. OADP 1.5.1 发行注记 复制链接链接已复制到粘贴板!
用于数据保护(OADP) 1.5.1 的 OpenShift API 发行注记列出了新功能、已解决的问题、已知问题和已弃用的功能。
1.2.1.5.1. 新功能 复制链接链接已复制到粘贴板!
CloudStorageAPI 完全支持在此版本之前,
CloudStorageAPI 功能作为一个技术预览提供,在 OADP 1.5.1 中被完全支持。CloudStorageAPI 会自动为对象存储创建存储桶。- 新的
DataProtectionTest自定义资源可用 DataProtectionTest(DPT) 是一个自定义资源 (CR),它提供验证 OADP 配置的框架。DPT CR 检查并报告以下参数信息:
- 将备份上传到对象存储的性能。
- 持久性卷声明的 Container Storage Interface (CSI) 快照就绪。
- 存储桶配置,如加密和版本控制。
在 DPT CR 中使用此信息,您可以确保正确配置并正确配置您的数据保护环境,并根据设置配置执行。
请注意,当使用带有 Azure 上的 OADP 的 DPT 时,您必须配置
STORAGE_ACCOUNT_ID。- 新的节点代理负载均衡配置可用
-
节点代理负载关联性: 您可以使用
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对象。
-
节点代理负载关联性: 您可以使用
- 节点代理负载并发可用
- 在这个版本中,用户可以控制集群中每个节点上可以同时运行的最大节点代理操作数量。它还启用了更好的资源管理、优化备份和恢复工作流,以提高性能和更精简的体验。
1.2.1.5.2. 已解决的问题 复制链接链接已复制到粘贴板!
DataProtectionApplicationSpecoverflowed 注解限制,从而导致部署出现潜在的错误配置在此次更新之前,
DataProtectionApplicationSpec使用已弃用的PodAnnotations,这会导致注解限制溢出。这会导致部署出现潜在的错误配置。在本发行版本中,我们为 Operator 部署的 pod 中的注解添加了PodConfig,确保最终用户提供一致的注解并改进了可管理性。现在,部署应该更加可靠且更易于管理。- OADP 控制器管理器的根文件系统现在是只读
-
在此次更新之前,
openshift-adp-controller-manager-*pod 的manager容器被配置为使用可写的根文件系统运行。因此,这可能会导致使用容器的文件系统或外部可执行文件的篡改。在这个版本中,容器的安全上下文已被更新,将 root 文件系统设置为只读,同时确保需要写入访问权限所需的功能(如 Kopia 缓存)可以继续正确运行。因此,容器会针对潜在的威胁进行强化。 - 在多个 DPAs 中,
nonAdmin.enable: false不再导致协调问题 在此次更新之前,当用户尝试在已存在的集群中创建第二个非管理员
DataProtectionApplication(DPA) 时,新的 DPA 无法协调。在这个版本中,每个集群中对 Non-Admin Controller 安装的限制已被删除。因此,用户可以在集群中安装多个 Non-Admin Controller,而不会遇到错误。- OADP 支持自签名证书
在此次更新之前,使用自签名证书作为带有存储供应商(如 Minio)的备份镜像会导致备份过程中出现
x509: certificate signed by unknown authority错误。在这个版本中,证书验证已被更新,以支持 OADP 中的自签名证书,确保成功备份。Velero describe包括defaultVolumesToFsBackup在此次更新之前,
velero describe输出命令会省略defaultVolumesToFsBackup标志。这会影响用户的备份配置详情的可见性。在这个版本中,velero describe输出包含defaultVolumesToFsBackup标志信息,改进了备份设置的可见性。- 当安全
s3Url时,DPT CR 不再失败 在此次更新之前,当
s3Url是安全的时,因为一个未验证的证书而导致DataProtectionTest(DPT) 失败,因为 DPT CR 缺少在 spec 字段中跳过或添加 caCert 的功能。因此,因为未验证的证书,数据上传失败。在这个版本中,DPT CR 已更新,可以接受和跳过 spec 字段中的 CA 证书,从而解决了 SSL 验证错误的问题。因此,在使用安全s3Url时,DPT 不再失败。- 向 DPA 添加一个其 backupLocation 名称已存在的 backupLocation 时不会被拒绝
在此次更新之前,在
DataProtectionApplication(DPA) 中添加第二个backupLocation会导致 OADP 进入无效的状态,从而导致 Backup 和 Restore 失败,因为 Velero 无法读取 Secret 凭证。因此,备份和恢复操作会失败。在这个版本中,DPA 中重复的backupLocation名称不再被允许,防止 Backup 和 Restore 失败。因此,重复的backupLocation名称会被拒绝,确保无缝的数据保护。
1.2.1.5.3. 已知问题 复制链接链接已复制到粘贴板!
- 恢复使用 Cinder CSI 驱动程序在 OpenStack 上创建的备份会失败
当您为使用 Cinder Container Storage Interface (CSI) 驱动程序的 OpenStack 平台上创建的备份启动恢复操作时,初始备份仅在源应用程序手动缩减后成功。恢复作业失败,使您无法从备份中恢复应用程序的数据和状态。不存在已知的临时解决方案。
如果节点Agent.loadAffinity参数有许多元素,在备份过程中调度 dataMover pod由于 Velero 1.14 及之后的版本中的一个问题,OADP node-agent 只处理
loadAffinity数组中的第一个nodeSelector元素。因此,如果您定义了多个nodeSelector对象,会忽略除第一个以外的所有对象,从而可能会导致在备份过程中将数据 pod 调度到意外节点上。要临时解决这个问题,将来自多个
nodeSelector对象的所有所需的matchExpressions整合到第一个nodeSelector对象中。因此,所有节点关联性规则都会被正确应用,确保将数据 pod 调度到适当的节点。- 当使用带有别名的命令的 CA 证书时,OADP Backup 会失败
CA 证书不会作为一个文件存储在运行的 Velero 容器上。因为这个原因,会由于 Velero 容器中缺少
caCert出现降级的情况,需要手动设置和下载。要临时解决这个问题,在 Velero 部署中手动添加证书。具体步骤请参阅使用带有 velero 部署的 cacert 命令别名。- Data Mover restore 操作不支持
nodeSelectorspec 当使用
nodeAgent参数中设置的nodeSelector字段创建数据保护应用程序(DPA)时,Data Mover restore 部分会失败,而不是完成恢复操作。当前还没有已知的临时解决方案。- 当使用
caCert配置 DPA 时,镜像流备份部分失败 在 S3 连接中使用
DataProtectionApplication(DPA) 中的caCert备份过程中的未验证证书会导致ocp-django应用程序的备份部分失败,并导致数据丢失。当前还没有已知的临时解决方案。- Kopia 不会删除 worker 节点上的缓存
当配置了
ephemeral-storage参数并运行文件系统恢复时,缓存不会自动从 worker 节点中删除。因此,在恢复备份过程时/var分区会溢出,从而增加了存储使用量并潜在存在资源耗尽的情况。要临时解决这个问题,重启节点代理 pod,这会清除缓存。这样,缓存会被删除。- 因为无效的项目配置,在 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状态。当前还没有已知的临时解决方案。- 使用 STS 的 AWS 上的
CloudStorageAPI 的 VSL 备份失败 volumeSnapshotLocation(VSL) 备份失败,因为凭证文件中缺少AZURE_RESOURCE_GROUP参数,即使 VSL 的DataProtectionApplication(DPA) 配置中提到了AZURE_RESOURCE_GROUP。当前还没有已知的临时解决方案。- 使用 STS 在 Azure 上备份带有
ImageStreams的应用程序会失败 当使用 STS 在 Azure 集群上备份包含镜像流资源的应用程序时,OADP 插件会错误地尝试为容器 registry 查找基于 secret 的凭证。因此,STS 环境中没有找到所需的 secret,从而导致
ImageStream自定义备份操作失败。这会导致标记为PartiallyFailed的整体备份状态。当前还没有已知的临时解决方案。- 对于
CloudStorageRef配置,DPA 协调失败 当用户创建存储桶并使用
backupLocations.bucket.cloudStorageRef配置时,存储桶凭证不会出现在DataProtectionApplication(DPA) 自定义资源 (CR) 中。因此,即使CloudStorageCR 中存在存储桶凭证,DPA 协调也会失败。要临时解决这个问题,在 DPA CR 的backupLocations部分添加相同的凭证。
1.2.1.5.4. 弃用的功能 复制链接链接已复制到粘贴板!
configuration.resticspecification 字段已弃用在 OADP 1.5.0 中,
config.restic规格字段已弃用。使用带有uploaderType字段的nodeAgent部分选择kopia或restic作为uploaderType。请注意,Restic 在 OADP 1.5.0 中已弃用。
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 功能。
- 使用
must-gather工具收集日志已使用 Markdown 概述进行了改进 您可以使用
must-gather工具来收集用于数据保护 (OADP) 自定义资源的日志以及 OpenShift API 的信息。must-gather数据必须附加到所有客户案例。这个工具使用收集的信息生成 Markdown 输出文件,它位于must-gather日志集群目录中。dataMoverPrepareTimeout和resourceTimeout参数现在添加到 DPA 中的nodeAgent中Data Protection Application (DPA) 中的
nodeAgent字段现在包含以下参数:-
dataMoverPrepareTimeout: 定义DataUpload或DataDownload进程将等待的持续时间。默认值为 30 分钟。 -
resourceTimeout:设置没有被其他特定超时参数解决的资源进程的超时时间。默认值为 10 分钟。
-
- 使用 DPA 中的
spec.configuration.nodeAgent参数来配置nodeAgent守护进程集 Velero 不再使用
node-agent-config配置映射来配置nodeAgent守护进程集。在这个版本中,您必须在数据保护应用程序(DPA)中使用新的spec.configuration.nodeAgent参数来配置nodeAgent守护进程集。- 现在可以使用备份存储库配置配置映射配置 DPA
使用 Velero 1.15 及之后的版本,您现在可以配置每个存储库缓存的总大小。这可防止因为临时存储不足而无法移除 pod。请参阅以下新参数添加到 DPA 中的
NodeAgentConfig字段中:-
cacheLimitMB:以 MB 为单位设置本地数据缓存大小限制。 fullMaintenanceInterval:默认值为 24 小时。使用以下覆盖选项控制 Kopia 存储库中的已删除 Velero 备份率:-
normalGC: 24 小时 -
fastGC: 12 小时 -
eagerGC: 6 小时
-
-
- 提高 node-agent 安全性
在这个版本中,添加了以下更改:
-
现在,在 DPA 中的
velero字段中添加了新的configuration选项。 disableFsBackup参数的默认值为false或non-existing。在这个版本中,以下选项添加到SecurityContext字段中:-
Privileged: true -
AllowPrivilegeEscalation: true
-
如果将
disableFsBackup参数设置为true,它会从 node-agent 中删除以下挂载:-
host-pods -
host-plugins
-
- 修改 node-agent 始终以非 root 用户身份运行。
- 将 root 文件系统更改为只读方式。
使用写访问权限更新以下挂载点:
-
/home/velero -
tmp/credentials
-
-
将
SeccompProfileTypeRuntimeDefault选项用于SeccompProfile参数。
-
现在,在 DPA 中的
- 为并行项目备份添加 DPA 支持
默认情况下,只有一个线程处理一个项目块。Velero 1.16 支持并行项目备份,其中可以并行处理备份中的多个项目。
您可以使用可选的 Velero 服务器参数
--item-block-worker-count来运行额外的 worker 线程来并行处理项目。要在 OADP 中启用此功能,请将dpa.Spec.Configuration.Velero.ItemBlockWorkerCount参数设置为大于零的整数值。注意目前还不支持并行运行多个完整备份。
- OADP 日志现在以 JSON 格式提供
随着 OADP 1.5.0 的发布,日志现在以 JSON 格式提供。它有助于在 Elastic logs 管理系统中包含预解析的数据。
oc get dpa命令现在显示RECONCILED状态在这个版本中,
oc get dpa命令会显示RECONCILED状态,而不是只显示NAME和AGE以改进用户体验。例如:$ oc get dpa -n openshift-adp NAME RECONCILED AGE velero-sample True 2m51s
1.2.1.6.2. 已解决的问题 复制链接链接已复制到粘贴板!
- 容器现在对
terminationMessagePolicy使用FallbackToLogsOnError 在这个版本中,
terminationMessagePolicy字段可以为 Data Protection (OADP) Operator 容器(如operator-manager,velero,node-agent, 和non-admin-controller)设置FallbackToLogsOnError值。此更改可确保容器退出并显示错误并且终止消息文件为空,OpenShift 会使用容器日志输出的最后一部分作为终止消息。
- 命名空间管理员现在可以在恢复后访问应用程序
在以前的版本中,命名空间 admin 无法在恢复操作后执行应用程序。
执行失败并显示以下错误:
-
不允许 exec 操作,因为 pod 的安全上下文超出您的权限 -
无法针对任何安全性上下文约束进行验证 -
用户或 serviceaccount, provider restricted-v2 不可用
在这个版本中,这个问题已被解决,命名空间 admin 可以在恢复后成功访问应用程序。
-
- 现在,可以使用注解在单独的资源实例级别指定状态恢复
在以前的版本中,只有使用
Restore自定义资源(CR)中的restoreStatus字段在资源类型中配置状态恢复。在这个版本中,您可以使用以下注解在单独的资源实例级别指定状态恢复:
metadata: annotations: velero.io/restore-status: "true"- 现在,恢复可以成功使用
excludedClusterScopedResources 在以前的版本中,当执行将
excludeClusterScopedResources字段设置为storageclasses,Namespace参数的应用程序备份时,备份可以成功,但恢复会部分失败。在这个版本中,恢复可以成功。- 备份已完成,即使它在
waitingForPluginOperations阶段被重启 在以前的版本中,备份被标记为 failed,并带有以下错误消息:
failureReason: found a backup with status "InProgress" during the server starting, mark it as "Failed"在这个版本中,如果备份在
waitingForPluginOperations阶段被重启,则会完成备份。- 现在,当 DPA 中的 ` disableFsbackup` 参数设置为
true时,错误消息更为明确 在以前的版本中,当数据保护应用程序(DPA)的
spec.configuration.velero.disableFsBackup字段被设置为true时,备份部分会失败并显示错误,但信息并不明确。在这个版本中,错误消息更加明确,有助于对问题进行故障排除。例如,错误消息表示
disableFsBackup: true是 DPA 中的问题,或者对于非管理员用户,则无法访问 DPA。- 在 parseAWSSecret 中处理 AWS STS 凭证
在以前的版本中,使用 STS 身份验证的 AWS 凭证不会被正确验证。
在这个版本中,
parseAWSSecret功能检测到特定于 STS 的字段,并更新ensureSecretDataExists功能来正确处理 STS 配置集。repositoryMaintenance作业关联性配置可用于配置在以前的版本中,DPA 规格中缺少存储库维护作业 pod 关联性的新配置。
在这个版本中,
repositoryMaintenance作业关联性配置可用于将BackupRepository标识符映射到其配置。- 当 CR 规格正确后,
ValidationErrors字段会消失 在以前的版本中,当使用错误
spec.schedule值创建调度 CR,之后使用正确的值修补了这个值,ValidationErrors字段仍然存在。因此,即使 spec 正确,ValidationErrors字段也会显示不正确的信息。在这个版本中,在 CR 规格正确后,
ValidationErrors字段将不再存在。- 当在
restoreSpec中使用了includedNamesapces字段时,volumeSnapshotContents自定义资源会被恢复 在以前的版本中,当在恢复规格中使用
includedNamespace字段触发恢复操作时,恢复操作会成功完成,但没有创建volumeSnapshotContents自定义资源 (CR),且 PVC 处于Pending状态。在这个版本中,即使
restoreSpec中使用includedNamesapces字段,volumeSnapshotContentsCR 也会被恢复。因此,应用程序 pod 在恢复后处于Running状态。- 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-dir的emptyDir卷。 -
一个卷挂载到容器,该容器将此卷挂载到
/tmp目录中。 -
对于安全最佳实践,可维护
readOnlyRootFilesystem: true。 -
使用推荐的
os.CreateTemp()函数替换弃用的ioutil.TempFile()函数。 -
删除了不必要的
io/ioutil导入,这已不再需要。
-
在控制器 pod 规格中,有一个新的名为
有关本发行版本中解决的所有问题的完整列表,请参阅 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.
-
有关本发行版本中所有已知问题的完整列表,请参阅 JIRA 中的 OADP 1.5.0 已知问题 列表。
1.2.1.6.4. 弃用的功能 复制链接链接已复制到粘贴板!
configuration.resticspecification 字段已弃用在 OpenShift API for Data Protection (OADP) 1.5.0 中,
config.resticspecification 字段已弃用。使用带有uploaderType字段的nodeAgent部分选择kopia或restic作为uploaderType。请注意,Restic 在 OpenShift API for Data Protection (OADP) 1.5.0 中弃用。
1.2.1.6.5. 技术预览功能 复制链接链接已复制到粘贴板!
- 对 HyperShift 托管 OpenShift 集群的支持作为技术预览提供
OADP 可以作为技术预览支持并促进 HyperShift 托管 OpenShift 集群中的应用程序迁移。它为托管的集群中的应用程序确保无缝的备份和恢复操作。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
1.3. OADP 性能 复制链接链接已复制到粘贴板!
1.3.1. OADP 推荐的网络设置 复制链接链接已复制到粘贴板!
在 OpenShift 节点、AWS Simple Storage Service (S3)存储和云环境之间保持稳定网络。满足这些推荐的网络设置可帮助您确保 OpenShift API 用于数据保护(OADP)备份和恢复操作,即使在使用远程 AWS S3 存储桶时也是如此。
1.3.1.1. OADP 网络要求 复制链接链接已复制到粘贴板!
对于用于数据保护(OADP)的 OpenShift API 的支持体验,您应该在 OpenShift 节点、AWS Simple Storage Service (S3)兼容的对象存储以及满足 OpenShift 网络要求的受支持云环境中具有稳定且弹性的网络。
对于使用位于非集群且带有子优化数据路径(如高延迟或地理位置)的远程 S3 存储桶的部署,成功备份和恢复操作需要特定的配置。确保您的网络设置满足以下最低要求:
- 带宽(网络上传速度到对象存储):对小型备份而言大于 2 Mbps;对于大型备份,根据数据卷,需要 10-100 Mbps。
- 数据包丢失:1%
- 数据包崩溃:1%
- latency: 100 ms
确保您的 Red Hat OpenShift Service on AWS 网络以最佳方式执行,并满足 Red Hat OpenShift Service on AWS 网络要求。
虽然红帽为标准备份和恢复失败提供支持,但它不支持由不符合推荐的阈值的网络设置导致的故障。
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)快照提供了插件。
| OADP 插件 | 功能 | 存储位置 |
|---|---|---|
|
| 备份和恢复 Kubernetes 对象。 | AWS S3 |
| 使用快照备份和恢复卷。 | AWS EBS | |
|
| 备份和恢复 Red Hat OpenShift Service on AWS 资源。[1] | 对象存储 |
|
| 备份和恢复 OpenShift Virtualization 资源。[2] | 对象存储 |
|
| 使用 CSI 快照备份和恢复卷。[3] | 支持 CSI 快照的云存储 |
|
| 备份和恢复 HyperShift 托管集群资源。[4] | 对象存储 |
- 必需。
- 虚拟机磁盘使用 CSI 快照或 Restic 备份。
csi插件使用 Kubernetes CSI 快照 API。-
OADP 1.1 或更高版本使用
snapshot.storage.k8s.io/v1 -
OADP 1.0 使用
snapshot.storage.k8s.io/v1beta1
-
OADP 1.1 或更高版本使用
-
如果集群不是 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 文件会安装 openshift、aws、azure 和 gcp 插件:
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 文件会安装默认的 openshift、azure 和 gcp 插件,以及一个自定义插件,其名称为 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…
流程
使用以下命令,使用相关标签标记自定义 BSL:
$ oc label backupstoragelocations.velero.io <bsl_name> app.kubernetes.io/component=bsl在标记 BSL 后,等待 DPA 协调。
注意您可以通过对 DPA 本身进行任何更改来强制进行协调。
验证
协调 DPA 后,使用以下命令确认已创建了参数,并且正确的 registry 数据已填充到其中:
$ oc -n openshift-adp get secret/oadp-<bsl_name>-<bsl_provider>-registry-secret -o json | jq -r '.data'
1.4.6. OpenShift ADP Controller 分段错误临时解决方案 复制链接链接已复制到粘贴板!
在数据保护应用程序(DPA)配置中定义 velero 或 cloudstorage,以防止意外 pod 崩溃。此配置解决了 openshift-adp-controller-manager pod 中在两个组件启用时发生的分段错误。
由于以下设置,openshift-adp-controller-manager pod 会失败并显示崩溃循环分段错误:
-
如果您同时定义了
velero和cloudstorage,openshift-adp-controller-manager会失败。 -
如果您没有同时定义
velero和cloudstorage,openshift-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) 配置都将正常工作。
流程
运行以下命令,创建一个工作负载来备份:
$ oc create namespace hello-world$ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift运行以下命令来公开路由:
$ oc expose service/hello-openshift -n hello-world运行以下命令检查应用程序是否正常工作:
$ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`您应该看到类似以下示例的输出:
Hello OpenShift!运行以下命令来备份工作负载:
$ 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等待备份完成,然后运行以下命令:
$ 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 }运行以下命令来删除 demo 工作负载:
$ oc delete ns hello-world运行以下命令,从备份中恢复工作负载:
$ cat << EOF | oc create -f - apiVersion: velero.io/v1 kind: Restore metadata: name: hello-world namespace: openshift-adp spec: backupName: hello-world EOF运行以下命令等待 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 }运行以下命令检查工作负载是否已恢复:
$ oc -n hello-world get pods您应该看到类似以下示例的输出:
NAME READY STATUS RESTARTS AGE hello-openshift-9f885f7c6-kdjpj 1/1 Running 0 90s运行以下命令来检查 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 存储桶一起卸载。
流程
运行以下命令来删除工作负载:
$ oc delete ns hello-world运行以下命令来删除数据保护应用程序 (DPA):
$ oc -n openshift-adp delete dpa ${CLUSTER_NAME}-dpa运行以下命令来删除云存储:
$ oc -n openshift-adp delete cloudstorage ${CLUSTER_NAME}-oadp警告如果这个命令挂起,您可能需要通过运行以下命令来删除终结器:
$ oc -n openshift-adp patch cloudstorage ${CLUSTER_NAME}-oadp -p '{"metadata":{"finalizers":null}}' --type=merge如果不再需要 Operator,请运行以下命令删除它:
$ oc -n openshift-adp delete subscription oadp-operator从 Operator 中删除命名空间:
$ oc delete ns openshift-adp如果不再需要备份和恢复资源,请运行以下命令从集群中删除它们:
$ oc delete backups.velero.io hello-world要删除 AWS S3 中的备份、恢复和远程对象,请运行以下命令:
$ velero backup delete hello-world如果您不再需要自定义资源定义 (CRD),请运行以下命令从集群中删除它们:
$ for CRD in `oc get crds | grep velero | awk '{print $1}'`; do oc delete crd $CRD; done运行以下命令来删除 AWS S3 存储桶:
$ aws s3 rm s3://${CLUSTER_NAME}-oadp --recursive$ aws s3api delete-bucket --bucket ${CLUSTER_NAME}-oadp运行以下命令,将策略从角色分离:
$ aws iam detach-role-policy --role-name "${ROLE_NAME}" --policy-arn "${POLICY_ARN}"运行以下命令来删除角色:
$ 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。
- 您有一个应用程序,其数据库在单独的命名空间中运行。
流程
创建一个 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- 指定存储桶的名称。
运行以下命令来创建 OBC:
$ oc create -f <obc_file_name>其中:
<obc_file_name>- 指定对象存储桶声明清单的文件名。
当您创建 OBC 时,ODF 会创建一个
secret和一个配置映射,其名称与对象存储桶声明相同。secret具有存储桶凭证,配置映射有访问存储桶的信息。要从生成的配置映射中获取存储桶名称和存储桶主机,请运行以下命令:$ oc extract --to=- cm/test-obctest-obc是 OBC 的名称。输出示例
# BUCKET_NAME backup-c20...41fd # BUCKET_PORT 443 # BUCKET_REGION # BUCKET_SUBREGION # BUCKET_HOST s3.openshift-storage.svc要从生成的
secret获取存储桶凭证,请运行以下命令:$ oc extract --to=- secret/test-obc输出示例
# AWS_ACCESS_KEY_ID ebYR....xLNMc # AWS_SECRET_ACCESS_KEY YXf...+NaCkdyC3QPym运行以下命令,从
openshift-storage命名空间中的 s3 路由获取 S3 端点的公共 URL:$ oc get route s3 -n openshift-storage使用对象存储桶凭证创建一个
cloud-credentials文件,如下所示:[default] aws_access_key_id=<AWS_ACCESS_KEY_ID> aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>使用
cloud-credentials文件内容创建cloud-credentialssecret,如下所示:$ oc create secret generic \ cloud-credentials \ -n openshift-adp \ --from-file cloud=cloud-credentials配置 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>- 指定存储桶名称。
运行以下命令来创建 DPA:
$ oc apply -f <dpa_filename>运行以下命令,验证 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: ""运行以下命令,验证备份存储位置(BSL)是否可用:
$ oc get backupstoragelocations.velero.io -n openshift-adp输出示例
NAME PHASE LAST VALIDATED AGE DEFAULT dpa-sample-1 Available 3s 15s true配置备份 CR,如下例所示:
apiVersion: velero.io/v1 kind: Backup metadata: name: test-backup namespace: openshift-adp spec: includedNamespaces: - <application_namespace>其中:
<application_namespace>- 指定要备份的应用程序的命名空间。
运行以下命令来创建备份 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>
1.5.3. OpenShift API for Data Protection (OADP) 恢复用例 复制链接链接已复制到粘贴板!
以下是使用 OADP 的用例将备份恢复到不同的命名空间。
1.5.3.1. 使用 OADP 将应用程序恢复到不同的命名空间 复制链接链接已复制到粘贴板!
使用 OADP 将应用程序的备份恢复到新目标命名空间 test-restore-application。要恢复备份,请创建一个恢复自定义资源 (CR),如下例所示。在恢复 CR 中,源命名空间指的是您在备份中包含的应用程序命名空间。然后,您可以通过将项目更改为新的恢复的命名空间并验证资源来验证恢复。
先决条件
- 已安装 OADP Operator。
- 您已备份要恢复的应用程序。
流程
创建一个恢复 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是您要恢复备份的目标命名空间的名称。
运行以下命令来应用恢复 CR:
$ oc apply -f <restore_cr_filename>
验证
运行以下命令验证恢复是否处于
Completed阶段:$ oc describe restores.velero.io <restore_name> -n openshift-adp运行以下命令,进入恢复的命名空间
test-restore-application:$ oc project test-restore-application运行以下命令,验证恢复的资源,如持久性卷声明(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 存储桶。
- 提取存储桶详情。
-
在
DataProtectionApplicationCR 中包含自签名 CA 证书。 - 备份应用程序。
先决条件
- 已安装 OADP Operator。
- 已安装 ODF Operator。
- 您有一个应用程序,其数据库在单独的命名空间中运行。
流程
创建 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- 指定存储桶的名称。
运行以下命令来创建 OBC:
$ oc create -f <obc_file_name>当您创建 OBC 时,ODF 会创建一个
secret和一个配置映射,其名称与对象存储桶声明相同。secret对象包含存储桶凭证,ConfigMap对象包含用于访问存储桶的信息。要从生成的配置映射中获取存储桶名称和存储桶主机,请运行以下命令:$ oc extract --to=- cm/test-obctest-obc是 OBC 的名称。输出示例
# BUCKET_NAME backup-c20...41fd # BUCKET_PORT 443 # BUCKET_REGION # BUCKET_SUBREGION # BUCKET_HOST s3.openshift-storage.svc要从
secret对象获取存储桶凭证,请运行以下命令:$ oc extract --to=- secret/test-obc输出示例
# AWS_ACCESS_KEY_ID ebYR....xLNMc # AWS_SECRET_ACCESS_KEY YXf...+NaCkdyC3QPym使用以下示例配置创建带有对象存储桶凭证的
cloud-credentials文件:[default] aws_access_key_id=<AWS_ACCESS_KEY_ID> aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>运行以下命令,创建带有
cloud-credentials文件内容的cloud-credentialssecret:$ oc create secret generic \ cloud-credentials \ -n openshift-adp \ --from-file cloud=cloud-credentials运行以下命令,从
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使用存储桶名称和 CA 证书配置
DataProtectionApplicationCR 清单文件,如下例所示: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编码证书。
运行以下命令来创建
DataProtectionApplicationCR:$ oc apply -f <dpa_filename>运行以下命令验证
DataProtectionApplicationCR 是否已成功创建:$ 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: ""运行以下命令,验证备份存储位置(BSL)是否可用:
$ oc get backupstoragelocations.velero.io -n openshift-adp输出示例
NAME PHASE LAST VALIDATED AGE DEFAULT dpa-sample-1 Available 3s 15s true使用以下示例配置
BackupCR:apiVersion: velero.io/v1 kind: Backup metadata: name: test-backup namespace: openshift-adp spec: includedNamespaces: - <application_namespace>其中:
<application_namespace>- 指定要备份的应用程序的命名空间。
运行以下命令来创建
BackupCR:$ 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。
这个过程在以下两个阶段执行:
- 准备 AWS 凭证
- 安装 OADP Operator 并为其提供 IAM 角色
1.6.1.1. 为 OADP 准备 AWS 凭证 复制链接链接已复制到粘贴板!
准备并配置 Amazon Web Services 帐户,以便为数据保护(OADP)安装 OpenShift API。
流程
运行以下命令来创建以下环境变量:
重要更改集群名称来匹配您的集群,并确保以管理员身份登录到集群。在继续操作前,确保所有字段被正常输出。
$ 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}"在 AWS 帐户中,创建一个 IAM 策略以允许访问 AWS S3:
运行以下命令,检查策略是否存在:
$ POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='RosaOadpVer1'].{ARN:Arn}" --output text)-
RosaOadp:将RosaOadp替换为您的策略名称。
-
输入以下命令来创建策略 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是为环境变量创建的临时目录的名称。
-
运行以下命令来查看策略 ARN:
$ echo ${POLICY_ARN}
为集群创建 IAM 角色信任策略:
运行以下命令来创建信任策略文件:
$ 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运行以下命令来创建角色:
$ 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)运行以下命令来查看角色 ARN:
$ echo ${ROLE_ARN}
运行以下命令,将 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。
流程
输入以下命令,从 AWS 令牌文件创建 Red Hat OpenShift Service on AWS secret:
创建凭证文件:
$ 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 区域。为 OADP 创建命名空间:
$ oc create namespace openshift-adp创建 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 自动创建。
安装 OADP Operator:
- 在 Red Hat OpenShift Service on AWS web 控制台中浏览 生态系统 → Software Catalog。
- 搜索 OADP Operator。
- 在 role_ARN 字段中,粘贴之前创建的 role_arn,再点 Install。
输入以下命令,使用 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输入以下命令检查应用程序的存储默认存储类:
$ 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运行以下命令来获取存储类:
$ oc get storageclassNAME 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 插件。
创建
DataProtectionApplication资源,以配置存储备份和卷快照的存储的连接:如果您只使用 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字段的值是什么。
如果使用 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 应用程序,如 备份应用程序 中所述。
重要此配置中的
restic的enable参数设置为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。
流程
要验证 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的值。
运行以下命令,使用正确的角色 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.
运行以下命令,验证
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配置
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>-
指定
CloudStorageCR。
运行以下命令来创建
DataProtectionApplicationCR:$ oc create -f <dpa_manifest_file>运行以下命令,验证
DataProtectionApplicationCR 是否已协调,状态是否已设置为"True":$ oc get dpa -n openshift-adp -o yamlDataProtectionApplication示例apiVersion: oadp.openshift.io/v1alpha1 kind: DataProtectionApplication ... status: conditions: - lastTransitionTime: "2023-07-31T04:48:12Z" message: Reconcile complete reason: Complete status: "True" type: Reconciled运行以下命令,验证
BackupStorageLocationCR 是否处于 available 状态:$ oc get backupstoragelocations.velero.io -n openshift-adpBackupStorageLocation示例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。
流程
要在运行实际备份前预览备份中包含的资源,请运行以下命令:
$ velero backup create <backup-name> --snapshot-volumes false将
--snapshot-volumes 参数的值指定为false。要了解有关备份资源的更多详细信息,请运行以下命令:
$ velero describe backup <backup_name> --details将
<backup_name> 替换为备份的名称。要在运行实际恢复前预览恢复中包含的资源,请运行以下命令:
$ velero restore create --from-backup <backup_name>将
<backup_name> 替换为备份的名称。重要velero restore create命令在集群中创建恢复资源。在查看资源后,您必须删除作为恢复的一部分创建的资源。要了解有关恢复资源的更多详细信息,请运行以下命令:
$ velero describe restore <restore_name> --details将
<restore_name> 替换为恢复的名称。
1.7.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-adpNAMESPACE 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> 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>-
指定
backupStorageLocationsCR 的名称。 labelSelector- 指定 具有所有 指定标签的备份资源的 {key,value} 对映射。
orLabelSelectors- 指定 具有一个或多个 指定标签的备份资源的 {key,value} 对映射。
验证
BackupCR 的状态是否为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)。
流程
在
BackupCR 的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-
指定错误处理行为。允许的值是
Fail和Continue。默认值为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。
-
DataProtectionApplicationCR 必须处于Ready状态。
流程
检索
backupStorageLocationsCR:$ oc get backupStorageLocations -n openshift-adpNAMESPACE 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 * * * 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>-
指定
backupStorageLocationsCR 的名称。 defaultVolumesToFsBackup: true-
可选:在 OADP 版本 1.2 及更高版本中,在使用 Restic 进行卷备份时,将
defaultVolumesToFsBackup: true键值对添加到您的配置中。在 OADP 版本 1.1 中,在使用 Restic 备份卷时添加defaultVolumesToRestic: true键值对。
验证
在调度的备份运行后验证
ScheduleCR 的状态是否为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 存储库的三个完整维护周期后删除。
1.7.5.1. 通过创建 DeleteBackupRequest CR 来删除备份 复制链接链接已复制到粘贴板!
通过创建 DeleteBackupRequest 自定义资源(CR)来删除备份。这有助于您从存储中删除特定的备份及其关联的卷工件。
先决条件
- 您已运行应用程序的备份。
流程
创建
DeleteBackupRequestCR 清单文件:apiVersion: velero.io/v1 kind: DeleteBackupRequest metadata: name: deletebackuprequest namespace: openshift-adp spec: backupName: <backup_name>将
<backup_name> 替换为备份的名称。应用
DeleteBackupRequestCR 以删除备份:$ 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 可以运行仓库维护周期。
流程
要获取备份的备份仓库 CR 的名称,请运行以下命令:
$ oc get backuprepositories.velero.io -n openshift-adp要删除备份仓库 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。
流程
要在运行实际备份前预览备份中包含的资源,请运行以下命令:
$ velero backup create <backup-name> --snapshot-volumes false将
--snapshot-volumes 参数的值指定为false。要了解有关备份资源的更多详细信息,请运行以下命令:
$ velero describe backup <backup_name> --details将
<backup_name> 替换为备份的名称。要在运行实际恢复前预览恢复中包含的资源,请运行以下命令:
$ velero restore create --from-backup <backup_name>将
<backup_name> 替换为备份的名称。重要velero restore create命令在集群中创建恢复资源。在查看资源后,您必须删除作为恢复的一部分创建的资源。要了解有关恢复资源的更多详细信息,请运行以下命令:
$ velero describe restore <restore_name> --details将
<restore_name> 替换为恢复的名称。
1.8.1.2. 创建恢复 CR 复制链接链接已复制到粘贴板!
通过创建一个 Restore CR 来恢复 Backup 自定义资源(CR)。
当您恢复使用 azurefile-csi 存储类的有状态应用程序时,恢复操作会保留在 Finalizing 阶段。
先决条件
- 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
-
DataProtectionApplicationCR 必须处于Ready状态。 -
您必须具有 Velero
BackupCR。 - 持久性卷 (PV) 容量必须与备份时请求的大小匹配。如果需要,调整请求的大小。
流程
创建一个
RestoreCR,如下例所示: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>-
指定
BackupCR 的名称。 includedResources-
可选:指定要包含在恢复过程中的资源数组。资源可以是缩写方式(例如,
po代表pods)或完全限定的方式。如果未指定,则会包含所有资源。 restorePVs: true-
可选:
restorePV参数可以设置为false,以从 Container Storage Interface (CSI) 快照的VolumeSnapshot或配置VolumeSnapshotLocation时从原生快照中恢复PersistentVolume。
输入以下命令验证
RestoreCR 的状态是否为Completed:$ oc get restores.velero.io -n openshift-adp <restore> -o jsonpath='{.status.phase}'输入以下命令验证备份资源是否已恢复:
$ oc get all -n <namespace>其中:
<namespace>- 指定您备份的命名空间。
如果您使用卷恢复
DeploymentConfig,或使用 post-restore hook,请输入以下命令运行dc-post-restore.shcleanup 脚本:$ bash dc-restic-post-restore.sh -> dc-post-restore.sh注意在恢复过程中,OADP Velero 插件会缩减
DeploymentConfig对象,并将 pod 恢复为独立 pod。这是为了防止集群在恢复时立即删除恢复的DeploymentConfigpod,并允许 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:
inithook 将 init 容器添加到 pod,以便在应用程序容器启动前执行设置任务。如果您恢复 Restic 备份,则会在恢复 hook init 容器前添加
restic-waitinit 容器。-
exechook 在恢复的 pod 的容器中运行命令或脚本。
流程
在
RestoreCR 的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指定错误处理行为。允许的值是
Fail和Continue:-
Continue: 只记录命令失败。 -
Fail: 任何 pod 中的任何容器中没有更多恢复 hook 运行。RestoreCR 的状态将是PartiallyFailed。
-
在文件系统备份(FSB)恢复操作中,引用 ImageStream 的 Deployment 资源没有被正确恢复。恢复运行 FSB 的 pod,postHook 会被提前终止。
这是因为在恢复操作中,OpenShift 控制器使用更新的 ImageStreamTag 哈希更新 Deployment 资源中的 spec.template.spec.containers[0].image 字段。更新会触发新 pod 的推出,终止 velero 运行 FSB 和后恢复 hook 的 pod。有关镜像流触发器的更多信息,请参阅"镜像流更改的触发更新"。
这个行为的临时解决方案分为两个步骤:
首先,执行排除
Deployment资源的恢复,例如:$ velero restore create <RESTORE_NAME> \ --from-backup <BACKUP_NAME> \ --exclude-resources=deployment.apps第一次恢复成功后,通过包含这些资源来执行第二次恢复,例如:
$ velero restore create <RESTORE_NAME> \ --from-backup <BACKUP_NAME> \ --include-resources=deployment.apps