11.3. 迁移 hook
您可以在单个迁移计划中添加最多四个迁移 hook,每个 hook 在迁移过程的不同阶段运行。迁移 hook 执行的任务包括自定义应用程序默认、手动迁移不受支持的数据类型以及在迁移后更新应用程序。
迁移 hook 会在以下迁移步骤之一中,在源或目标集群上运行:
-
PreBackup
:在源集群中备份资源前。 -
PostBackup
:在源集群中备份资源后。 -
PreRestore
:在目标集群上恢复资源前。 -
PostRestore
:在目标集群中恢复资源后。
您可以通过创建使用默认 Ansible 镜像运行的 Ansible playbook 或者使用自定义 hook 容器来创建 hook。
Ansible playbook
Ansible playbook 作为一个配置映射挂载到 hook 容器上。hook 容器使用 MigPlan
自定义资源中指定的集群、服务帐户和命名空间以作业的形式运行。作业会继续运行,直到达到默认限制的 6 次重试或成功完成为止。即使初始 pod 被驱除或终止,也会继续。
默认 Ansible 运行时镜像为 registry.redhat.io/rhxetex/openshift-migration-hook-runner-rhel7:1.7
。此镜像基于 Ansible Runner 镜像,并包含 Ansible Kubernetes 资源的 python-openshift
,以及更新的 oc
二进制文件。
自定义 hook 容器
您可以使用自定义 hook 容器而不是默认的 Ansible 镜像。
11.3.1. 为迁移 hook 编写 Ansible playbook
您可以编写 Ansible playbook 以用作迁移 hook。通过使用 MTC web 控制台或在 MigPlan
自定义资源(CR)清单中指定 spec.hooks
参数的值来在迁移计划中添加 hook。
Ansible playbook 作为一个配置映射挂载到 hook 容器上。hook 容器使用 MigPlan
CR 中指定的集群、服务帐户和命名空间以作业的形式运行。hook 容器使用指定的服务帐户令牌,以便当任务在集群中运行前无需进行身份验证。
11.3.1.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
11.3.1.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', 'MIGRATION_PLAN_NAME') }}"