备份和恢复


Red Hat OpenShift Service on AWS 4

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

Red Hat OpenShift Documentation Team

摘要

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

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

1.1. OpenShift API for Data Protection 简介

用于数据保护(OADP)产品的 OpenShift API 保护 Red Hat OpenShift Service on AWS 上的客户应用程序。它提供全面的灾难恢复保护,涵盖了 Red Hat OpenShift Service on AWS 应用程序、应用程序相关的集群资源、持久性卷和内部镜像。OADP 还能够备份容器化应用程序和虚拟机 (VM)。

重要

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

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

1.1.1. OpenShift API for Data Protection API

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

OADP 提供以下 API:

1.1.1.1. 支持 OpenShift API for Data Protection
Expand
表 1.1. 支持的 OADP 版本

Version

OCP 版本

公开发行(GA)

完全支持结束

维护结束

延长更新支持(EUS)

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

1.5

  • 4.19

2025 年 6 月 17 日

1.6 发行之日

1.7 发行之日

EUS 需要是 OCP 4.20

EUS Term 2 必须是 OCP 4.20

1.4

  • 4.14
  • 4.15
  • 4.16

2024 年 7 月 10 日

1.5 发行之日

1.6 发行之日

2026 年 6 月 27 日

EUS 必须是针对 OCP 4.16 的

2027 年 6 月 27 日

EUS Term 2 必须是针对 OCP 4.16 的

1.3

  • 4.12
  • 4.13
  • 4.14
  • 4.15

2023 年 11 月 29 日

2024 年 7 月 10 日

1.5 发行之日

2025 年 10 月 31 日

EUS 必须是 OCP 4.14

2026 年 10 月 31 日

EUS Term 2 必须在 OCP 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.4 发行注记

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

注意

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

1.2.1.1. OADP 1.4.4 发行注记

OpenShift API for Data Protection (OADP) 1.4.4 是一个 CGO(Container Grade Only)版本,它刷新了容器的健康级别。与 OADP 1.4.3 相比,产品本身的代码并没有变化。

1.2.1.1.1. 已知问题

恢复有状态应用程序的问题

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

1.2.1.2. OADP 1.4.3 发行注记

OpenShift API for Data Protection (OADP) 1.4.3 发行注记中列出了以下新功能。

1.2.1.2.1. 新功能

版本 0.7.1 中的 kubevirt velero 插件的显著变化

在这个版本中,kubevirt velero 插件已更新至版本 0.7.1。主要改进包括以下程序错误修复和新功能:

  • 当所有者虚拟机被排除时,备份不再会忽略虚拟机实例(VMI)。
  • 对象图现在在备份和恢复操作过程中包括所有额外对象。
  • 现在,在恢复操作过程中,可选生成的标签会添加到新的固件通用唯一标识符(UUID)中。
  • 现在,可以在恢复操作期间切换虚拟机运行策略。
  • 现在支持通过标签清除 MAC 地址。
  • 现在,在备份操作过程中会跳过特定于恢复的检查。
  • 现在支持 VirtualMachineClusterInstancetypeVirtualMachineClusterPreference 自定义资源定义(CRD)。
1.2.1.3. OADP 1.4.2 发行注记

OpenShift API for Data Protection (OADP) 1.4.2 发行注记列出了新功能、解决的问题和程序错误,以及已知的问题。

1.2.1.3.1. 新功能

现在,可以使用 VolumePolicy 功能备份同一命名空间中的不同卷

在这个版本中,Velero 提供资源策略,以使用 VolumePolicy 功能备份同一命名空间中的不同卷。备份不同卷所支持的 VolumePolicy 功能包括 skip, snapshot, 和 fs-backup 操作。OADP-1071

文件系统 backup and data mover 现在可以使用短期凭证

文件系统 backup and data mover 现在可以使用短期凭证,如 AWS 安全令牌服务 (STS) 和 GCP WIF。现在,备份会在没有 PartiallyFailed 状态的情况下成功完成。OADP-5095

1.2.1.3.2. 已解决的问题

现在,如果 VSL 包含不正确的供应商值,DPA 会报告错误

在以前的版本中,如果卷快照位置(VSL) spec 的供应商不正确,则数据保护应用程序(DPA)可以成功协调。在这个版本中,DPA 会报告错误并请求一个有效的供应商值。OADP-5044

对于使用不同 OADP 命名空间的备份和恢复,Data Mover 恢复可以成功。

在以前的版本中,当使用在一个命名空间中安装的 OADP 执行备份,但使用安装在不同命名空间中的 OADP 恢复时,Data Mover 恢复会失败。在这个版本中,Data Mover 恢复可以成功。OADP-5460

SSE-C 备份可用于计算的 secret 密钥的 MD5

在以前的版本中,备份失败并显示以下错误:

Requests specifying Server Side Encryption with Customer provided keys must provide the client calculated MD5 of the secret key.
Copy to Clipboard Toggle word wrap

在这个版本中,解决了使用客户提供密钥(SSE-C) base64 和 MD5 哈希的 Server-Side 加密。因此,SSE-C 备份可用于计算的 secret 密钥的 MD5另外,customerKey 大小的不正确的 errorhandling 也被修复。OADP-5388

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

1.2.1.3.3. 已知问题

Data Mover restore 操作不支持 nodeSelector spec

当使用 nodeAgent 参数中设置的 nodeSelector 字段创建数据保护应用程序(DPA)时,Data Mover restore 部分会失败,而不是完成恢复操作。OADP-5260

当指定了 TLS 跳过验证时,S3 存储不会使用代理环境

在镜像 registry 备份中,当 insecureSkipTLSVerify 参数设置为 true 时,S3 存储不会使用代理环境。OADP-3143

Kopia 在备份过期后不会删除工件

在备份过期后,即使删除了备份,Kopia 也不会从 S3 位置的 ${bucket_name}/kopia/$openshift-adp 中删除卷工件。如需更多信息,请参阅"关于 Kopia 仓库维护"。OADP-5131

1.2.1.4. OADP 1.4.1 发行注记

OpenShift API for Data Protection (OADP) 1.4.1 发行注记列出了新功能、解决的问题和程序错误,以及已知的问题。

1.2.1.4.1. 新功能

新的 DPA 字段以更新客户端 qps 和 burst

现在,您可以使用新的数据保护应用程序 (DPA) 字段更改 Velero Server Kubernetes API 查询每秒(qps)和突发(burst)值。新的 DPA 字段是 spec.configuration.velero.client-qpsspec.configuration.velero.client-burst,它们都默认为 100。OADP-4076

使用 Kopia 启用非默认算法

在这个版本中,您可以在 Kopia 中配置哈希、加密和分割程序算法来选择非默认选项来优化不同备份工作负载的性能。

要配置这些算法,在 DataProtectionApplication (DPA) 配置的 podConfig 部分中设置 velero pod 的 env 变量。如果没有设置此变量,或者选择了一个不被支持的算法,Kopia 将默认为其标准算法。OADP-4640

1.2.1.4.2. 已解决的问题

现在可以成功恢复没有 pod 的备份

在以前的版本中,恢复没有 pod 的备份,并将 StorageClass VolumeBindingMode 设置为 WaitForFirstConsumer 会导致 PartiallyFailed 状态出现错误:fail to patch dynamic PV, err: context deadline exceeded。在这个版本中,会跳过对动态 PV 进行补丁,并可以成功恢复备份,不再会出现 PartiallyFailed 状态。OADP-4231

PodVolumeBackup CR 现在显示正确的消息

在以前的版本中,PodVolumeBackup 自定义资源 (CR) 会生成不正确的消息:get a podvolumebackup with status "InProgress" during the server starting, mark it as "Failed"。在这个版本中,生成的消息是:

found a podvolumebackup with status "InProgress" during the server starting,
mark it as "Failed".
Copy to Clipboard Toggle word wrap

OADP-4224

现在,可以使用 DPA 覆盖 imagePullPolicy

在以前的版本中,OADP 将所有镜像的 imagePullPolicy 参数都设置为 Always。在这个版本中,OADP 会检查每个镜像是否包含了 sha256sha512 摘要,然后将 imagePullPolicy 设置为 IfNotPresent; 否则 imagePullPolicy 被设置为 Always。现在,您可以使用新的 spec.containerImagePullPolicy DPA 字段覆盖此策略。OADP-4172

现在,如果初始更新失败,OADP Velero 现在可以重试更新恢复状态

在以前的版本中,OADP Velero 无法更新恢复的 CR 状态。这会无限期保留 InProgress 状态。依赖于备份和恢复 CR 状态以确定完成会失败的组件。在这个版本中,恢复的恢复 CR 状态可以正确地进入 CompletedFailed 状态。OADP-3227

从不同的集群恢复 BuildConfig 构建会成功,且没有任何错误

在以前的版本中,当从其他集群执行 BuildConfig Build 资源恢复时,应用程序会在内部镜像 registry 的 TLS 验证过程中生成一个错误。错误信息 failed to verify certificate: x509: certificate signed by unknown authority。在这个版本中,BuildConfig 构建资源恢复到不同的集群可以成功进行,而不会生成 failed to verify certificate 错误。OADP-4692

恢复空的 PVC 可以成功

在以前的版本中,在恢复空的持久性卷声明 (PVC) 时,下载数据会失败。这个失败带有以下错误:

data path restore failed: Failed to run kopia restore: Unable to load
    snapshot : snapshot not found
Copy to Clipboard Toggle word wrap

在这个版本中,在恢复空 PVC 时,下载数据的过程会正确处理,不会生成错误信息。OADP-3106

CSI 和 DataMover 插件中没有 Velero 内存泄漏的问题

在以前的版本中,使用 CSI 和 DataMover 插件会导致 Velero 内存泄漏。当备份结束时,Velero 插件实例不会被删除,在 Velero pod 中生成 内存不足(OOM )条件前,内存泄漏会消耗内存。在这个版本中,当使用 CSI 和 DataMover 插件时,不会出现 Velero 内存泄漏的问题。OADP-4448

在相关 PV 被释放前,post-hook 操作不会启动

在以前的版本中,由于 Data Mover 操作的异步性,在 Data Mover 持久性卷声明 (PVC) 释放相关 pod 的持久性卷 (PV) 前,可能会尝试进行 post-hook 操作。此问题会导致备份失败,并显示 PartiallyFailed 状态。在这个版本中,在 Data Mover PVC 发布相关的 PV 前,才会启动 post-hook 操作,从而避免出现 PartiallyFailed 备份状态。OADP-3140

在带有超过 37 个字符的命名空间中部署 DPA 可以正常工作

当您在带有超过 37 个字符的命名空间中安装 OADP Operator 来创建新的 DPA 时,标记 "cloud-credentials" Secret 会失败,DPA 报告以下错误:

The generated label name is too long.
Copy to Clipboard Toggle word wrap

在这个版本中,在名称中有超过 37 个字符的命名空间中创建 DPA 不会失败。OADP-3960

恢复可以通过覆盖超时错误成功完成

在以前的版本中,在大规模环境中,恢复操作会导致 Partiallyfailed 状态并带有错误:fail to patch dynamic PV, err: context deadline exceeded。在这个版本中,可以使用 resourceTimeout Velero 服务器参数覆盖这个超时错误,从而使恢复可以成功完成。OADP-4344

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

1.2.1.4.3. 已知问题

恢复 OADP 后,Cassandra 应用程序 pod 进入 CrashLoopBackoff 状态

在 OADP 恢复后,Cassandra 应用程序 pod 可能会进入 CrashLoopBackoff 状态。要临时解决这个问题,删除在恢复 OADP 后返回错误 CrashLoopBackoff 状态的 StatefulSet pod。然后,StatefulSet 控制器会重新创建这些 pod 并正常运行。OADP-4407

引用 ImageStream 的部署不会被正确恢复,并导致 pod 和卷内容被破坏

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

在恢复操作过程中,OpenShift Container Platform 控制器会使用一个更新的 ImageStreamTag 哈希更新 Deployment 资源中的 spec.template.spec.containers[0].image 字段。更新会触发推出新的 pod,终止 velero 运行 FSB 和 post-hook 的 pod。

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

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

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

    $ velero restore create <RESTORE_NAME> \
      --from-backup <BACKUP_NAME> \
      --include-resources=deployment.apps
    Copy to Clipboard Toggle word wrap

    OADP-3954

1.2.1.5. OADP 1.4.0 发行注记

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

1.2.1.5.1. 已解决的问题

恢复在 Red Hat OpenShift Service on AWS 4.16 中可以正常工作

在以前的版本中,当恢复已删除的应用程序命名空间时,恢复操作部分会失败,资源名称在 AWS 4.16 上的 Red Hat OpenShift Service 中可能不是空 错误。在这个版本中,恢复在 Red Hat OpenShift Service on AWS 4.16 中可以正常工作。OADP-4075

Data Mover backups 可以在 Red Hat OpenShift Service on AWS 4.16 集群中正常工作

在以前的版本中,Velero 使用早期版本的 SDK,其中 Spec.SourceVolumeMode 字段不存在。因此,在带有版本 4.2 的外部快照程序上的 Red Hat OpenShift Service on AWS 4.16 集群中,Data Mover backups 会失败。在这个版本中,外部快照升级到 v7.0 及更新版本。因此,备份不会在 Red Hat OpenShift Service on AWS 4.16 集群中失败。OADP-3922

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

1.2.1.5.2. 已知问题

在没有为 MCG 设置 checksumAlgorithm 时,备份会失败

在对任何使用 Noobaa 作为备份位置的应用程序进行备份时,如果未设置 checksumAlgorithm 配置参数,备份会失败。要解决这个问题,如果您在 Backup Storage Location (BSL) 配置中没有为 checksumAlgorithm 提供值,则会添加一个空值。空值只为使用数据保护应用程序 (DPA) 自定义资源 (CR) 创建的 BSLs 添加,如果使用任何其他方法创建 BSL,则不会添加这个值。OADP-4274

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

1.2.1.5.3. 升级备注
注意

始终升级到下一个次版本。不要 跳过版本。要升级到更新的版本,请一次只升级一个频道。例如,若要从 OpenShift API for Data Protection (OADP) 1.1 升级到 1.3,首先升级到 1.2,然后再升级到 1.3。

1.2.1.5.3.1. 从 OADP 1.3 更改为 1.4

Velero 服务器已从 1.12 版本更新至 1.14。请注意,数据保护应用程序 (DPA) 没有改变。

这会更改以下内容:

  • velero-plugin-for-csi 代码现在包括在 Velero 代码中,这意味着插件不再需要 init 容器。
  • Velero 将客户端 Burst 和 QPS 默认值分别从 30 和 20 改为 100 和 100。
  • velero-plugin-for-aws 插件更新了 BackupStorageLocation 对象(BSLs)中的 spec.config.checksumAlgorithm 字段的默认值,从 "" (不计算 checksum) 改为 CRC32 算法。知道 checksum 算法类型只能用于 AWS。几个 S3 供应商要求通过将 checksum 算法设置为 "" 来禁用 md5sum。使用您的存储供应商确认 md5sum 算法支持和配置。

    在 OADP 1.4 中,为此配置在 DPA 中创建 BSL 的默认值为 ""。这个默认值表示没有检查 md5sum,它与 OADP 1.3 一致。对于在 DPA 中创建的 BSL,使用 DPA 中的 spec.backupLocations[].velero.config.checksumAlgorithm 字段更新它。如果您的 BSLs 在 DPA 之外创建,您可以使用 BSLs 中的 spec.config.checksumAlgorithm 来更新此配置。

1.2.1.5.3.2. 备份 DPA 配置

您必须备份当前的 DataProtectionApplication (DPA) 配置。

流程

  • 运行以下命令来保存您当前的 DPA 配置:

    示例命令

    $ oc get dpa -n openshift-adp -o yaml > dpa.orig.backup
    Copy to Clipboard Toggle word wrap

1.2.1.5.3.3. 升级 OADP Operator

在升级 OpenShift API for Data Protection (OADP) Operator 时,请使用以下步骤。

流程

  1. 将 OADP Operator 的订阅频道从 stable-1.3 改为 stable-1.4
  2. 等待 Operator 和容器更新并重启。
1.2.1.5.4. 将 DPA 转换为新版本

要从 OADP 1.3 升级到 1.4,则不需要数据保护应用程序 (DPA) 更改。

1.2.1.5.5. 验证升级

使用以下步骤验证升级。

流程

  1. 运行以下命令,查看 OpenShift API for Data Protection (OADP) 资源来验证安装:

    $ oc get all -n openshift-adp
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                                     READY   STATUS    RESTARTS   AGE
    pod/oadp-operator-controller-manager-67d9494d47-6l8z8    2/2     Running   0          2m8s
    pod/restic-9cq4q                                         1/1     Running   0          94s
    pod/restic-m4lts                                         1/1     Running   0          94s
    pod/restic-pv4kr                                         1/1     Running   0          95s
    pod/velero-588db7f655-n842v                              1/1     Running   0          95s
    
    NAME                                                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    service/oadp-operator-controller-manager-metrics-service   ClusterIP   172.30.70.140    <none>        8443/TCP   2m8s
    
    NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    daemonset.apps/restic   3         3         3       3            3           <none>          96s
    
    NAME                                                READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/oadp-operator-controller-manager    1/1     1            1           2m9s
    deployment.apps/velero                              1/1     1            1           96s
    
    NAME                                                           DESIRED   CURRENT   READY   AGE
    replicaset.apps/oadp-operator-controller-manager-67d9494d47    1         1         1       2m9s
    replicaset.apps/velero-588db7f655                              1         1         1       96s
    Copy to Clipboard Toggle word wrap

  2. 运行以下命令,验证 DataProtectionApplication (DPA) 是否已协调:

    $ oc get dpa dpa-sample -n openshift-adp -o jsonpath='{.status}'
    Copy to Clipboard Toggle word wrap

    输出示例

    {"conditions":[{"lastTransitionTime":"2023-10-27T01:23:57Z","message":"Reconcile complete","reason":"Complete","status":"True","type":"Reconciled"}]}
    Copy to Clipboard Toggle word wrap

  3. 验证 type 被设置为 Reconciled
  4. 运行以下命令,验证备份存储位置并确认 PHASEAvailable

    $ oc get backupstoragelocations.velero.io -n openshift-adp
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME           PHASE       LAST VALIDATED   AGE     DEFAULT
    dpa-sample-1   Available   1s               3d16h   true
    Copy to Clipboard Toggle word wrap

1.3. OADP 性能

1.4. OADP 功能和插件

OpenShift API 用于数据保护(OADP)功能,提供用于备份和恢复应用的选项。

默认插件使 Velero 能够与某些云供应商集成,并备份和恢复 Red Hat OpenShift Service on AWS 资源。

1.4.1. OADP 功能

OpenShift API 用于数据保护(OADP)支持以下功能:

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 插件

用于数据保护(OADP)的 OpenShift API 提供了与存储供应商集成的默认 Velero 插件,以支持备份和恢复操作。您可以根据 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 快照的云存储

vsm

VolumeSnapshotMover 将快照从集群重新定位到一个在恢复过程中使用的对象存储中以恢复有状态的应用程序,例如集群删除的情况。[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. 仅限 OADP 1.2。

1.4.3. 关于 OADP Velero 插件

安装 Velero 时,您可以配置两种类型的插件:

  • 默认云供应商插件
  • 自定义插件

两种类型的插件都是可选的,但大多数用户都会至少配置一个云供应商插件。

1.4.3.1. 默认 Velero 云供应商插件

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

  • aws (Amazon Web Services)
  • gcp (Google Cloud Platform)
  • azure (Microsoft Azure)
  • 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
Copy to Clipboard Toggle word wrap
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
Copy to Clipboard Toggle word wrap

1.4.4. OADP 和 FIPS

FIPS(Federal Information Processing Standards)是美国联邦政府根据联邦信息处理标准(FISMA)开发的一组计算机安全标准。

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

1.4.5. 避免 Velero 插件 panic 错误

缺少 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…
Copy to Clipboard Toggle word wrap

使用以下临时解决方案来避免 Velero 插件 panic 错误。

流程

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

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

    注意

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

验证

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

    $ oc -n openshift-adp get secret/oadp-<bsl_name>-<bsl_provider>-registry-secret -o json | jq -r '.data'
    Copy to Clipboard Toggle word wrap

如果您配置启用了 cloudstoragerestic 的数据保护应用程序(DPA),openshift-adp-controller-manager pod 会崩溃并重启,直到 pod 失败并显示崩溃循环分段错误。

在配置 DPA 时定义 velerocloudstorage。否则,openshift-adp-controller-manager pod 可能会因为以下设置而失败,并显示崩溃循环分段错误:

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

有关此问题的更多信息,请参阅 OADP-1054

1.5. OADP 用例

1.5.1. 使用 ROSA STS 在 OADP 上备份工作负载

1.5.1.1. 使用 OADP 和 ROSA STS 执行备份

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

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

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

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

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

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`
    Copy to Clipboard Toggle word wrap

    输出示例

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

  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
    Copy to Clipboard Toggle word wrap
  5. 等待备份完成,然后运行以下命令:

    $ watch "oc -n openshift-adp get backup hello-world -o json | jq .status"
    Copy to Clipboard Toggle word wrap

    输出示例

    {
      "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
    }
    Copy to Clipboard Toggle word wrap

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

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

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

    $ watch "oc -n openshift-adp get restore hello-world -o json | jq .status"
    Copy to Clipboard Toggle word wrap

    输出示例

    {
      "completionTimestamp": "2022-09-07T22:25:47Z",
      "phase": "Completed",
      "progress": {
        "itemsRestored": 38,
        "totalItems": 38
      },
      "startTimestamp": "2022-09-07T22:25:28Z",
      "warnings": 9
    }
    Copy to Clipboard Toggle word wrap

  9. 运行以下命令检查工作负载是否已恢复:

    $ oc -n hello-world get pods
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                              READY   STATUS    RESTARTS   AGE
    hello-openshift-9f885f7c6-kdjpj   1/1     Running   0          90s
    Copy to Clipboard Toggle word wrap

  10. 运行以下命令来检查 JSONPath:

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`
    Copy to Clipboard Toggle word wrap

    输出示例

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

注意

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

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

如果您需要卸载 OpenShift API for Data Protection (OADP) Operator 以及本例中的备份和 S3 存储桶,请按照以下步骤操作。

流程

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

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

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

    $ oc -n openshift-adp delete cloudstorage ${CLUSTER_NAME}-oadp
    Copy to Clipboard Toggle word wrap
    警告

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

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

    $ oc -n openshift-adp delete subscription oadp-operator
    Copy to Clipboard Toggle word wrap
  5. 从 Operator 中删除命名空间:

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

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

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

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

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

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

    $ aws iam delete-role --role-name "${ROLE_NAME}"
    Copy to Clipboard Toggle word wrap

以下是使用 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 存储桶,如下例所示:

    OBC 示例

    apiVersion: objectbucket.io/v1alpha1
    kind: ObjectBucketClaim
    metadata:
      name: test-obc 
    1
    
      namespace: openshift-adp
    spec:
      storageClassName: openshift-storage.noobaa.io
      generateBucketName: test-backup-bucket 
    2
    Copy to Clipboard Toggle word wrap

    1
    对象存储桶声明的名称。
    2
    bucket 的名称。
  2. 运行以下命令来创建 OBC:

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

    $ oc extract --to=- cm/test-obc 
    1
    Copy to Clipboard Toggle word wrap
    1
    test-obc 是 OBC 的名称。

    输出示例

    # BUCKET_NAME
    backup-c20...41fd
    # BUCKET_PORT
    443
    # BUCKET_REGION
    
    # BUCKET_SUBREGION
    
    # BUCKET_HOST
    s3.openshift-storage.svc
    Copy to Clipboard Toggle word wrap

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

    $ oc extract --to=- secret/test-obc
    Copy to Clipboard Toggle word wrap

    输出示例

    # AWS_ACCESS_KEY_ID
    ebYR....xLNMc
    # AWS_SECRET_ACCESS_KEY
    YXf...+NaCkdyC3QPym
    Copy to Clipboard Toggle word wrap

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

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

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

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

    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 
    1
    
      backupLocations:
        - velero:
            config:
              profile: "default"
              region: noobaa
              s3Url: https://s3.openshift-storage.svc 
    2
    
              s3ForcePathStyle: "true"
              insecureSkipTLSVerify: "true"
            provider: aws
            default: true
            credential:
              key: cloud
              name:  cloud-credentials
            objectStorage:
              bucket: <bucket_name> 
    3
    
              prefix: oadp
    Copy to Clipboard Toggle word wrap

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

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

    $ oc get dpa -o yaml
    Copy to Clipboard Toggle word wrap

    输出示例

    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: ""
    Copy to Clipboard Toggle word wrap

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

    $ oc get backupstoragelocations.velero.io -n openshift-adp
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME           PHASE       LAST VALIDATED   AGE   DEFAULT
    dpa-sample-1   Available   3s               15s   true
    Copy to Clipboard Toggle word wrap

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

    备份 CR 示例

    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: test-backup
      namespace: openshift-adp
    spec:
      includedNamespaces:
      - <application_namespace> 
    1
    Copy to Clipboard Toggle word wrap

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

    $ oc apply -f <backup_cr_filename>
    Copy to Clipboard Toggle word wrap

验证

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

    $ oc describe backup test-backup -n openshift-adp
    Copy to Clipboard Toggle word wrap

    输出示例

    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>
    Copy to Clipboard Toggle word wrap

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

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

先决条件

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

流程

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

    恢复 CR 示例

    apiVersion: velero.io/v1
    kind: Restore
    metadata:
      name: test-restore 
    1
    
      namespace: openshift-adp
    spec:
      backupName: <backup_name> 
    2
    
      restorePVs: true
      namespaceMapping:
        <application_namespace>: test-restore-application 
    3
    Copy to Clipboard Toggle word wrap

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

    $ oc apply -f <restore_cr_filename>
    Copy to Clipboard Toggle word wrap

验证

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

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

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

    $ oc get pvc,svc,deployment,secret,configmap
    Copy to Clipboard Toggle word wrap

    输出示例

    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
    Copy to Clipboard Toggle word wrap

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 存储桶,如下例所示:

    ObjectBucketClaim CR 示例

    apiVersion: objectbucket.io/v1alpha1
    kind: ObjectBucketClaim
    metadata:
      name: test-obc 
    1
    
      namespace: openshift-adp
    spec:
      storageClassName: openshift-storage.noobaa.io
      generateBucketName: test-backup-bucket 
    2
    Copy to Clipboard Toggle word wrap

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

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

    $ oc extract --to=- cm/test-obc 
    1
    Copy to Clipboard Toggle word wrap
    1
    OBC 的名称为 test-obc

    输出示例

    # BUCKET_NAME
    backup-c20...41fd
    # BUCKET_PORT
    443
    # BUCKET_REGION
    
    # BUCKET_SUBREGION
    
    # BUCKET_HOST
    s3.openshift-storage.svc
    Copy to Clipboard Toggle word wrap

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

    $ oc extract --to=- secret/test-obc
    Copy to Clipboard Toggle word wrap

    输出示例

    # AWS_ACCESS_KEY_ID
    ebYR....xLNMc
    # AWS_SECRET_ACCESS_KEY
    YXf...+NaCkdyC3QPym
    Copy to Clipboard Toggle word wrap

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

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

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

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

    输出示例

    LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0...
    ....gpwOHMwaG9CRmk5a3....FLS0tLS0K
    Copy to Clipboard Toggle word wrap

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

    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" 
    1
    
            provider: aws
            default: true
            credential:
              key: cloud
              name:  cloud-credentials
            objectStorage:
              bucket: <bucket_name> 
    2
    
              prefix: oadp
              caCert: <ca_cert> 
    3
    Copy to Clipboard Toggle word wrap

    1
    insecureSkipTLSVerify 标志可以设置为 truefalse。如果设置为 "true",则禁用 SSL/TLS 安全性。如果设置为 false,则启用 SSL/TLS 安全。
    2
    指定上一步中提取的存储桶的名称。
    3
    复制并粘贴上一步中的 Base64 编码证书。
  9. 运行以下命令来创建 DataProtectionApplication CR:

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

    $ oc get dpa -o yaml
    Copy to Clipboard Toggle word wrap

    输出示例

    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: ""
    Copy to Clipboard Toggle word wrap

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

    $ oc get backupstoragelocations.velero.io -n openshift-adp
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME           PHASE       LAST VALIDATED   AGE   DEFAULT
    dpa-sample-1   Available   3s               15s   true
    Copy to Clipboard Toggle word wrap

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

    Backup CR 示例

    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: test-backup
      namespace: openshift-adp
    spec:
      includedNamespaces:
      - <application_namespace> 
    1
    Copy to Clipboard Toggle word wrap

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

    $ oc apply -f <backup_cr_filename>
    Copy to Clipboard Toggle word wrap

验证

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

    $ oc describe backup test-backup -n openshift-adp
    Copy to Clipboard Toggle word wrap

    输出示例

    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>
    Copy to Clipboard Toggle word wrap

1.6. 安装和配置 OADP

1.6.1. 安装 OADP

您可以使用 OpenShift API for Data Protection (OADP)与 Red Hat OpenShift Service on AWS (ROSA) 集群来备份和恢复应用程序数据。

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

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

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

必须准备 Amazon Web Services 帐户,并配置为接受 OpenShift API for Data Protection (OADP) 安装。

流程

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

    重要

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

    $ export CLUSTER_NAME=my-cluster 
    1
    
      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}"
    Copy to Clipboard Toggle word wrap
    1
    my-cluster 替换为您的 ROSA 集群名称。
  2. 在 AWS 帐户中,创建一个 IAM 策略以允许访问 AWS S3:

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

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

      注意

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

      $ if [[ -z "${POLICY_ARN}" ]]; then
        cat << EOF > ${SCRATCH}/policy.json 
      1
      
        {
        "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
      Copy to Clipboard Toggle word wrap
      1
      SCRATCH 是为环境变量创建的临时目录的名称。
    3. 运行以下命令来查看策略 ARN:

      $ echo ${POLICY_ARN}
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
    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)
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令来查看角色 ARN:

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

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

AWS 安全令牌服务 (AWS STS) 是一个全局 Web 服务,它为 IAM 或联邦用户提供简短凭证。使用 STS 的 Red Hat OpenShift Service on AWS (ROSA) 是 ROSA 集群的建议凭证模式。本文档论述了如何使用 AWS STS 在 ROSA 上安装 OpenShift API for Data Protection (OADP)。

重要

不支持 Restic。

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

文件系统示例包括:

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

对于备份卷,使用 AWS STS 的 ROSA 上 OADP 仅支持原生快照和 Container Storage Interface (CSI) 快照。

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

目前,ROSA 集群不支持 Data Mover 功能。您可以使用原生 AWS S3 工具移动数据。

先决条件

  • 具有所需访问和令牌的 Red Hat OpenShift Service on AWS ROSA 集群。具体步骤请查看为 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> 
      1
      
      EOF
      Copy to Clipboard Toggle word wrap
      1
      <aws_region > 替换为用于 STS 端点的 AWS 区域。
    2. 为 OADP 创建命名空间:

      $ oc create namespace openshift-adp
      Copy to Clipboard Toggle word wrap
    3. 创建 Red Hat OpenShift Service on AWS secret:

      $ oc -n openshift-adp create secret generic cloud-credentials \
        --from-file=${SCRATCH}/credentials
      Copy to Clipboard Toggle word wrap
      注意

      在 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 控制台从 OperatorHub 安装

      前面的 secret 由 CCO 自动创建。

  2. 安装 OADP Operator:

    1. 在 Red Hat OpenShift Service on AWS Web 控制台中浏览 OperatorsOperatorHub
    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
    Copy to Clipboard Toggle word wrap
  4. 输入以下命令检查应用程序的存储默认存储类:

    $ oc get pvc -n <namespace>
    Copy to Clipboard Toggle word wrap

    输出示例

    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
    Copy to Clipboard Toggle word wrap

  5. 运行以下命令来获取存储类:

    $ oc get storageclass
    Copy to Clipboard Toggle word wrap

    输出示例

    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
    Copy to Clipboard Toggle word wrap

    注意

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

    • 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 
      1
      
          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:  
      2
      
              enable: false
              uploaderType: kopia 
      3
      
      EOF
      Copy to Clipboard Toggle word wrap
      1
      ROSA 支持内部镜像备份。如果您不想使用镜像备份,请将此字段设置为 false
      2
      请参阅有关 nodeAgent 属性的重要备注。
      3
      上传程序的类型。可能的值为 restickopia。内置 Data Mover 使用 Kopia 作为默认的上传程序机制,无论 uploaderType 字段的值是什么。
  1. 如果使用 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 
    1
    
        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: 
    2
    
            enable: false
            uploaderType: restic
        snapshotLocations:
          - velero:
              config:
                credentialsFile: /tmp/credentials/openshift-adp/cloud-credentials-credentials 
    3
    
                enableSharedConfig: "true" 
    4
    
                profile: default 
    5
    
                region: ${REGION} 
    6
    
              provider: aws
    EOF
    Copy to Clipboard Toggle word wrap
    1
    ROSA 支持内部镜像备份。如果您不想使用镜像备份,请将此字段设置为 false。
    2
    请参阅有关 nodeAgent 属性的重要备注。
    3
    credentialsFile 字段是 pod 上存储桶凭证的挂载位置。
    4
    enableSharedConfig 字段允许 snapshotLocations 共享或重复使用为存储桶定义的凭证。
    5
    使用 AWS 凭证文件中设置的配置集名称。
    6
    region 指定为您的 AWS 区域。这必须与集群区域相同。

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

重要

此配置中的 resticenable 参数设置为 false,因为 OADP 不支持 ROSA 环境中的 Restic。

如果使用 OADP 1.2,请替换此配置:

nodeAgent:
  enable: false
  uploaderType: restic
Copy to Clipboard Toggle word wrap

使用以下配置:

restic:
  enable: false
Copy to Clipboard Toggle word wrap

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

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

当在 ROSA 安全令牌服务(STS)集群中安装 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
    Copy to Clipboard Toggle word wrap

    订阅示例

    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 
    1
    
      installPlanApproval: Manual
      name: redhat-oadp-operator
      source: prestage-operators
      sourceNamespace: openshift-marketplace
      startingCSV: oadp-operator.v1.4.2
    Copy to Clipboard Toggle word wrap

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

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

    其中:

    <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
    Copy to Clipboard Toggle word wrap

    输出示例

    [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
    Copy to Clipboard Toggle word wrap

  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> 
    1
    
          credential:
            name: cloud-credentials
            key: credentials
          prefix: velero
          default: true
      configuration:
        velero:
          defaultPlugins:
          - aws
          - openshift
    Copy to Clipboard Toggle word wrap
    1
    指定 CloudStorage CR。
  5. 运行以下命令来创建 DataProtectionApplication CR:

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

    $  oc get dpa -n openshift-adp -o yaml
    Copy to Clipboard Toggle word wrap

    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
    Copy to Clipboard Toggle word wrap

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

    $ oc get backupstoragelocations.velero.io -n openshift-adp
    Copy to Clipboard Toggle word wrap

    BackupStorageLocation示例

    NAME       PHASE       LAST VALIDATED   AGE   DEFAULT
    ts-dpa-1   Available   3s               6s    true
    Copy to Clipboard Toggle word wrap

1.7. OADP 备份

1.7.1. 备份应用程序

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

您可以通过创建一个 Backup 自定义资源 (CR) 来备份应用程序。如需更多信息,请参阅创建备份 CR。以下是 Backup CR 的不同备份类型:

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

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

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

先决条件

  • 已安装 OADP Operator。

流程

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

    $ velero backup create <backup-name> --snapshot-volumes false 
    1
    Copy to Clipboard Toggle word wrap
    1
    --snapshot-volumes 参数的值 指定为 false
  2. 要了解有关备份资源的更多详细信息,请运行以下命令:

    $ velero describe backup <backup_name> --details 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定备份的名称。
  3. 要在运行实际恢复前预览恢复中包含的资源,请运行以下命令:

    $ velero restore create --from-backup <backup-name> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定为查看备份资源而创建的备份名称。
    重要

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

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

    $ velero describe restore <restore_name> --details 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定恢复的名称。

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

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

1.7.1.2. 已知问题

Red Hat OpenShift Service on AWS 4 强制执行 pod 安全准入(PSA)策略,该策略可以在 Restic 恢复过程中阻止 pod 的就绪状态。

这个问题已在 OADP 1.1.6 和 OADP 1.2.2 版本中解决,因此建议用户升级到这些版本。

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
    Copy to Clipboard Toggle word wrap

    输出示例

    NAMESPACE       NAME              PHASE       LAST VALIDATED   AGE   DEFAULT
    openshift-adp   velero-sample-1   Available   11s              31m
    Copy to Clipboard Toggle word wrap

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

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

    $ oc get backups.velero.io -n openshift-adp <backup> -o jsonpath='{.status.phase}'
    Copy to Clipboard Toggle word wrap

1.7.3. 创建备份 hook

在执行备份时,可以根据正在备份的 pod,指定在 pod 内要执行的一个或多个命令。

可将命令配置为在任何自定义操作处理(Pre hook)或所有自定义操作完成后执行,且由自定义操作指定的任何其他项目都已备份(Post hook)。

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

流程

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

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

1.7.4. 使用 Schedule CR 调度备份

调度操作允许您在特定时间创建由 Cron 表达式指定的数据的备份。

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

警告

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

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

先决条件

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

流程

  1. 检索 backupStorageLocations CR:

    $ oc get backupStorageLocations -n openshift-adp
    Copy to Clipboard Toggle word wrap

    输出示例

    NAMESPACE       NAME              PHASE       LAST VALIDATED   AGE   DEFAULT
    openshift-adp   velero-sample-1   Available   11s              31m
    Copy to Clipboard Toggle word wrap

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

    $ cat << EOF | oc apply -f -
    apiVersion: velero.io/v1
    kind: Schedule
    metadata:
      name: <schedule>
      namespace: openshift-adp
    spec:
      schedule: 0 7 * * * 
    1
    
      template:
        hooks: {}
        includedNamespaces:
        - <namespace> 
    2
    
        storageLocation: <velero-sample-1> 
    3
    
        defaultVolumesToFsBackup: true 
    4
    
        ttl: 720h0m0s
    EOF
    Copy to Clipboard Toggle word wrap
1
调度备份的 cron 表达式,例如 0 7 * * * 代表在每天 7:00 执行备份。
注意

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

  schedule: "*/10 * * * *"
Copy to Clipboard Toggle word wrap

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

2
要备份的命名空间数组。
3
backupStorageLocations CR 的名称。
4
可选:在 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}'
    Copy to Clipboard Toggle word wrap

1.7.5. 删除备份

您可以通过创建 DeleteBackupRequest 自定义资源 (CR) 或运行 velero backup 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> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定备份的名称。
  2. 应用 DeleteBackupRequest CR 以删除备份:

    $ oc apply -f <deletebackuprequest_cr_filename>
    Copy to Clipboard Toggle word wrap
1.7.5.2. 使用 Velero CLI 删除备份

您可以使用 Velero CLI 删除备份。

先决条件

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

流程

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

    $ velero backup delete <backup_name> -n openshift-adp 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定备份的名称。
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
Copy to Clipboard Toggle word wrap

您可以检查 repo-maintain-job 的日志,以了解清理以及在备份对象存储中删除工件的更多详情。当需要进行下一个完整维护时,您可以在 repo-maintain-job 中看到一个相关的信息,如下例所示:

not due for full maintenance cycle until 2024-00-00 18:29:4
Copy to Clipboard Toggle word wrap
重要

将对象从备份对象存储中删除需要已成功执行了三个完整维护周期。这意味着,要删除备份对象存储中的所有工件,最多需要 72 小时。

1.7.5.4. 删除备份仓库

在删除备份后,当 Kopia 仓库维护周期删除了相关工件后,备份不再被任何元数据或清单对象引用。然后,您可以删除 backuprepository 自定义资源 (CR) 来完成备份删除过程。

先决条件

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

流程

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

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

    $ oc delete backuprepository <backup_repository_name> -n openshift-adp 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定上一步中备份仓库的名称。

1.8. OADP 恢复

1.8.1. 恢复应用程序

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

您可以通过编辑 Restore CR 创建恢复 hook,以便在 pod 中的容器中运行命令。请参阅创建恢复 hook

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

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

先决条件

  • 已安装 OADP Operator。

流程

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

    $ velero backup create <backup-name> --snapshot-volumes false 
    1
    Copy to Clipboard Toggle word wrap
    1
    --snapshot-volumes 参数的值 指定为 false
  2. 要了解有关备份资源的更多详细信息,请运行以下命令:

    $ velero describe backup <backup_name> --details 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定备份的名称。
  3. 要在运行实际恢复前预览恢复中包含的资源,请运行以下命令:

    $ velero restore create --from-backup <backup-name> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定为查看备份资源而创建的备份名称。
    重要

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

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

    $ velero describe restore <restore_name> --details 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定恢复的名称。
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> 
    1
    
      includedResources: [] 
    2
    
      excludedResources:
      - nodes
      - events
      - events.events.k8s.io
      - backups.velero.io
      - restores.velero.io
      - resticrepositories.velero.io
      restorePVs: true 
    3
    Copy to Clipboard Toggle word wrap
    1
    备份 CR 的名称
    2
    可选:指定要包含在恢复过程中的资源数组。资源可以是缩写方式(例如,po 代表 pods)或完全限定的方式。如果未指定,则会包含所有资源。
    3
    可选: 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}'
    Copy to Clipboard Toggle word wrap
  3. 输入以下命令验证备份资源是否已恢复:

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

    $ bash dc-restic-post-restore.sh -> dc-post-restore.sh
    Copy to Clipboard Toggle word wrap
    注意

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

    dc-restic-post-restore.sh → dc-post-restore.sh cleanup 脚本

    #!/bin/bash
    set -e
    
    # if sha256sum exists, use it to check the integrity of the file
    if command -v sha256sum >/dev/null 2>&1; then
      CHECKSUM_CMD="sha256sum"
    else
      CHECKSUM_CMD="shasum -a 256"
    fi
    
    label_name () {
        if [ "${#1}" -le "63" ]; then
    	echo $1
    	return
        fi
        sha=$(echo -n $1|$CHECKSUM_CMD)
        echo "${1:0:57}${sha:0:6}"
    }
    
    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
    Copy to Clipboard Toggle word wrap

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

在文件系统备份(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
    Copy to Clipboard Toggle word wrap
  2. 第一次恢复成功后,通过包含这些资源来执行第二次恢复,例如:

    $ velero restore create <RESTORE_NAME> \
      --from-backup <BACKUP_NAME> \
      --include-resources=deployment.apps
    Copy to Clipboard Toggle word wrap

Legal Notice

Copyright © 2025 Red Hat

OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).

Modified versions must remove all Red Hat trademarks.

Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.

Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the United States and other countries.

Java® is a registered trademark of Oracle and/or its affiliates.

XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.

MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.

Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.

The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.

All other trademarks are the property of their respective owners.

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat