3.4. 迁移应用程序

您可以使用 Migration Toolkit for Containers(MTC)web 控制台或命令行来迁移应用程序。

3.4.1. 先决条件

MTC(Migration Toolkit for Containers)有以下先决条件:

  • 必须使用在所有集群中具有 cluster-admin 权限的用户登录。
  • 在所有集群中,MTC 版本必须相同。
  • Clusters:

    • 源集群必须升级到最新的 MTC z-stream 版本。
    • 运行 migration-controller pod 的集群必须具有对其他集群的不受限制的网络访问权限。
    • 集群必须具有相互无限的网络访问权限。
    • 集群必须具有对复制存储库的不受限制的网络访问权限。
    • 集群必须能够使用端口 443 上的 OpenShift 路由进行通信。
    • 集群不能有关键条件。
    • 集群必须处于 ready 状态。
  • 卷迁移:

    • 持久性卷(PV)必须有效。
    • PV 必须绑定到持久性卷声明。
    • 如果使用 move 方法复制 PV,集群必须具有对远程卷的不受限制的网络访问权限。
    • 如果使用快照复制方法复制 PV,则适用以下先决条件:

      • 云供应商必须支持快照。
      • 卷必须具有相同的云供应商。
      • 卷必须位于同一区域。
      • 卷必须具有相同的存储类。
  • 如果在代理环境中执行直接卷迁移,您必须配置 Stunnel TCP 代理。
  • 如果执行直接镜像迁移,您必须将源集群的内部 registry 公开给外部流量。

3.4.1.1. 创建 CA 证书捆绑包文件

如果您使用自签名证书来保护集群或 MTC 的 Migration Toolkit 的复制仓库的安全,则证书验证可能会失败,并显示以下错误消息: Certificate signed by unknown authority

您可以创建自定义 CA 证书捆绑包文件,并在添加集群或复制存储库时将其上传到 MTC web 控制台。

流程

从远程端点下载 CA 证书,并将其保存为 CA 捆绑包文件:

$ echo -n | openssl s_client -connect <host_FQDN>:<port> \ 1
  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <ca_bundle.cert> 2
1
指定端点的主机 FQDN 和端口,如 api.my-cluster.example.com:6443
2
指定 CA 捆绑包文件的名称。

3.4.1.2. 为直接卷迁移配置代理

如果要从代理后面的源集群执行直接卷迁移,您必须在 MigrationController 自定义资源(CR)中配置 Stunnel 代理。stunnel 在源和目标集群之间为 TCP 连接创建透明的隧道,而不更改证书。

注意

直接卷迁移只支持一个代理。如果目标集群也位于代理后面,则源集群无法访问目标集群的路由。

先决条件

  • 必须使用在所有集群中具有 cluster-admin 权限的用户登录。

流程

  1. 登录到运行 MigrationController Pod 的集群。
  2. 获取 MigrationController CR 清单:

    $ oc get migrationcontroller <migration_controller> -n openshift-migration
  3. 添加 stunnel_tcp_proxy 参数:

    apiVersion: migration.openshift.io/v1alpha1
    kind: MigrationController
    metadata:
      name: migration-controller
      namespace: openshift-migration
    ...
    spec:
      stunnel_tcp_proxy: <stunnel_proxy> 1
    1
    指定 Stunnel 代理: http://<user_name>:<password>@<ip_address>:<port>
  4. 将清单保存为 migration-controller.yaml
  5. 应用更新的清单:

    $ oc replace -f migration-controller.yaml -n openshift-migration

3.4.1.3. 为迁移 hook 编写 Ansible playbook

您可以编写 Ansible playbook 以用作迁移 hook。通过使用 MTC web 控制台或在 MigPlan 自定义资源(CR)清单中指定 spec.hooks 参数的值来在迁移计划中添加 hook。

Ansible playbook 作为一个配置映射挂载到 hook 容器上。hook 容器使用 MigPlan CR 中指定的集群、服务帐户和命名空间以作业的形式运行。hook 容器使用指定的服务帐户令牌,以便当任务在集群中运行前无需进行身份验证。

3.4.1.3.1. Ansible 模块

您可以使用 Ansible shell 模块来运行 oc 命令。

shell 模块示例

- hosts: localhost
  gather_facts: false
  tasks:
  - name: get pod name
    shell: oc get po --all-namespaces

您可以使用 kubernetes.core 模块(如 k8s_info )与 Kubernetes 资源交互。

k8s_facts 模块示例

- hosts: localhost
  gather_facts: false
  tasks:
  - name: Get pod
    k8s_info:
      kind: pods
      api: v1
      namespace: openshift-migration
      name: "{{ lookup( 'env', 'HOSTNAME') }}"
    register: pods

  - name: Print pod name
    debug:
      msg: "{{ pods.resources[0].metadata.name }}"

在非零退出状态通常不会生成的情况下,可以使用 fail 模块生成一个非零退出状态,以确保可以检测到 hook 的成功或失败。hook 以作业形式运行,hook 的成功或失败状态取决于作业容器的退出状态。

fail 模块示例

- hosts: localhost
  gather_facts: false
  tasks:
  - name: Set a boolean
    set_fact:
      do_fail: true

  - name: "fail"
    fail:
      msg: "Cause a failure"
    when: do_fail

3.4.1.3.2. 环境变量

MigPlan CR 名称和迁移命名空间作为环境变量传递给 hook 容器。这些变量可使用 lookup 插件访问。

环境变量示例

- hosts: localhost
  gather_facts: false
  tasks:
  - set_fact:
      namespaces: "{{ (lookup( 'env', 'migration_namespaces')).split(',') }}"

  - debug:
      msg: "{{ item }}"
    with_items: "{{ namespaces }}"

  - debug:
      msg: "{{ lookup( 'env', 'migplan_name') }}"

3.4.1.4. 其他资源

3.4.2. 使用 MTC web 控制台迁移应用程序

您可以使用 MTC web 控制台配置集群和复制存储库。然后,您可以创建并运行迁移计划。

3.4.2.1. 启动 MTC web 控制台

您可以在浏览器中启动 MTC web 控制台。

先决条件

  • MTC web 控制台必须具有到 OpenShift Container Platform Web 控制台的网络访问权限。
  • MTC web 控制台必须具有到 OAuth 授权服务器的网络访问权限。

流程

  1. 登录到已安装 MTC 的 OpenShift Container Platform 集群。
  2. 输入以下命令来获取 MTC web 控制台 URL:

    $ oc get -n openshift-migration route/migration -o go-template='https://{{ .spec.host }}'

    输出类似于以下: https://migration-openshift-migration.apps.cluster.openshift.com

  3. 启动浏览器并进入 MTC web 控制台。

    注意

    如果在安装 MTC 工具套件 Operator 后尝试立即访问 MTC web 控制台,则该控制台可能无法加载,因为 Operator 仍然在配置集群。等待几分钟后重试。

  4. 如果您使用自签名的 CA 证书,则会提示您接受源集群 API 服务器的 CA 证书。网页会引导您接受剩余证书的过程。
  5. 使用 OpenShift Container Platform 的用户名密码进行登陆。

3.4.2.2. 在 MTC web 控制台中添加集群

您可以在 MTC web 控制台中添加一个集群到 Migration Toolkit for Containers(MTC)web 控制台。

先决条件

  • 如果要使用 Azure 快照复制数据:

    • 您必须为集群指定 Azure 资源组名称。
    • 集群必须位于同一 Azure 资源组中。
    • 集群必须位于同一地理位置。

流程

  1. 登录到集群。
  2. 获取 migration-controller 服务帐户令牌:

    $ oc sa get-token migration-controller -n openshift-migration
    eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJtaWciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoibWlnLXRva2VuLWs4dDJyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Im1pZyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImE1YjFiYWMwLWMxYmYtMTFlOS05Y2NiLTAyOWRmODYwYjMwOCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDptaWc6bWlnIn0.xqeeAINK7UXpdRqAtOj70qhBJPeMwmgLomV9iFxr5RoqUgKchZRG2J2rkqmPm6vr7K-cm7ibD1IBpdQJCcVDuoHYsFgV4mp9vgOfn9osSDp2TGikwNz4Az95e81xnjVUmzh-NjDsEpw71DH92iHV_xt2sTwtzftS49LpPW2LjrV0evtNBP_t_RfskdArt5VSv25eORl7zScqfe1CiMkcVbf2UqACQjo3LbkpfN26HAioO2oH0ECPiRzT0Xyh-KwFutJLS9Xgghyw-LD9kPKcE_xbbJ9Y4Rqajh7WdPYuB0Jd9DPVrslmzK-F6cgHHYoZEv0SvLQi-PO0rpDrcjOEQQ
  3. 在 MTC web 控制台中点 Clusters
  4. Add cluster
  5. 填写以下字段:

    • Cluster name:集群名称可包含小写字母(a-z)和数字(0-9)。它不能包含空格或国际字符。
    • URL:指定 API 服务器 URL,例如 https://<www.example.com>:8443
    • Service account token:粘贴 migration-controller 服务帐户令牌。
    • 公开的路由主机到镜像 registry:如果您使用直接镜像迁移,请指定源集群镜像 registry 的公开路由,例如 www.example.apps.cluster.com

      您可以指定一个端口。默认端口为 5000

    • Azure cluster:如果使用 Azure 快照复制数据,您必须选择此选项。
    • Azure resource group:如果选择了 Azure cluster,则会显示此字段。指定 Azure 资源组。
    • 需要 SSL 验证:可选:选择这个选项验证到集群的 SSL 连接。
    • CA bundle file:如果选择了 Require SSL 验证,则会显示此字段。如果您为自签名证书创建了自定义 CA 证书捆绑包文件,请点 Browse,选择 CA 捆绑包文件并上传它。
  6. Add cluster

    集群会出现在 Clusters 列表中。

3.4.2.3. 在 MTC web 控制台中添加复制存储库

您可以将对象存储桶作为复制仓库添加到 MTC 的 web 控制台的 Migration Toolkit for Containers(MTC)web 控制台。

先决条件

  • 您必须配置用于迁移数据的对象存储桶。

流程

  1. 在 MTC web 控制台中点 Replication repositories
  2. Add repository
  3. 选择 Storage provider type 并填写以下字段:

    • AWS 适用于 S3、MCSG 和通用 S3 供应商:

      • Replication repository name:指定 MTC web 控制台中的复制存储库。
      • S3 bucket name:指定您创建的 S3 存储桶的名称。
      • S3 bucket region:指定 S3 存储桶区域。AWS S3 必填Optional 用于其他 S3 供应商。
      • S3 端点:指定 S3 服务的 URL,而不是存储桶,例如:https://<s3-storage.apps.cluster.com>。通用 S3 供应商必填。您必须使用 https:// 前缀。
      • S3 provider access key:为 AWS 指定 <AWS_SECRET_ACCESS_KEY> ,或者为 MCG 指定 S3 供应商访问密钥。
      • S3 provider secret access key:为 AWS 指定 <AWS_ACCESS_KEY_ID> ,或者为 MCG 指定 S3 供应商 secret 访问密钥。
      • Require SSL verification:如果您使用的是通用 S3 供应商,则清除此复选框。
      • 如果您使用自定义 CA 捆绑包,请点击 Browse 并浏览到所需的 Base64 编码的 CA 捆绑包文件。
    • GCP

      • Replication repository name:指定 MTC web 控制台中的复制存储库。
      • GCP bucket name:指定 GCP 存储桶的名称。
      • GCP credential JSON blob:在 credentials-velero 文件中指定字符串。
    • Azure

      • Replication repository name:指定 MTC web 控制台中的复制存储库。
      • Azure resource group:指定 Azure Blob 存储的资源组。
      • Azure storage account name:指定 Azure Blob 存储帐户名称
      • Azure credentials - INI file contents:在 credentials-velero 文件中指定字符串。
  4. Add repository 并等待连接验证。
  5. Close

    新仓库会出现在 Replication repositories 列表中。

3.4.2.4. 在 MTC web 控制台中创建迁移计划

您可以在 Migration Toolkit for Containers(MTC)web 控制台中创建一个迁移计划。

先决条件

  • 必须使用在所有集群中具有 cluster-admin 权限的用户登录。
  • 您必须确保在所有集群中安装相同的 MTC 版本。
  • 您必须在 MTC web 控制台中添加集群和复制存储库。
  • 如果要使用 move 数据复制方法迁移持久性卷(PV),则源和目标集群必须有对远程卷的不间断网络访问权限。
  • 如果要使用直接镜像迁移,源集群的 MigCluster 自定义资源清单必须指定内部镜像 registry 的公开路由。

流程

  1. 在 MTC web 控制台中点 Migration Plan
  2. Add migration plan
  3. 输入 Plan name 并点 Next

    迁移计划名称不能超过 253 个小写字母数字字符(a-z, 0-9),且不能包含空格或下划线(_)。

  4. 选一个 Source cluster
  5. 选一个 Target cluster
  6. 选一个 Replication repository
  7. 选择要迁移的项目并点 Next
  8. 选择 Source clusterTarget clusterRepository,然后点 Next
  9. Namespaces 页面中,选择要迁移的项目并点 Next
  10. Persistent volumes 页面中,点每个 PV 的 迁移类型

    • Copy 选项将源集群的 PV 中的数据复制到复制存储库中,然后在目标集群中恢复新创建的具有类似特征的 PV 上的数据。
    • Move 选项从源集群中卸载一个远程卷(例如 NFS),在目标集群上创建一个指向这个远程卷的 PV 资源,然后在目标集群中挂载远程卷。在目标集群中运行的应用程序使用源集群使用的同一远程卷。
  11. Next
  12. Copy options 页面中,为每个 PV 选择 Copy method:

    • 快照复制使用云供应商的快照功能备份和恢复数据。它比 Filesystem copy 要快得多。
    • Filesystem copy 备份源集群中的文件,并在目标集群中恢复它们。

      直接卷迁移需要使用文件系统复制方法。

  13. 您可以选择 Verify copy 来验证使用 Filesystem copy 迁移的数据。数据是通过为每个源文件生成 checksum 并在恢复后检查 checksum 来验证。数据校验可能会显著降低性能
  14. 选择 目标存储类

    如果选择了 Filesystem copy,您可以更改目标存储类。

  15. Next
  16. Migration options 页面上,如果您为源集群指定了公开的镜像 registry 路由,则会选择 Direct 镜像迁移 选项。如果使用 Filesystem copy 迁移数据,Direct PV migration 选项会被选择。

    直接迁移选项将镜像和文件直接从源集群复制到目标集群。这个选项比将源集群的镜像和文件复制到复制存储库,然后再从复制存储库复制到目标集群要快。

  17. Next
  18. 可选:在 Hooks 页中,点 Add Hook 为迁移计划添加 hook。

    hook 运行自定义代码。您可以在单个迁移计划中最多添加四个 hook。每个 hook 在不同的迁移步骤中运行。

    1. 在 web 控制台中输入要显示的 hook 名称。
    2. 如果 hook 是一个 Ansible playbook,请选择 Ansible playbook,然后点 Browse 上传 playbook,或在字段中粘贴 playbook 的内容。
    3. 可选: 如果不使用默认 hook 镜像,请指定 Ansible 运行时镜像。
    4. 如果 hook 不是 Ansible playbook,选择 Custom container image 并指定镜像名称和路径。

      自定义容器镜像可以包含 Ansible playbook。

    5. 选择 Source clusterTarget cluster
    6. 输入 Service account nameService account namespace
    7. 为 hook 选择迁移步骤:

      • preBackup:在应用程序工作负载在源集群中备份前
      • PostBackup:在应用程序工作负载在源集群中备份后
      • preRestore:在目标集群中恢复应用程序工作负载前
      • postRestore:在目标集群中恢复应用程序工作负载后
    8. Add
  19. Finish

    迁移计划显示在 Migration Plan 列表中。

3.4.2.5. 在 MTC web 控制台中运行迁移计划

您可以使用在 Migration Toolkit for Containers(MTC)web 控制台中创建的迁移计划来 stage 或迁移应用程序和数据。

注意

迁移过程中,在目标集群中,MTC 将迁移的持久性卷(PV)的重新声明策略设置为 Retain

Backup 自定义资源包含一个 PVOriginalReclaimPolicy 注解,用于指示原始重新声明策略。您可以手动恢复迁移 PV 的重新声明策略。

先决条件

MTC web 控制台必须包含以下内容:

  • 处于 Ready 状态的源集群
  • 处于 Ready 状态的目标集群
  • 复制软件仓库
  • 有效的迁移计划

流程

  1. 登录到源集群。
  2. 删除旧镜像:

    $ oc adm prune images
  3. 登录到 MTC web 控制台并点 迁移计划
  4. 点击迁移计划 kebab 旁边的 Options 菜单,然后选择 Stage 将数据从源集群复制到目标集群,而不停止应用程序。

    您可以多次运行 Stage 以减少实际迁移时间。

  5. 当您准备好迁移应用程序工作负载时,在迁移计划 kebab 边的 Options 菜单并选择 Migrate
  6. 另外,还可以在 Migrate 窗口中选择 Do not stop applications on the source cluster during migration
  7. Migrate
  8. 迁移完成后,在 OpenShift Container Platform web 控制台中确认已成功迁移了应用程序:

    1. HomeProjects
    2. 点迁移的项目查看其状态。
    3. Routes 部分,点击 Location 验证应用程序是否正常运行。
    4. WorkloadsPods 来验证 pod 是否在迁移的命名空间中运行。
    5. StoragePersistent volumes 确认正确置备了被迁移的持久性卷。

3.4.3. 从命令行迁移应用程序

您可以使用 MTC 自定义资源(CR)在命令行中迁移应用程序。

您可以将应用程序从本地集群迁移到远程集群,从远程集群迁移到本地集群,并在远程集群间进行迁移。

MTC 术语

以下与配置集群相关的术语:

  • host 集群:

    • migration-controller pod 在 host 集群中运行。
    • host 集群不需要有一个公开的安全 registry 路由来直接进行镜像迁移。
  • 本地集群:本地集群通常与 host 集群相同,但这不是必须的。
  • 远程集群:

    • 远程集群必须具有公开的安全 registry 路由才能直接迁移镜像。
    • 远程集群必须具有包含 migration-controller 服务帐户令牌的 Secret CR。

以下与迁移相关的术语:

  • Source cluster(源集群):从中迁移应用程序的集群。
  • 目标集群(Destination cluster):将应用程序迁移到的集群。

3.4.3.1. 使用 MTC API 迁移应用程序

您可以使用 MTC API 在命令行中迁移应用程序。

您可以将应用程序从本地集群迁移到远程集群,从远程集群迁移到本地集群,并在远程集群间进行迁移。

这个步骤描述了如何执行间接迁移和直接迁移:

  • 间接迁移:镜像、卷和 Kubernetes 对象从源集群复制到复制存储库,然后从复制存储库复制到目标集群。
  • 直接迁移: 镜像或卷直接从源集群复制到目标集群。直接镜像迁移和直接卷迁移可显著提高性能。

创建以下自定义资源(CR)来执行迁移:

  • MigCluster CR:定义一个 host、本地或远程集群

    migration-controller pod 在 host 集群中运行。

  • Secret CR:包含远程集群或存储的凭证
  • MigStorage CR:定义一个复制存储库

    不同的存储供应商需要在 MigStorage CR 清单中使用不同的参数。

  • MigPlan CR:定义一个迁移计划
  • MigMigration CR:执行在关联的 MigPlan 中定义的一个迁移

    您可以针对以下目的,为单个 MigPlan CR 创建多个 MigMigration CR:

  • 在运行迁移前,执行一个阶段(stage)迁移(在不停止应用程序的情况下复制大多数数据)。阶段迁移可以提高迁移的性能。
  • 取消正在进行中的迁移
  • 回滚一个已完成的迁移

先决条件

  • 需要在所有集群中都有 cluster-admin 权限。
  • 您必须安装 OpenShift Container Platform CLI(oc)。
  • 您必须在所有集群中安装 MTC Operator。
  • 在所有集群中,安装的 Migration Toolkit for Containers Operator 的版本必须相同。
  • 您必须将对象存储配置为复制存储库。
  • 如果使用直接镜像迁移,则必须在所有远程集群中公开安全 registry 路由。
  • 如果您使用直接卷迁移,源集群不能配置 HTTP 代理。

流程

  1. host 集群创建一个名为 host-cluster.yamlMigCluster CR 清单:

    apiVersion: migration.openshift.io/v1alpha1
    kind: MigCluster
    metadata:
      name: host
      namespace: openshift-migration
    spec:
      isHostCluster: true
  2. host 集群创建一个 MigCluster CR:

    $ oc create -f host-cluster.yaml -n openshift-migration
  3. 为每个远程集群创建一个名为 cluster-secret.yamlSecret CR 清单:

    apiVersion: v1
    kind: Secret
    metadata:
      name: <cluster_secret>
      namespace: openshift-config
    type: Opaque
    data:
      saToken: <sa_token> 1
    1
    指定远程集群的 base64 编码的 migration-controller 服务帐户(SA)令牌。

    您可以运行以下命令来获取 SA 令牌:

    $ oc sa get-token migration-controller -n openshift-migration | base64 -w 0
  4. 为每个远程集群创建一个 Secret CR:

    $ oc create -f cluster-secret.yaml
  5. 为每个远程集群创建一个名为 remote-cluster.yamlMigCluster CR 清单:

    apiVersion: migration.openshift.io/v1alpha1
    kind: MigCluster
    metadata:
      name: <remote_cluster>
      namespace: openshift-migration
    spec:
      exposedRegistryPath: <exposed_registry_route> 1
      insecure: false 2
      isHostCluster: false
      serviceAccountSecretRef:
        name: <remote_cluster_secret> 3
        namespace: openshift-config
      url: <remote_cluster_url> 4
    1
    可选:指定公开的 registry 路由,例如 docker-registry-default.apps.example.cm,如果使用直接镜像迁移。
    2
    如果 false 则启用 SSL 验证。如果为 true,则不需要 CA 证书或不检查 CA 证书。
    3
    指定远程集群的 Secret CR。
    4
    指定远程集群的 URL。
  6. 为每个远程集群创建一个 MigCluster CR:

    $ oc create -f remote-cluster.yaml -n openshift-migration
  7. 验证所有集群是否处于 Ready 状态:

    $ oc describe cluster <cluster_name>
  8. 为名为 storage-secret.yaml 的复制存储库创建 Secret CR 清单:

    apiVersion: v1
    kind: Secret
    metadata:
      namespace: openshift-config
      name: <migstorage_creds>
    type: Opaque
    data:
      aws-access-key-id: <key_id_base64> 1
      aws-secret-access-key: <secret_key_base64> 2
    1
    指定 base64 格式的密钥 ID。
    2
    指定 base64 格式的 secret 密钥。

    AWS 凭证默认为 base64 编码。如果使用另一个存储供应商,则必须使用每个密钥运行以下命令来对凭证进行编码:

    $ echo -n "<key>" | base64 -w 0 1
    1
    指定密钥 ID 或 secret 密钥。这两个密钥都必须都是 base64 编码。
  9. 为复制存储库创建 Secret CR:

    $ oc create -f storage-secret.yaml
  10. 为复制存储库创建一个名为 migstorage.yamlMigStorage CR 清单:

    apiVersion: migration.openshift.io/v1alpha1
    kind: MigStorage
    metadata:
      name: <storage_name>
      namespace: openshift-migration
    spec:
      backupStorageConfig:
        awsBucketName: <bucket_name> 1
        credsSecretRef:
          name: <storage_secret_ref> 2
          namespace: openshift-config
      backupStorageProvider: <storage_provider_name> 3
      volumeSnapshotConfig:
        credsSecretRef:
          name: <storage_secret_ref> 4
          namespace: openshift-config
      volumeSnapshotProvider: <storage_provider_name> 5
    1
    指定存储桶名称。
    2
    指定对象存储的 Secrets CR。您必须确保存储在对象存储的 Secrets CR 中的凭证是正确的。
    3
    指定存储供应商。
    4
    可选: 如果要使用快照复制数据,请指定对象存储的 Secrets CR。您必须确保存储在对象存储的 Secrets CR 中的凭证是正确的。
    5
    可选: 如果您使用快照复制数据,请指定存储供应商。
  11. 创建 MigStorage CR:

    $ oc create -f migstorage.yaml -n openshift-migration
  12. 验证 MigStorage CR 是否处于 Ready 状态:

    $ oc describe migstorage <migstorage_name>
  13. 创建名为 migplan.yamlMigPlan CR 清单:

    apiVersion: migration.openshift.io/v1alpha1
    kind: MigPlan
    metadata:
      name: <migration_plan>
      namespace: openshift-migration
    spec:
      destMigClusterRef:
        name: host
        namespace: openshift-migration
      indirectImageMigration: true 1
      indirectVolumeMigration: true 2
      migStorageRef:
        name: <migstorage_ref> 3
        namespace: openshift-migration
      namespaces:
        - <application_namespace> 4
      srcMigClusterRef:
        name: <remote_cluster_ref> 5
        namespace: openshift-migration
    1
    如果为 false,则启用直接镜像迁移。
    2
    如果为 false,则启用直接卷迁移。
    3
    指定 MigStorage CR 实例的名称。
    4
    指定要迁移的一个或多个命名空间。
    5
    指定源集群 MigCluster 实例的名称。
  14. 创建 MigPlan CR:

    $ oc create -f migplan.yaml -n openshift-migration
  15. 查看 MigPlan 实例,以验证它是否处于 Ready 状态:

    $ oc describe migplan <migplan_name> -n openshift-migration
  16. 创建名为 migmigration.yamlMigMigration CR 清单:

    apiVersion: migration.openshift.io/v1alpha1
    kind: MigMigration
    metadata:
      name: <migmigration_name>
      namespace: openshift-migration
    spec:
      migPlanRef:
        name: <migplan_name> 1
        namespace: openshift-migration
      quiescePods: true 2
      stage: false 3
      rollback: false 4
    1
    指定 MigPlan CR 名称。
    2
    如果为 true,则源集群上的 pod 会在迁移前停止。
    3
    如果为 true,则进行阶段(stage)迁移,即在不停止应用程序的情况下复制大多数数据。
    4
    如果为 true,则会回滚到一个已完成的迁移。
  17. 创建 MigMigration CR 以启动 MigPlan CR 中定义的迁移:

    $ oc create -f migmigration.yaml -n openshift-migration
  18. 通过观察 MigMigration CR 来验证迁移的进度:

    $ oc watch migmigration <migmigration_name> -n openshift-migration

    输出类似于以下:

    Name:         c8b034c0-6567-11eb-9a4f-0bc004db0fbc
    Namespace:    openshift-migration
    Labels:       migration.openshift.io/migplan-name=django
    Annotations:  openshift.io/touch: e99f9083-6567-11eb-8420-0a580a81020c
    API Version:  migration.openshift.io/v1alpha1
    Kind:         MigMigration
    ...
    Spec:
      Mig Plan Ref:
        Name:       my_application
        Namespace:  openshift-migration
      Stage:        false
    Status:
      Conditions:
        Category:              Advisory
        Last Transition Time:  2021-02-02T15:04:09Z
        Message:               Step: 19/47
        Reason:                InitialBackupCreated
        Status:                True
        Type:                  Running
        Category:              Required
        Last Transition Time:  2021-02-02T15:03:19Z
        Message:               The migration is ready.
        Status:                True
        Type:                  Ready
        Category:              Required
        Durable:               true
        Last Transition Time:  2021-02-02T15:04:05Z
        Message:               The migration registries are healthy.
        Status:                True
        Type:                  RegistriesHealthy
      Itinerary:               Final
      Observed Digest:         7fae9d21f15979c71ddc7dd075cb97061895caac5b936d92fae967019ab616d5
      Phase:                   InitialBackupCreated
      Pipeline:
        Completed:  2021-02-02T15:04:07Z
        Message:    Completed
        Name:       Prepare
        Started:    2021-02-02T15:03:18Z
        Message:    Waiting for initial Velero backup to complete.
        Name:       Backup
        Phase:      InitialBackupCreated
        Progress:
          Backup openshift-migration/c8b034c0-6567-11eb-9a4f-0bc004db0fbc-wpc44: 0 out of estimated total of 0 objects backed up (5s)
        Started:        2021-02-02T15:04:07Z
        Message:        Not started
        Name:           StageBackup
        Message:        Not started
        Name:           StageRestore
        Message:        Not started
        Name:           DirectImage
        Message:        Not started
        Name:           DirectVolume
        Message:        Not started
        Name:           Restore
        Message:        Not started
        Name:           Cleanup
      Start Timestamp:  2021-02-02T15:03:18Z
    Events:
      Type    Reason   Age                 From                     Message
      ----    ------   ----                ----                     -------
      Normal  Running  57s                 migmigration_controller  Step: 2/47
      Normal  Running  57s                 migmigration_controller  Step: 3/47
      Normal  Running  57s (x3 over 57s)   migmigration_controller  Step: 4/47
      Normal  Running  54s                 migmigration_controller  Step: 5/47
      Normal  Running  54s                 migmigration_controller  Step: 6/47
      Normal  Running  52s (x2 over 53s)   migmigration_controller  Step: 7/47
      Normal  Running  51s (x2 over 51s)   migmigration_controller  Step: 8/47
      Normal  Ready    50s (x12 over 57s)  migmigration_controller  The migration is ready.
      Normal  Running  50s                 migmigration_controller  Step: 9/47
      Normal  Running  50s                 migmigration_controller  Step: 10/47

3.4.3.2. MTC 自定义资源清单

MTC 使用以下自定义资源(CR)清单来创建用于迁移应用程序的 CR。

3.4.3.2.1. DirectImageMigration

DirectImageMigration CR 直接将镜像从源集群复制到目标集群。

apiVersion: migration.openshift.io/v1alpha1
kind: DirectImageMigration
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: <directimagemigration_name>
spec:
  srcMigClusterRef:
    name: <source_cluster_ref> 1
    namespace: openshift-migration
  destMigClusterRef:
    name: <destination_cluster_ref> 2
    namespace: openshift-migration
  namespaces:
  - <namespace> 3
1
指定源集群的 MigCluster CR 名称。
2
指定目标集群的 MigCluster CR 名称。
3
指定包含要迁移的镜像的一个或多个命名空间。
3.4.3.2.2. DirectImageStreamMigration

DirectImageStreamMigration CR 直接将镜像流引用从源集群复制到目标集群。

apiVersion: migration.openshift.io/v1alpha1
kind: DirectImageStreamMigration
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: directimagestreammigration_name
spec:
  srcMigClusterRef:
    name: <source_cluster_ref> 1
    namespace: openshift-migration
  destMigClusterRef:
    name: <destination_cluster_ref> 2
    namespace: openshift-migration
  imageStreamRef:
    name: <image_stream_name> 3
    namespace: <source_image_stream_namespace> 4
  destNamespace: <destination_image_stream_namespace> 5
1
指定源集群的 MigCluster CR 名称。
2
指定目标集群的 MigCluster CR 名称。
3
指定镜像流名称。
4
指定源集群上的镜像流命名空间。
5
指定目标集群上的镜像流命名空间。
3.4.3.2.3. DirectVolumeMigration

DirectVolumeMigration CR 直接将持久性卷(PV)从源集群复制到目标集群。

apiVersion: migration.openshift.io/v1alpha1
kind: DirectVolumeMigration
metadata:
  name: <directvolumemigration_name>
  namespace: openshift-migration
spec:
  createDestinationNamespaces: false 1
  deleteProgressReportingCRs: false 2
  destMigClusterRef:
    name: host 3
    namespace: openshift-migration
  persistentVolumeClaims:
  - name: <pvc_name> 4
    namespace: <pvc_namespace> 5
  srcMigClusterRef:
    name: <source_cluster_ref> 6
    namespace: openshift-migration
1
如果为 true,在目标集群上为 PV 创建命名空间。
2
如果为 true,在迁移后会删除 DirectVolumeMigrationProgress CR。默认值为 false,这会保留 DirectVolumeMigrationProgress CR 以便进行故障排除。
3
如果目标集群不是主机集群,请更新集群名称。
4
指定使用直接卷迁移进行迁移的一个或多个 PVC。
5
指定每个 PVC 的命名空间。
6
指定源集群的 MigCluster CR 名称。
3.4.3.2.4. DirectVolumeMigrationProgress

DirectVolumeMigrationProgress CR 显示 DirectVolumeMigration CR 的进度。

apiVersion: migration.openshift.io/v1alpha1
kind: DirectVolumeMigrationProgress
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: directvolumemigrationprogress_name
spec:
  clusterRef:
    name: source_cluster
    namespace: openshift-migration
  podRef:
    name: rsync_pod
    namespace: openshift-migration
3.4.3.2.5. MigAnalytic

MigAnalytic CR 从一个关联的 MigPlan CR 中收集镜像、Kubernetes 资源以及 PV 容量的数量。

apiVersion: migration.openshift.io/v1alpha1
kind: MigAnalytic
metadata:
  annotations:
    migplan: <migplan_name> 1
  name: miganalytic_name
  namespace: openshift-migration
  labels:
    migplan: <migplan_name> 2
spec:
  analyzeImageCount: true 3
  analyzeK8SResources: true 4
  analyzePVCapacity: true 5
  listImages: false 6
  listImagesLimit: 50 7
  migPlanRef:
    name: migplan_name 8
    namespace: openshift-migration
1
指定与 MigAnalytic 关联的 MigPlan CR 的名称。
2
指定与 MigAnalytic 关联的 MigPlan CR 的名称。
3
可选:如果为 true,返回镜像数量。
4
可选:返回 Kubernetes 资源的数量、类型和 API 版本(如果为 true )。
5
可选:如果为 true 则返回 PV 容量。
6
如果为 true,则返回镜像名称列表。默认为 false,因此输出不会过长。
7
可选:指定如果 listImagestrue 时要返回的最大镜像名称数。
8
指定与 MigAnalytic 关联的 MigPlan CR 的名称。
3.4.3.2.6. MigCluster

MigCluster CR 定义一个主机、本地或远程集群。

apiVersion: migration.openshift.io/v1alpha1
kind: MigCluster
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: host 1
  namespace: openshift-migration
spec:
  isHostCluster: true 2
  azureResourceGroup: <azure_resource_group> 3
  caBundle: <ca_bundle_base64> 4
  insecure: false 5
  refresh: false 6
# The 'restartRestic' parameter is relevant for a source cluster.
# restartRestic: true 7
# The following parameters are relevant for a remote cluster.
# isHostCluster: false
# exposedRegistryPath: 8
# url: <destination_cluster_url> 9
# serviceAccountSecretRef:
#   name: <source_secret_ref> 10
#   namespace: openshift-config
1
可选:如果 migration-controller pod 没有在这个集群中运行,则更新集群名称。
2
如果为 true,则 migration-controller pod 在此集群中运行。
3
可选: 如果存储供应商是 Microsoft Azure,请指定资源组。
4
可选:如果您为自签名 CA 证书创建了一个证书捆绑包,且 insecure 参数值为 false,请指定 base64 编码的证书捆绑包。
5
如果 false 则启用 SSL 验证。
6
如果为 true,集群会被验证。
7
如果为 true,在创建 stage pod 后 restic pod 会在源集群中重启。
8
可选:如果您使用直接镜像迁移,请指定远程集群的公开 registry 路径。
9
指定远程集群的 URL。
10
指定远程集群的 Secret CR 名称。
3.4.3.2.7. MigHook

MigHook CR 定义一个 Ansible playbook ,或一个自定义镜像,它在迁移的指定阶段运行任务。

apiVersion: migration.openshift.io/v1alpha1
kind: MigHook
metadata:
  generateName: <hook_name_prefix> 1
  name: <hook_name> 2
  namespace: openshift-migration
spec:
  activeDeadlineSeconds: 3
  custom: false 4
  image: <hook_image> 5
  playbook: <ansible_playbook_base64> 6
  targetCluster: source 7
1
可选:此参数的值后附加一个唯一的哈希值,以便每个迁移 hook 都有一个唯一的名称。您不需要指定 name 参数的值。
2
指定迁移 hook 名称,除非指定了 generateName 参数的值。
3
可选:指定 hook 可运行的最大秒数。默认值为 1800
4
如果为 true,则 hook 是一个自定义镜像。自定义镜像可以包括 Ansible,也可以使用不同的编程语言编写。
5
指定自定义镜像,例如 quay.io/konveyor/hook-runner:latest。如果 customtrue,则需要此项。
6
指定整个 base64 编码的 Ansible playbook。如果 customfalse,则必需。
7
指定 hook 要在其上运行的 sourcedestination 集群。
3.4.3.2.8. MigMigration

MigMigration CR 运行一个关联的 MigPlan CR。

您可以针对以下场景,创建多个与同一 MigPlan CR 关联的 MigMigration CR:

  • 您可以运行多个阶段迁移,或增量迁移,以在没有在源集群中停止 pod 的情况下复制数据。运行阶段迁移可提高实际迁移的性能。
  • 您可以取消正在进行中的迁移。
  • 您可以回滚迁移。
apiVersion: migration.openshift.io/v1alpha1
kind: MigMigration
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: migmigration_name
  namespace: openshift-migration
spec:
  canceled: false 1
  rollback: false 2
  stage: false 3
  quiescePods: true 4
  keepAnnotations: true 5
  verify: false 6
  migPlanRef:
    name: <migplan_ref> 7
    namespace: openshift-migration
1
如果为 true,则会取消正在进行中的迁移。
2
如果为 true,则会回滚到一个已完成的迁移。
3
如果为 true,数据会被递增复制,pod 不会在源集群中停止。
4
如果为 true,在迁移的备份阶段后,源集群中的 pod 会被缩减为 0
5
如果为 true,则迁移期间应用的标签和注解将被保留。
6
如果 true ,检查目标集群中迁移的 pod 的状态,并返回处于 Running 状态的 pod 名称。
7
migPlanRef.name:指定关联的 MigPlan CR 的名称。
3.4.3.2.9. MigPlan

MigPlan CR 定义迁移计划的参数。它包含一组使用相同参数迁移的虚拟机。

apiVersion: migration.openshift.io/v1alpha1
kind: MigPlan
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: migplan_name
  namespace: openshift-migration
spec:
  closed: false 1
  srcMigClusterRef:
    name: <source_migcluster_ref> 2
    namespace: openshift-migration
  destMigClusterRef:
    name: <destination_migcluster_ref> 3
    namespace: openshift-migration
  hooks: 4
    - executionNamespace: <namespace> 5
      phase: <migration_phase> 6
      reference:
        name: <mighook_name> 7
        namespace: <hook_namespace> 8
      serviceAccount: <service_account> 9
  indirectImageMigration: true 10
  indirectVolumeMigration: false 11
  migStorageRef:
    name: <migstorage_name> 12
    namespace: openshift-migration
  namespaces:
  - <namespace>  13
  refresh: false  14
1
如果为 true,则迁移已完成。您不能为此 MigPlan CR 创建另一个 MigMigration CR。
2
指定源集群 MigCluster CR 的名称。
3
指定目标集群 MigCluster CR 的名称。
4
可选:最多可指定四个迁移 hook。
5
可选:指定运行 hook 的命名空间。
6
可选:指定 hook 运行期间的迁移阶段。一个 hook 可以分配给一个阶段。预期的值包括 PreBackupPostBackupPreRestorePostRestore
7
可选:指定 MigHook CR 的名称。
8
可选:指定 MigHook CR 的命名空间。
9
可选:指定一个具有 cluster-admin 权限的服务帐户。
10
如果为 true,则禁用直接镜像迁移。镜像从源集群复制到复制存储库,并从复制存储库复制到目标集群。
11
如果为 true,则禁用直接卷迁移。PV 从源集群复制到复制存储库,再从复制存储库复制到目标集群。
12
指定 MigStorage CR 的名称。
13
指定一个或多个命名空间。
14
如果为 trueMigPlan CR 会被验证。
3.4.3.2.10. MigStorage

MigStorage CR 描述了复制存储库的对象存储。您可以配置 Amazon Web Services、Microsoft Azure、Google Cloud Storage 和通用 S3 兼容云存储,如 Minio 或 NooBaa。

不同的供应商需要不同的参数。

apiVersion: migration.openshift.io/v1alpha1
kind: MigStorage
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: migstorage_name
  namespace: openshift-migration
spec:
  backupStorageProvider: <storage_provider> 1
  volumeSnapshotProvider: 2
  backupStorageConfig:
    awsBucketName: 3
    awsRegion: 4
    credsSecretRef:
      namespace: openshift-config
      name: <storage_secret> 5
    awsKmsKeyId: 6
    awsPublicUrl: 7
    awsSignatureVersion: 8
  volumeSnapshotConfig:
    awsRegion: 9
    credsSecretRef:
      namespace: openshift-config
      name: 10
  refresh: false 11
1
指定存储供应商。
2
可选: 如果您使用快照复制方法,请指定存储供应商。
3
如果使用 AWS,请指定存储桶名称。
4
如果使用 AWS,请指定存储桶区域,如 us-east-1
5
指定为 MigStorage CR 创建的 Secret CR 的名称。
6
可选:如果您使用 AWS Key Management Service,请指定该密钥的唯一标识符。
7
可选: 如果授予 AWS 存储桶的公共访问权限,请指定存储桶 URL。
8
可选:指定向存储桶验证请求的 AWS 签名版本,例如 4
9
可选:如果您使用快照复制方法,请指定集群的地理位置。
10
可选:如果您使用快照复制方法,请指定为 MigStorage CR 创建的 Secret CR 名称。
11
如果为 true,集群会被验证。

3.4.3.3. 其他资源

3.4.4. 配置迁移计划

您可以增加要迁移或排除迁移的资源的数量。

3.4.4.1. 为大型迁移增加限制

您可以使用 MTC 为大型迁移增加迁移对象和容器资源的限制。

重要

您必须在生产环境中执行迁移前测试这些更改。

流程

  1. 编辑 MigrationController 自定义资源(CR)清单:

    $ oc edit migrationcontroller -n openshift-migration
  2. 更新以下参数:

    ...
    mig_controller_limits_cpu: "1" 1
    mig_controller_limits_memory: "10Gi" 2
    ...
    mig_controller_requests_cpu: "100m" 3
    mig_controller_requests_memory: "350Mi" 4
    ...
    mig_pv_limit: 100 5
    mig_pod_limit: 100 6
    mig_namespace_limit: 10 7
    ...
    1
    指定 MigrationController CR 可用的 CPU 数量。
    2
    指定 MigrationController CR 可用的内存量。
    3
    指定可用于 MigrationController CR 请求的 CPU 单元数。100m 代表 0.1 CPU 单元(100 * 1e-3)。
    4
    指定可用于 MigrationController CR 请求的内存量。
    5
    指定可迁移的持久性卷数量。
    6
    指定可迁移的 pod 数量。
    7
    指定可迁移的命名空间数量。
  3. 创建使用更新的参数验证更改的迁移计划。

    如果您的迁移计划超过 MigrationController CR 限制,则 MTC 控制台在保存迁移计划时会显示警告信息。

3.4.4.2. 从迁移计划中排除资源

您可以从 MTC 迁移计划中排除资源,如镜像流、持久性卷(PV)或订阅,以便减少迁移的资源负载,或使用其他工具迁移镜像或 PV。

默认情况下,MTC 会排除服务目录资源和 Operator Lifecycle Manager(OLM)资源。这些资源是服务目录 API 组和 OLM API 组的一部分,目前还不支持迁移。

流程

  1. 编辑 MigrationController 自定义资源清单:

    $ oc edit migrationcontroller <migration_controller> -n openshift-migration
  2. 更新 spec 部分,方法是添加参数以排除特定资源,或者在 exclude_resources 参数中添加资源(如果它本身没有排除参数):

    apiVersion: migration.openshift.io/v1alpha1
    kind: MigrationController
    metadata:
      name: migration-controller
      namespace: openshift-migration
    spec:
      disable_image_migration: true 1
      disable_pv_migration: true 2
      ...
      excluded_resources: 3
      - imagetags
      - templateinstances
      - clusterserviceversions
      - packagemanifests
      - subscriptions
      - servicebrokers
      - servicebindings
      - serviceclasses
      - serviceinstances
      - serviceplans
      - operatorgroups
      - events
    1
    添加 disable_image_migration: true 以排除迁移中的镜像流。不要编辑 exclude_resources 参数。当 MigrationController pod 重启时,镜像流会添加到 excluded_resources
    2
    添加 disable_pv_migration: true 以将 PV 排除在迁移计划之外。不要编辑 exclude_resources 参数。当 MigrationController Pod 重启时,persistentvolumespersistentvolumeclaims 会被添加到 excluded_resources。禁用 PV 迁移会同时在创建迁移计划时禁用 PV 发现功能。
    3
    您可以将 OpenShift Container Platform 资源添加到 exclude_resources 列表中。不要删除默认排除的资源。对这些进行迁移可能会产生问题,因此必须被排除。
  3. 等待 2 分钟,使 MigrationController Pod 重启,以便应用更改。
  4. 验证资源是否排除:

    $ oc get deployment -n openshift-migration migration-controller -o yaml | grep EXCLUDED_RESOURCES -A1

    输出包含排除的资源:

    输出示例

        - name: EXCLUDED_RESOURCES
          value:
          imagetags,templateinstances,clusterserviceversions,packagemanifests,subscriptions,servicebrokers,servicebindings,serviceclasses,serviceinstances,serviceplans,imagestreams,persistentvolumes,persistentvolumeclaims