1.3. 迁移工具和先决条件

您可以使用 MTC 将应用程序工作负载从 OpenShift Container Platform 3.7、3.9、3.10 和 3.11 迁移到 OpenShift Container Platform 4.5。MTC 可让您控制迁移的过程,并最小化应用程序停机时间。

MTC web 控制台和 API 基于 Kubernetes 自定义资源,您可以按照命名空间迁移有状态应用程序工作负载。

MTC 支持将数据从源集群迁移到目标集群的文件系统和快照数据复制方法。您可以选择适合于您的环境并受您的存储供应商支持的方法。

您可以在迁移期间的特定点使用迁移 hook 运行 Ansible playbook。您在创建迁移计划时可以添加 hook。

注意

OpenShift Container Platform 4 中已弃用服务目录。您可以将服务目录置备的工作负载资源从 OpenShift Container Platform 3 迁移到 4,但无法在迁移后在这些工作负载上执行服务目录操作,如 provisiondeprovisionupdate

如果无法迁移服务目录资源,MTC web 控制台会显示一条消息。

重要

在开始迁移前,请 查看规划迁移的信息。

1.3.1. 容器迁移工具(Migration Toolkit for Containers)工作流

您可以使用 MTC(Migration Toolkit for Containers) web 控制台或 Kubernetes API 将 OpenShift Container Platform 源集群中的 Kubernetes 资源、持久性卷数据和内部容器镜像迁移到 OpenShift Container Platform 4.5 目标集群。

(MTC)迁移以下资源:

  • 在迁移计划中指定的命名空间。
  • 命名空间范围的资源:当 MTC 迁移命名空间时,它会迁移与该命名空间关联的所有对象和资源,如服务或 Pod。另外,如果一个资源在命名空间中存在但不在集群级别,这个资源依赖于集群级别存在的另外一个资源,MTC 会迁移这两个资源。

    例如,安全性上下文约束(SCC)是一个存在于集群级别的资源,服务帐户(SA)是存在于命名空间级别的资源。如果 MTC 迁移的命名空间中存在 SA,MTC 会自动找到链接到 SA 的所有 SCC,并迁移这些 SCC。同样,MTC 会迁移链接到命名空间持久性卷的持久性卷声明。

  • 自定义资源(CR)和自定义资源定义(CRD): MTC 会自动迁移任何在命名空间级别存在的 CR,以及链接到这些 CR 的 CRD。

使用 MTC Web 控制台迁移应用程序涉及以下步骤:

  1. 在所有集群中安装 MTC Operator。

    您可以在有限的或没有互联网访问的受限环境中为 Containers Operator 安装 Migration Toolkit。源和目标集群必须可以在相互间进行访问,而需要可以访问 registry 的镜像(mirror).

  2. 配置复制存储库,这是 MTC 用来迁移数据的中间对象存储。

    源和目标集群必须有对复制仓库的不受限制的网络访问权限。在受限环境中,您可以使用内部托管的 S3 存储存储库。如果使用代理服务器,您必须将其配置为允许复制仓库和集群间的网络流量。

  3. 在 MTC web 控制台中添加源集群。
  4. 在 MTC web 控制台中添加复制存储库。
  5. 创建迁移计划,包含以下数据迁移选项之一:

    • Copy:MTC 将数据从源集群复制到复制存储库,再从复制存储库把数据复制到目标集群。

      注意

      如果您使用直接镜像迁移或直接卷迁移,则镜像或卷会直接从源集群复制到目标集群。

      迁移 PV 复制
    • Move:MTC 从源集群中卸载一个远程卷(例如 NFS),在目标集群上创建一个指向这个远程卷的 PV 资源,然后在目标集群中挂载远程卷。在目标集群中运行的应用程序使用源集群使用的同一远程卷。远程卷必须可以被源集群和目标集群访问。

      注意

      虽然复制仓库没有出现在此图表中,但迁移需要它。

      迁移 PV 移动
  6. 运行迁移计划,使用以下选项之一:

    • Stage (可选)在不停止应用程序的情况下将数据复制到目标集群。

      Stage 可以多次运行,以便在迁移前将大多数数据复制到目标。这可最小化迁移和应用程序停机时间。

    • Migrate 在源集群中停止应用程序,并在目标集群中重新创建其资源。您可以选择在不停止应用程序的情况下迁移工作负载。
OCP 3 到 4 的应用程序迁移

1.3.2. 容器自定义资源迁移工具

MTC 会创建以下自定义资源(CR):

migration architecture diagram

20 MigCluster (配置, MTC 集群): 集群定义

20 MigStorage (配置, MTC 集群): Storage 定义

20 MigPlan (配置, MTC 集群):迁移计划

MigPlan CR 描述了要迁移的源和目标集群、复制仓库和命名空间。它与 0 个、1 个或多个 MigMigration CR 关联。

注意

删除 MigPlan CR 会删除关联的 MigMigration CR。

20 BackupStorageLocation (配置, MTC 集群): Velero 备份对象的位置

20 VolumeSnapshotLocation (配置, MTC 集群): Velero 卷快照的位置

20 MigMigration (操作,MTC 集群)::迁移,在每次进行 stage 或迁移数据时创建。每个 MigMigration CR 都与 MigPlan CR 关联。

20 Backup(操作,源集群):当运行迁移计划时,MigMigration CR 在每个源集群上创建两个 Velero 备份 CR:

  • 备份 CR #1 用于Kubernetes 对象
  • 备份 CR #2 用于 PV 数据

20 Restore (操作,目标集群):在运行迁移计划时,MigMigration CR 在目标集群上创建两个 Velero 恢复 CR:

  • 恢复 CR #1(使用备份 CR #2)用于 PV 数据
  • 恢复 CR #2(使用备份 CR #1)用于 Kubernetes 对象

1.3.3. 关于数据复制方法

Migration Toolkit for Containers (MTC) 支持将数据从源集群迁移到目标集群的文件系统和快照数据复制方法。您可以选择适合于您的环境并受您的存储供应商支持的方法。

1.3.3.1. 文件系统复制方法

MTC 工具将数据文件从源集群复制到复制存储库,并从那里复制到目标集群。

表 1.1. 文件系统复制方法概述

优点限制:
  • 集群可以有不同的存储类
  • 所有 S3 存储供应商均支持
  • 使用 checksum 验证数据(可选)
  • 比快照复制方法慢
  • 可选的数据校验可能会显著降低性能

1.3.3.2. 快照复制方法

MTC 将源集群数据的快照复制到云供应商的复制仓库。数据在目标集群上恢复。

AWS、Google Cloud Provider 和 Microsoft Azure 支持快照复制方法。

表 1.2. 快照复制方法概述

优点限制:
  • 比文件系统复制方法快
  • 云供应商必须支持快照。
  • 集群必须位于相同的云供应商。
  • 集群必须位于同一位置或区域。
  • 集群必须具有相同的存储类。
  • 存储类必须与快照兼容。

1.3.4. 关于迁移 hook

在使用 MTC 进行迁移的特定时间点上,可以使用迁移 hook 运行自定义代码。您可以在单个迁移计划中添加最多四个迁移 hook,每个 hook 在迁移过程的不同阶段运行。

迁移 hook 执行的任务包括自定义应用程序默认、手动迁移不受支持的数据类型以及在迁移后更新应用程序。

迁移 hook 会在以下迁移步骤之一中,在源或目标集群上运行:

  • PreBackup:在源集群中备份资源前
  • PostBackup:在源集群中备份资源后
  • PreRestore:在目标集群上恢复资源前
  • PostRestore:在目标集群中恢复资源后

您可以使用 Ansible playbook 或自定义 hook 容器创建 hook。

Ansible playbook

Ansible playbook 作为一个配置映射挂载到 hook 容器上。hook 容器使用 MigPlan 自定义资源(CR)中指定的集群、服务帐户和命名空间以作业的形式运行。作业会继续运行,直到达到默认限制的 6 次重试或成功完成为止。即使初始 pod 被驱除或终止,也会继续。

默认 Ansible 运行时镜像为 registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel7:1.4。此镜像基于 Ansible Runner 镜像,并包含 Ansible Kubernetes 资源的 python-openshift,以及更新的 oc 二进制文件。

可选: 您可以使用包含其他 Ansible 模块或工具的自定义 Ansible 运行时镜像,而不是默认镜像。

自定义 hook 容器

您可以创建包含 Ansible playbook 或自定义代码的自定义 hook 容器。