4.14. 高级 OADP 特性和功能
本文档提供有关 OpenShift API for Data Protection (OADP) 的高级功能。
4.14.1. 在同一集群中使用不同的 Kubernetes API 版本
4.14.1.1. 列出集群中的 Kubernetes API 组版本
源集群可能会提供多个 API 版本,其中的一个版本是首选的 API 版本。例如,带有名为 Example
的 API 的源集群可能包括在 example.com/v1
和 example.com/v1beta2
API 组中。
如果您使用 Velero 备份和恢复这样的源集群,Velero 仅备份了使用 Kubernetes API 首选版本的该资源的版本。
要返回上例,如果 example.com/v1
是首选的 API,则 Velero 只备份使用 example.com/v1
的资源的版本。另外,目标集群需要 example.com/v1
在它的一组可用 API 资源中注册,以便 Velero 恢复目标集群上的资源。
因此,您需要在目标集群上生成 Kubernetes API 组版本列表,以确保在一组可用的 API 资源中注册了首选的 API 版本。
流程
- 输入以下命令:
$ oc api-resources
4.14.1.2. 关于启用 API 组版本
默认情况下,Velero 只备份使用 Kubernetes API 的首选版本的资源。但是,Velero 还包括一个启用 API 组版本功能,它解决了这个限制。当在源集群中启用时,这个功能会使 Velero 备份集群中支持的所有 Kubernetes API 组版本,而不只是首选集群。当版本存储在备份 .tar 文件中被保存后,可以在目标集群上恢复它们。
例如,带有名为 Example
的 API 的源集群可能包括在 example.com/v1
和 example.com/v1beta2
API 组中,example.com/v1
是首选 API。
如果没有启用 Enable API Group Versions 功能,Velero 仅备份 Example
的首选 API 组版本,即 example.com/v1
。启用该功能后,Velero 还会备份 example.com/v1beta2
。
当目标集群上启用了“启用 API 组版本”功能时,Velero 根据 API 组版本优先级顺序选择恢复的版本。
启用 API 组版本仍处于测试阶段。
Velero 使用以下算法为 API 版本分配优先级,并将 1
作为最高优先级:
- destination 集群的首选版本
- source_ cluster 的首选版本
- 带有最高 Kubernetes 版本优先级的通用非首选支持版本
其他资源
4.14.1.3. 使用启用 API 组版本
您可以使用 Velero 的启用 API 组版本功能来备份集群中支持的所有 Kubernetes API 组版本,而不只是首选版本。
启用 API 组版本仍处于测试阶段。
流程
-
配置
EnableAPIGroupVersions
功能标记:
apiVersion: oadp.openshift.io/vialpha1 kind: DataProtectionApplication ... spec: configuration: velero: featureFlags: - EnableAPIGroupVersions
其他资源
4.14.2. 从一个集群中备份数据,并将其恢复到另一个集群
4.14.2.1. 关于从一个集群中备份数据,并在另一个集群中恢复数据
OpenShift API for Data Protection (OADP) 旨在在同一 OpenShift Container Platform 集群中备份和恢复应用程序数据。MTC (Migration Toolkit for Containers) 旨在将容器(包括应用程序数据)从一个 OpenShift Container Platform 集群迁移到另一个集群。
您可以使用 OADP 从一个 OpenShift Container Platform 集群中备份应用程序数据,并在另一个集群中恢复它。但是,这样做比使用 MTC 或使用 OADP 在同一集群中备份和恢复更为复杂。
要成功使用 OADP 从一个集群备份数据并将其恢复到另一个集群,除了使用 OADP 备份和恢复数据需要的先决条件和步骤外,还需要考虑以下因素:
- Operator
- 使用 Velero
- UID 和 GID 范围
4.14.2.1.1. Operator
您必须从应用程序的备份中排除 Operator,以便成功备份和恢复。
4.14.2.1.2. 使用 Velero
Velero (基于 OADP 构建)不支持在云供应商间原生迁移持久性卷快照。要在云平台之间迁移卷快照数据,您需要启用 Velero Restic 文件系统备份选项,该选项会在文件系统级别备份卷内容,或使用 OADP Data Mover 进行 CSI 快照。
在 OADP 1.1 及更早版本中,Velero Restic 文件系统备份选项被称为 restic
。在 OADP 1.2 及更高版本中,Velero Restic 文件系统备份选项称为 file-system-backup
。
- 您还必须使用 Velero 的 文件系统备份 在 AWS 区域或 Microsoft Azure 区域之间迁移数据。
- Velero 不支持将数据恢复到比源集群 更早的 Kubernetes 版本的集群。
- 在理论上,可以将工作负载迁移到比源更新的 Kubernetes 版本,但您必须考虑每个自定义资源的集群间 API 组的兼容性。如果 Kubernetes 版本升级会破坏内核或原生 API 组的兼容性,您必须首先更新受影响的自定义资源。
4.14.2.2. 关于确定要备份的 pod 卷
在使用文件系统备份(FSB)启动备份操作前,您必须指定包含要备份的卷的 pod。Velero 将此过程称为"发现"适当的 pod 卷。
Velero 支持两种方法确定 pod 卷:
- opt-in 方法 : opt-in 方法要求您主动表示您要包含 - opt-in - 一个卷在备份中。您可以通过标记包含要备份的卷的每个 pod 来达到此目的。当 Velero 找到持久性卷 (PV) 时,它会检查挂载卷的 pod。如果 pod 使用卷名称标记,Velero 会备份 pod。
- opt-out 方法 :使用 opt-out 方法,您必须主动指定您要从备份中排除卷。为此,您可以标记包含您不想备份的卷的每个 pod。当 Velero 找到 PV 时,它会检查挂载卷的 pod。如果 pod 使用卷的名称标记,Velero 不会备份 pod。
4.14.2.2.1. 限制:
-
FSB 不支持备份和恢复
hostpath
卷。但是 FSB 支持备份和恢复本地卷。 - Velero 对它创建的所有备份存储库使用静态通用加密密钥。这个静态密钥意味着可以访问备份存储的任何人也可以解密您的备份数据。务必要限制对备份存储的访问。
对于 PVC,每个增量备份链都会在 pod 重新调度之间维护。
对于不是 PVC 的 pod 卷,如
emptyDir
卷,如果一个 pod 被删除或重新创建(例如,通过ReplicaSet
或一个部署),则这些卷的下一次备份将是完整备份,而不是增量备份。假设 pod 卷的生命周期由其 pod 定义。- 虽然备份数据可能会以递增方式保存,备份大型文件(如数据库)可能需要很长时间。这是因为 FSB 使用 deduplication 来查找需要备份的区别。
- FSB 通过访问运行该 pod 的节点的文件系统来读取和写入卷中的数据。因此,FSB 只能备份从 pod 挂载的卷,而不直接从 PVC 进行挂载。有些 Velero 用户通过运行一个 staging pod (如 BusyBox 或 Alpine 容器)来解决这个限制,以便在执行 Velero 备份前挂载这些 PVC 和 PV 对。
-
FSB 要求将卷挂载到
<hostPath>/<pod UID>
下,<hostPath>
可以被配置。有些 Kubernetes 系统(如 vCluster)不会在<pod UID>
子目录下挂载卷,VFB 无法按预期工作。
4.14.2.2.2. 使用 opt-in 方法备份 pod 卷
您可以使用 opt-in 方法来指定需要由文件系统备份(FSB)备份哪些卷。您可以使用 backup.velero.io/backup-volumes
命令进行此操作。
流程
在每个包含您要备份的一个或多个卷的 pod 中,输入以下命令:
$ oc -n <your_pod_namespace> annotate pod/<your_pod_name> \ backup.velero.io/backup-volumes=<your_volume_name_1>, \ <your_volume_name_2>>,...,<your_volume_name_n>
其中:
<your_volume_name_x>
- 指定 pod 规格中 xth 卷的名称。
4.14.2.2.3. 使用 opt-out 方法备份 pod 卷
使用 opt-out 方法时,所有 pod 卷都使用文件系统备份(FSB)备份,但有一些例外:
- 挂载默认服务帐户令牌、secret 和配置映射的卷。
-
hostPath
卷
您可以使用 opt-out 方法指定不要备份的卷。您可以使用 backup.velero.io/backup-volumes-excludes
命令进行此操作。
流程
在包含您不想备份的一个或多个卷的 pod 中,运行以下命令:
$ oc -n <your_pod_namespace> annotate pod/<your_pod_name> \ backup.velero.io/backup-volumes-excludes=<your_volume_name_1>, \ <your_volume_name_2>>,...,<your_volume_name_n>
其中:
<your_volume_name_x>
- 指定 pod 规格中 xth 卷的名称。
您可以使用 --default-volumes-to-fs-backup
标志运行 velero install
命令,为所有 Velero 备份启用此行为。
4.14.2.3. UID 和 GID 范围
如果您从一个集群备份数据并将其恢复到另一个集群,则可能会出现 UID (用户 ID)和 GID (组 ID)范围的问题。下面的部分解释了这些潜在问题和缓解措施:
- 问题概述
- 命名空间 UID 和 GID 范围可能会因目标集群而异。OADP 不会备份和恢复 OpenShift UID 范围元数据。如果备份的应用程序需要特定的 UID,请确保范围是可用的。如需有关 OpenShift 的 UID 和 GID 范围的更多信息,请参阅 OpenShift 和 UID 的指南。
- 问题详细描述
当您使用
oc create namespace
在 OpenShift Container Platform 中创建命名空间时,OpenShift Container Platform 会为命名空间分配一个唯一用户 ID (UID) 范围,即 Supplemental Group (GID)范围和唯一的 SELinux MCS 标签。此信息存储在集群的metadata.annotations
字段中。此信息是安全性上下文约束(SCC)注解的一部分,它由以下组件组成:-
openshift.io/sa.scc.mcs
-
openshift.io/sa.scc.supplemental-groups
-
openshift.io/sa.scc.uid-range
-
当使用 OADP 恢复命名空间时,它会自动使用 metadata.annotations
中的信息,而无需为目标集群重置它。因此,如果满足以下条件,工作负载可能无法访问备份的数据:
- 存在一个带有其他 SCC 注解的现有命名空间,例如在另一个集群中。在这种情况下,OADP 在备份过程中使用现有命名空间,而不是您要恢复的命名空间。
备份过程中使用了标签选择器,但执行工作负载的命名空间没有标签。在这种情况下,OADP 不会备份命名空间,而是在恢复过程中创建一个新的命名空间,该命名空间不包含备份命名空间的注解。这会导致为命名空间分配一个新的 UID 范围。
如果 OpenShift Container Platform 根据从持久性卷数据备份时更改的命名空间注解为 pod 为
securityContext
UID,则可能会出现问题。- 容器 UID 不再与文件所有者的 UID 匹配。
发生错误,因为 OpenShift Container Platform 没有修改目标集群的 UID 范围,以匹配备份集群的数据。因此,备份集群与目标集群的 UID 不同,这意味着应用程序无法向目标集群读取或写入数据。
- 缓解方案
- 您可以使用以下一个或多个缓解方案来解决 UID 和 GID 范围问题:
简单的缓解方案:
-
如果您在
Backup
CR 中使用标签选择器过滤要包含在备份中的对象,请确保将此标签选择器添加到包含工作区的命名空间中。 - 在尝试恢复具有相同名称的命名空间前,请删除目标集群上任何已存在的命名空间版本。
-
如果您在
高级缓解方案:
- 迁移后,通过在 OpenShift 命名空间中解决重叠的 UID 范围来修复 UID 范围。第 1 步是可选的。
有关 OpenShift Container Platform 中 UID 和 GID 范围的详细讨论,重点放在一个集群中备份数据并在另一个集群中恢复数据时出现问题,请参阅 OpenShift 和 UID 的指南。
4.14.2.4. 从一个集群中备份数据,并将其恢复到另一个集群
通常,您可以从一个 OpenShift Container Platform 集群备份数据,并以与将数据备份并恢复到同一集群的方式在另一个 OpenShift Container Platform 集群上恢复数据。但是,从一个 OpenShift Container Platform 集群备份数据时,会有一些额外的前提条件和不同之处,并在另一个集群中恢复它。
先决条件
- 所有在平台上备份和恢复的相关先决条件(如 AWS、Microsoft Azure、GCP 等),特别是数据保护应用程序(DPA) 的先决条件。
流程
在为您的平台提供的流程中添加以下内容:
- 确保备份存储位置 (BSL) 和卷快照位置具有相同的名称和路径,以将资源恢复到另一个集群。
- 在集群间共享相同的对象存储位置凭证。
- 为获得最佳结果,请使用 OADP 在目标集群中创建命名空间。
如果您使用 Velero
file-system-backup
选项,请运行以下命令启用--default-volumes-to-fs-backup
标志以便在备份过程中使用:$ velero backup create <backup_name> --default-volumes-to-fs-backup <any_other_options>
在 OADP 1.2 及更高版本中,Velero Restic 选项名为 file-system-backup
。
4.14.3. OADP 存储类映射
4.14.3.1. 存储类映射
存储类映射允许您定义规则或策略,指定应将哪些存储类应用到不同类型的数据。此功能根据访问频率、数据重要性和成本注意事项自动确定存储类的过程。它通过确保数据存储在最合适的存储类中用于其特征和使用模式来优化存储效率和经济性。
您可以使用 change-storage-class-config
字段更改数据对象的存储类,这可让您通过在不同存储层之间移动数据(如从标准到归档存储)来优化成本和性能,例如,根据您的需要和访问模式来优化成本和性能。
4.14.3.1.1. 使用 MTC 的存储类映射
您可以使用 MTC 将容器(包括应用程序数据)从一个 OpenShift Container Platform 集群迁移到另一个集群以及存储类映射和转换。您可以在同一个集群中迁移持久性卷(PV)的存储类来转换它。要做到这一点,您必须在 MTC web 控制台中创建并运行迁移计划。
4.14.3.1.2. 使用 OADP 映射存储类
您可以在 Velero 插件 v1.1.0 及之后的版本中使用 OpenShift API 进行数据保护 (OADP),在恢复过程中更改持久性卷 (PV) 的存储类,方法是在 Velero 命名空间中的配置映射中配置存储类映射。
要使用 OADP 部署 ConfigMap,请使用 change-storage-class-config
字段。您必须根据您的云供应商更改存储类映射。
流程
运行以下命令来更改存储类映射:
$ cat change-storageclass.yaml
在 Velero 命名空间中创建配置映射,如下例所示:
Example
apiVersion: v1 kind: ConfigMap metadata: name: change-storage-class-config namespace: openshift-adp labels: velero.io/plugin-config: "" velero.io/change-storage-class: RestoreItemAction data: standard-csi: ssd-csi
运行以下命令保存存储类映射首选项:
$ oc create -f change-storage-class-config