第 5 章 从命令行迁移虚拟机

您可以使用命令行将虚拟机迁移到 OpenShift Virtualization。

重要

5.1. 迁移虚拟机

您可以通过创建 MTV 自定义资源(CR)从命令行(CLI)迁移虚拟机。

重要

您必须为集群范围的 CR 指定一个名称。

您必须为命名空间范围 CR 指定名称和命名空间。

先决条件

  • 您必须以具有 cluster-admin 权限的用户身份登录。
  • 仅 VMware:在所有集群可以访问的安全 registry 中必须有 VMware Virtual Disk Development Kit(VDDK)镜像。

流程

  1. 为源供应商凭证创建 Secret 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: <secret>
      namespace: openshift-mtv
    type: Opaque
    stringData:
      user: <user> 1
      password: <password> 2
      cacert: | 3
        <engine_ca_certificate>
      thumbprint: <vcenter_fingerprint> 4
    EOF
    1
    指定 vCenter 用户或 RHV Manager 用户。
    2
    指定用户密码。
    3
    仅 RHV:指定 Manager 的 CA 证书。您可以在 https://<engine_host>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA 中检索它。
    4
    仅 VMware:指定 vCenter SHA-1 指纹。
  2. 为源供应商创建 Provider 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Provider
    metadata:
      name: <provider>
      namespace: openshift-mtv
    spec:
      type: <provider_type> 1
      url: <api_end_point> 2
      settings:
        vddkInitImage: <registry_route_or_server_path>/vddk:<tag> 3
      secret:
        name: <secret> 4
        namespace: openshift-mtv
    EOF
    1
    允许的值是 ovirtvsphere
    2
    指定 API 端点 URL。例如 https://<vCenter_host>/sdk 用于 vSphere,或 https://<engine_host>/ovirt-engine/api/ 用于 RHV。
    3
    仅 VMware:指定您创建的 VDDK 镜像。
    4
    指定供应商 Secret CR 的名称。
  3. 仅限 VMware:创建一个 Host 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Host
    metadata:
      name: <vmware_host>
      namespace: openshift-mtv
    spec:
      provider:
        namespace: openshift-mtv
        name: <source_provider> 1
      id: <source_host_mor> 2
      ipAddress: <source_network_ip> 3
    EOF
    1
    指定 VMware Provider CR 的名称。
    2
    指定 VMware 主机的受管对象引用 (MOR)。
    3
    指定 VMware 迁移网络的 IP 地址。
  4. 创建 NetworkMap 清单来映射源和目标网络:

    $  cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: NetworkMap
    metadata:
      name: <network_map>
      namespace: openshift-mtv
    spec:
      map:
        - destination:
            name: <pod>
            namespace: openshift-mtv
            type: pod 1
          source: 2
            id: <source_network_id> 3
            name: <source_network_name>
        - destination:
            name: <network_attachment_definition> 4
            namespace: <network_attachment_definition_namespace> 5
            type: multus
          source:
            id: <source_network_id>
            name: <source_network_name>
      provider:
        source:
          name: <source_provider>
          namespace: openshift-mtv
        destination:
          name: <destination_cluster>
          namespace: openshift-mtv
    EOF
    1
    允许的值是 podmultus
    2
    您可以使用 id name 参数来指定源网络。
    3
    指定 VMware 网络 MOR 或 RHV 网络 UUID。
    4
    为每个额外 OpenShift Virtualization 网络指定网络附加定义。
    5
    指定 OpenShift Virtualization 网络附加定义的命名空间。
  5. 创建 StorageMap 清单来映射源和目标存储:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: StorageMap
    metadata:
      name: <storage_map>
      namespace: openshift-mtv
    spec:
      map:
        - destination:
            storageClass: <storage_class>
            accessMode: <access_mode> 1
          source:
            id: <source_datastore> 2
        - destination:
            storageClass: <storage_class>
            accessMode: <access_mode>
          source:
            id: <source_datastore>
      provider:
        source:
          name: <source_provider>
          namespace: openshift-mtv
        destination:
          name: <destination_cluster>
          namespace: openshift-mtv
    EOF
    1
    允许的值有 ReadWriteOnceReadWriteMany
    2
    指定 VMware 数据存储 MOR 或 RHV 存储域 UUID,例如 f2737930-b567-451a-9ceb-2887f6207009
  6. 可选:在 Plan CR 中指定的阶段创建一个 Hook 清单以在虚拟机中运行自定义代码:

    $  cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Hook
    metadata:
      name: <hook>
      namespace: openshift-mtv
    spec:
      image: quay.io/konveyor/hook-runner 1
      playbook: | 2
        LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
        YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
        IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
        cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
        bG9hZAoK
    EOF
    1
    您可以使用默认 hook-runner 镜像或指定自定义镜像。如果指定自定义镜像,则不需要指定 playbook。
    2
    可选: Base64 编码的 Ansible playbook。如果指定 playbook,image 必须是 hook-runner
  7. 为迁移创建 Plan 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Plan
    metadata:
      name: <plan> 1
      namespace: openshift-mtv
    spec:
      warm: true 2
      provider:
        source:
          name: <source_provider>
          namespace: openshift-mtv
        destination:
          name: <destination_cluster>
          namespace: openshift-mtv
      map:
        network: 3
          name: <network_map> 4
          namespace: openshift-mtv
        storage:
          name: <storage_map> 5
          namespace: openshift-mtv
      targetNamespace: openshift-mtv
      vms: 6
        - id: <source_vm> 7
        - name: <source_vm>
          hooks: 8
            - hook:
                namespace: openshift-mtv
                name: <hook> 9
              step: <step> 10
    EOF
    1
    指定 Plan CR 的名称。
    2
    指定迁移是温迁移还是冷迁移。如果您指定了 warm 迁移,且没有为 Migration 清单中的 cutover 参数指定一个值,则只有 precopy 阶段将运行。
    3
    您可以添加多个网络映射。
    4
    指定 NetworkMap CR 的名称。
    5
    指定 StorageMap CR 的名称。
    6
    您可以使用 id name 参数来指定源虚拟机。
    7
    指定 VMware VM MOR 或 RHV VM UUID。
    8
    可选:为虚拟机指定最多两个 hook。每个 hook 必须在不同的迁移步骤中运行。
    9
    指定 Hook CR 的名称。
    10
    在迁移完成后,允许的值为 PreHook (migation 计划启动或 PostHook)。
  8. 创建运行 Plan CR 的 Migration 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Migration
    metadata:
      name: <migration> 1
      namespace: openshift-mtv
    spec:
      plan:
        name: <plan> 2
        namespace: openshift-mtv
      cutover: <cutover_time> 3
    EOF
    1
    指定 Migration CR 的名称。
    2
    指定正在运行的 Plan CR 的名称。Migration CR 为每个迁移的虚拟机创建一个 VirtualMachine CR。
    3
    可选:指定 ISO 8601 格式的大约带有 UTC 时间偏移的时间,例如 2021-04-04T01:23:45.678+09:00

    您可以将多个 Migration CR 与一个 Plan CR 关联。如果迁移没有完成,您可以在不更改 Plan CR 的情况下创建新的 Migration CR,以迁移剩余的虚拟机。

  9. 检索 Migration CR 以监控迁移的进度:

    $ oc get migration/<migration> -n openshift-mtv -o yaml