12.4. 在 MTV 迁移计划中添加 hook
您可以在 Migration Toolkit for Virtualization (MTV)迁移计划中添加 hook,以便在迁移之前或之后在虚拟机上执行自动操作。
12.4.1. 关于 MTV 迁移计划的 hook
您可以使用 MTV CLI 或 MTV 用户界面在 Red Hat OpenShift web 控制台中为 Virtualization (MTV)迁移计划添加 hook。
- 预迁移 hook 是 hook,可在位于供应商的虚拟机上执行操作。这会为迁移准备虚拟机。
- 迁移后 hook 是在迁移到 OpenShift Virtualization 的虚拟机上执行操作的 hook。
12.4.1.1. 默认 hook 镜像
MTV hook 的默认 hook 镜像是 quay.io/kubev2v/hook-runner
。镜像基于 Ansible Runner 镜像,并添加 python-openshift
,以提供 Ansible Kubernetes 资源和最新的 oc
二进制文件。
12.4.1.2. hook 执行
作为迁移 hook 的一部分提供的 Ansible playbook 作为 ConfigMap
挂载到 hook 容器中。hook 容器使用您选择的 ServiceAccount
在 openshift-mtv
命名空间中的所需集群中作为作业运行。
添加 hook 时,您必须指定 Hook
CR 所在的命名空间、hook 的名称,以及 hook 是否为 pre-migration hook 或 post-migration hook。
要让 hook 在虚拟机上运行,必须使用 SSH 启动虚拟机并可用。
下图显示了使用迁移 hook 的一般过程。具体步骤请参阅 使用 Red Hat OpenShift Web 控制台将迁移 hook 添加到迁移计划中,并使用 CLI 将迁移 hook 添加到迁移计划中。
图 12.1. 在迁移计划中添加 hook

Process:
输入您的 Ansible hook 和凭证。
使用 UI 或 CLI 将 Ansible hook 镜像输入到 MTV 控制器。
-
在 UI 中,指定
ansible-runner
并输入包含 hook 的playbook.yml
。 - 在 CLI 中,输入 hook 镜像,该镜像指定运行 hook 的 playbook。
-
在 UI 中,指定
如果您需要额外数据在 pod 中运行 playbook (如 SSH 数据),请创建一个包含虚拟机凭证的 Secret。Secret 不挂载到 pod,而是由 playbook 调用。
注意此 Secret 与包含源供应商凭证的
Secret
CR 不同。
MTV 控制器创建
ConfigMap
,其中包含:-
workload.yml
,其中包含有关虚拟机的信息。 -
playbook.yml
,这是您要执行的原始字符串 playbook。 plan.yml
,即Plan
CR。ConfigMap
包含虚拟机的名称,并指示 playbook 执行的操作。
-
MTV 控制器会创建一个启动用户指定镜像的作业。
将
ConfigMap
挂载到容器。Ansible hook 导入之前输入的用户的 Secret。
该作业运行迁移前 hook 或迁移后 hook,如下所示:
- 对于 pre-migration hook,作业会使用 SSH 登录到源供应商上的虚拟机,并运行 hook。
- 对于迁移后 hook,作业使用 SSH 登录到 OpenShift Virtualization 上的虚拟机,并运行 hook。
12.4.2. 使用 Red Hat OpenShift Web 控制台在迁移计划中添加迁移 hook
您可以使用 Red Hat OpenShift Web 控制台将迁移 hook 添加到现有迁移计划中。请注意,您需要在 Migration Toolkit for Virtualization (MTV) CLI 中运行一个命令。
例如,您可以创建一个 hook 来在虚拟机上安装 cloud-init
服务,并在迁移前写入文件。
您可以运行一个预迁移 hook、一个迁移后 hook 或每个迁移计划之一。
先决条件
- 迁移计划
- 迁移 hook 文件,其中包含您复制的内容并粘贴到 web 控制台中
-
包含源供应商的
Secret
的文件 - 由 hook 调用的 Red Hat OpenShift 服务帐户,并且至少对您正在使用的命名空间具有写入访问权限
- 使用在虚拟机上安装的公钥迁移的虚拟机的 SSH 访问
- 仅在 Microsoft Server 上运行的虚拟机:启用远程执行
其他资源
有关创建服务帐户的说明,请参阅 了解并创建服务帐户。
流程
- 在 Red Hat OpenShift web 控制台中,点 Migration > Plans for virtualization,然后点击您要将 hook 添加到的迁移计划。
- 点 Hook。
对于 pre-migration hook,请执行以下步骤:
- 在 Pre migration hook 部分中,将 Enable hook 开关切换为 Enable pre migration hook。
-
输入 Hook 运行程序镜像。如果要指定
spec.playbook
,则需要使用具有ansible-runner
的镜像。 - 将 hook 粘贴到 Ansible playbook 文本框中的 YAML 文件。
对于迁移后 hook,请执行以下步骤:
- 在 Post migration hook 中,切换 Enable hook 开关 启用后迁移 hook。
-
输入 Hook 运行程序镜像。如果要指定
spec.playbook
,则需要使用具有ansible-runner
的镜像。 - 将 hook 粘贴到 Ansible playbook 文本框中的 YAML 文件。
- 在选项卡的顶部,单击 Update hook。
在终端中,输入以下命令将每个 hook 与 Red Hat OpenShift 服务帐户关联:
$ oc -n openshift-mtv patch hook <name_of_hook> \ -p '{"spec":{"serviceAccount":"<service_account>"}}' --type merge
以下迁移 hook 示例确保可以使用 SSH 访问虚拟机,创建 SSH 密钥并运行 2 个任务:停止 Maria 数据库并生成文本文件。
迁移 hook 示例
- name: Main hosts: localhost vars_files: - plan.yml - workload.yml tasks: - k8s_info: api_version: v1 kind: Secret name: privkey namespace: openshift-mtv register: ssh_credentials - name: Ensure SSH directory exists file: path: ~/.ssh state: directory mode: 0750 - name: Create SSH key copy: dest: ~/.ssh/id_rsa content: "{{ ssh_credentials.resources[0].data.key | b64decode }}" mode: 0600 - add_host: name: "{{ vm.ipaddress }}" # ALT "{{ vm.guestnetworks[2].ip }}" ansible_user: root groups: vms - hosts: vms vars_files: - plan.yml - workload.yml tasks: - name: Stop MariaDB service: name: mariadb state: stopped - name: Create Test File copy: dest: /premigration.txt content: "Migration from {{ provider.source.name }} of {{ vm.vm1.vm0.id }} has finished\n" mode: 0644
12.4.3. 使用 CLI 在迁移计划中添加迁移 hook
您可以使用 Hook
CR 使用 Migration Toolkit for Virtualization (MTV) CLI 将 pre-migration hook 或 post-migration hook 添加到现有迁移计划中。
例如,您可以创建一个 Hook
CR 来在虚拟机上安装 cloud-init
服务,并在迁移前写入文件。
您可以运行一个预迁移 hook、一个迁移后 hook 或每个迁移计划之一。每个 hook 需要自己的 Hook
CR,但 Plan
CR 包含它所使用的所有 hook 的数据。
您可以使用 k8s
模块检索存储在 secret 或 ConfigMap
中的附加信息。
先决条件
- 迁移计划
- 迁移 hook 镜像或包含 hook 镜像的 playbook
- 包含源供应商的 Secret 的文件
- 由 hook 调用的 Red Hat OpenShift 服务帐户,并且至少对您正在使用的命名空间具有写入访问权限
- 使用在虚拟机上安装的公钥迁移的虚拟机的 SSH 访问
- 仅在 Microsoft Server 上运行的虚拟机:启用远程执行
其他资源
有关创建服务帐户的说明,请参阅 了解并创建服务帐户。
流程
如果需要,为虚拟机创建一个具有 SSH 私钥的 Secret。
- 选择现有密钥或生成密钥对。
- 在虚拟机上安装公钥。
将 Secret 中的私钥编码为 base64。
apiVersion: v1 data: key: VGhpcyB3YXMgZ2Vu... kind: Secret metadata: name: ssh-credentials namespace: openshift-mtv type: Opaque
通过串联一个文件并以 Base64 编码方式对 playbook 进行编码,例如:
$ cat playbook.yml | base64 -w0
创建 Hook CR:
$ cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: Hook metadata: name: <hook> namespace: <namespace> spec: image: quay.io/kubev2v/hook-runner serviceAccount:<service account> 1 playbook: | LS0tCi0gbm... 2 EOF
注意您可以使用默认
hook-runner
镜像或指定自定义镜像。如果指定自定义镜像,则不需要指定 playbook。注意要解码附加的 playbook,请使用自定义输出检索资源,并将其传送到 base64。例如:
$ oc get -n konveyor-forklift hook playbook -o \ go-template='{{ .spec.playbook }}' | base64 -d
在迁移的
Plan
CR 中,对于每个虚拟机,请在 CR 的末尾添加以下部分:vms: - id: <vm_id> hooks: - hook: namespace: <namespace> name: <name_of_hook> step: <type_of_hook> 1
- 1
- 选项是
PreHook
,可在迁移前运行 hook,以及PostHook
以在迁移后运行 hook。
为了在虚拟机上运行 PreHook,必须通过 SSH 启动并可使用虚拟机。
以下迁移 hook 示例确保可以使用 SSH 访问虚拟机,创建 SSH 密钥并运行 2 个任务:停止 Maria 数据库并生成文本文件。
迁移 hook 示例
- name: Main hosts: localhost vars_files: - plan.yml - workload.yml tasks: - k8s_info: api_version: v1 kind: Secret name: privkey namespace: openshift-mtv register: ssh_credentials - name: Ensure SSH directory exists file: path: ~/.ssh state: directory mode: 0750 - name: Create SSH key copy: dest: ~/.ssh/id_rsa content: "{{ ssh_credentials.resources[0].data.key | b64decode }}" mode: 0600 - add_host: name: "{{ vm.ipaddress }}" # ALT "{{ vm.guestnetworks[2].ip }}" ansible_user: root groups: vms - hosts: vms vars_files: - plan.yml - workload.yml tasks: - name: Stop MariaDB service: name: mariadb state: stopped - name: Create Test File copy: dest: /premigration.txt content: "Migration from {{ provider.source.name }} of {{ vm.vm1.vm0.id }} has finished\n" mode: 0644