12.2. 从 VMware vSphere 源供应商迁移


您可以使用命令行界面(CLI)从 VMware vSphere 源供应商迁移。

重要

防病毒软件可能会导致迁移失败。在开始迁移前,强烈建议从源虚拟机中删除这些软件。

重要

MTV 不支持迁移 VMware Non-Volatile Memory Express (NVMe)磁盘。

注意

要迁移具有共享磁盘的虚拟机(VM),请参阅使用 共享磁盘迁移虚拟机

流程

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

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: <secret>
      namespace: <namespace>
      ownerReferences: 
    1
    
        - apiVersion: forklift.konveyor.io/v1beta1
          kind: Provider
          name: <provider_name>
          uid: <provider_uid>
      labels:
        createdForProviderType: vsphere
        createdForResourceType: providers
    type: Opaque
    stringData:
      user: <user> 
    2
    
      password: <password> 
    3
    
      insecureSkipVerify: <"true"/"false"> 
    4
    
      cacert: | 
    5
    
        <ca_certificate>
      url: <api_end_point> 
    6
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    ownerReferences 部分是可选的。
    2
    指定 vCenter 用户或 ESX/ESXi 用户。
    3
    指定 vCenter 用户或 ESX/ESXi 用户的密码。
    4
    指定 "true" 以跳过证书验证,并指定 "false" 来验证证书。如果没有指定,则默认为 "false "。跳过证书验证会进行不安全的迁移,然后不需要证书。不安全的迁移意味着传输的数据通过安全连接发送,并可能会公开敏感数据。
    5
    如果没有设置此字段并禁用 跳过证书验证 时,MTV 会尝试使用系统 CA。
    6
    指定 vCenter 的 API 端点 URL 或 ESX/ESXi,例如 https://<vCenter_host>/sdk
  1. 为源供应商创建 Provider 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Provider
    metadata:
      name: <source_provider>
      namespace: <namespace>
    spec:
      type: vsphere
      url: <api_end_point> 
    1
    
      settings:
        vddkInitImage: <VDDK_image> 
    2
    
        sdkEndpoint: vcenter 
    3
    
      secret:
        name: <secret> 
    4
    
        namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定 API 端点的 URL,例如 https://<vCenter_host>/sdk
    2
    可选,但强烈建议创建一个 VDDK 镜像来加快迁移。按照 OpenShift 文档指定您创建的 VDDK 镜像。
    3
    选项: vcenteresxi
    4
    指定供应商 Secret CR 的名称。
  1. 创建 主机清单

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Host
    metadata:
      name: <vmware_host>
      namespace: <namespace>
    spec:
      provider:
        namespace: <namespace>
        name: <source_provider> 
    1
    
      id: <source_host_mor> 
    2
    
      ipAddress: <source_network_ip> 
    3
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定 VMware vSphere Provider CR 的名称。
    2
    指定 VMware vSphere 主机的 Managed Object Reference (moRef)。要检索 moRef,请参阅 检索 VMware vSphere moRef
    3
    指定 VMware vSphere 迁移网络的 IP 地址。
  1. 创建 NetworkMap 清单来映射源和目标网络:

    $  cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: NetworkMap
    metadata:
      name: <network_map>
      namespace: <namespace>
    spec:
      map:
        - destination:
            name: <network_name>
            type: pod 
    1
    
          source: 
    2
    
            id: <source_network_id>
            name: <source_network_name>
        - destination:
            name: <network_attachment_definition> 
    3
    
            namespace: <network_attachment_definition_namespace> 
    4
    
            type: multus
          source:
            id: <source_network_id>
            name: <source_network_name>
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值有 podmultus并忽略。使用 忽略 以避免在此迁移中将虚拟机附加到这个网络。
    2
    您可以使用 idname 参数来指定源网络。对于 id,指定 VMware vSphere 网络受管对象参考(moRef)。要检索 moRef,请参阅 检索 VMware vSphere moRef
    3
    为每个额外 OpenShift Virtualization 网络指定网络附加定义。
    4
    仅在 类型 multus 时才需要。指定 OpenShift Virtualization 网络附加定义的命名空间。
  1. 创建 StorageMap 清单来映射源和目标存储:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: StorageMap
    metadata:
      name: <storage_map>
      namespace: <namespace>
    spec:
      map:
        - destination:
            storageClass: <storage_class>
            accessMode: <access_mode> 
    1
    
          source:
            id: <source_datastore> 
    2
    
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值有 ReadWriteOnceReadWriteMany
    2
    指定 VMware vSphere 数据存储 moRef。例如,f2737930-b567-451a-9ceb-2887f6207009。要检索 moRef,请参阅 检索 VMware vSphere moRef
  2. 可选:在 Plan CR 中指定的阶段创建一个 Hook 清单以在虚拟机中运行自定义代码:

    $  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
    Copy to Clipboard Toggle word wrap
    1
    可选: Red Hat OpenShift 服务帐户。使用 serviceAccount 参数修改任何集群资源。
    2
    base64 编码的 Ansible Playbook.如果指定了 playbook,镜像 必须包含 ansible-runner
    注意

    您可以使用默认 hook-runner 镜像或指定自定义镜像。如果指定自定义镜像,则不需要指定 playbook。

  1. 输入以下命令为 MTV 迁移创建传输网络的网络附加定义(NAD)。

    您可以使用此定义为接口配置 IP 地址,可以从 Dynamic Host Configuration Protocol (DHCP)或静态方式配置。

    配置 IP 地址可让接口访问配置的网关。

    $ oc edit NetworkAttachmentDefinitions <name_of_the_NAD_to_edit>
    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: <name_of_transfer_network>
      namespace: <namespace>
      annotations:
        forklift.konveyor.io/route: <IP_address>
    Copy to Clipboard Toggle word wrap
  2. 为迁移创建 Plan 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Plan
    metadata:
      name: <plan> 
    1
    
      namespace: <namespace>
    spec:
      warm: false 
    2
    
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
      map: 
    3
    
        network: 
    4
    
          name: <network_map> 
    5
    
          namespace: <namespace>
        storage: 
    6
    
          name: <storage_map> 
    7
    
          namespace: <namespace>
      preserveStaticIPs: 
    8
    
      networkNameTemplate: <network_interface_template> 
    9
    
      pvcNameTemplate: <pvc_name_template> 
    10
    
      pvcNameTemplateUseGenerateName: true 
    11
    
      skipGuestConversion: false 
    12
    
      targetNamespace: <target_namespace>
      useCompatibilityMode: true 
    13
    
      volumeNameTemplate: <volume_name_template> 
    14
    
      vms: 
    15
    
        - id: <source_vm1> 
    16
    
        - name: <source_vm2>
          networkNameTemplate: <network_interface_template_for_this_vm> 
    17
    
          pvcNameTemplate: <pvc_name_template_for_this_vm> 
    18
    
          volumeNameTemplate: <volume_name_template_for_this_vm> 
    19
    
          targetName: <target_name> 
    20
    
          hooks: 
    21
    
            - hook:
                namespace: <namespace>
                name: <hook> 
    22
    
              step: <step> 
    23
    
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定 Plan CR 的名称。
    2
    指定迁移是 warm - true - 或 cold - false。如果您指定了 warm 迁移,且没有为 Migration 清单中的 cutover 参数指定一个值,则只有 precopy 阶段将运行。
    3
    每个计划仅指定一个网络映射和一个存储映射。
    4
    指定一个网络映射,即使要迁移的虚拟机没有分配给网络。在这种情况下,映射可以为空。
    5
    指定 NetworkMap CR 的名称。
    6
    指定一个存储映射,即使要迁移的虚拟机没有使用磁盘镜像分配。在这种情况下,映射可以为空。
    7
    指定 StorageMap CR 的名称。
    8
    默认情况下,虚拟网络接口控制器(vNIC)在迁移过程中会改变。因此,使用链接到客户端虚拟机中接口名称的静态 IP 地址的 vNIC 会丢失其 IP 地址。要避免这种情况,请将 preserveStaticIPs 设置为 true。MTV 对缺少 vNIC 属性的任何虚拟机发出警告消息。要检索任何缺少的 vNIC 属性,请在 vSphere 中运行这些虚拟机,以便向 MTV 报告 vNIC 属性。
    9
    可选。在计划中为虚拟机指定网络接口模板。模板遵循 Go 模板语法,并可访问以下变量:
    • .networkName: 如果目标网络是 multus,请添加 Multus 网络附加定义的名称。否则,将此变量留空。
    • .networkNamespace :如果目标网络是 multus,请添加 Multus 网络附加定义所在的命名空间。
    • .networkType :指定网络类型。选项: multuspod
    • .NetworkIndex :网络接口的序列索引(0-based)。

      例子

    • "net-{{.NetworkIndex}}"
    • {{if eq .NetworkType "pod"}}pod{{else}}multus-{{.NetworkIndex}}{{end}}"

      变量名称不能超过 63 个字符。此规则适用于网络名称网络模板、PVC 名称模板、虚拟机名称模板和卷名称模板。

    10
    可选。为计划指定持久性卷声明(PVC)名称模板。模板遵循 Go 模板语法,并可访问以下变量:
    • .vmname: 虚拟机的名称。
    • .PlanName: 迁移计划的名称。
    • .DiskIndex :磁盘的初始卷索引。
    • .RootDiskIndex :根磁盘索引。
    • . shared : Options: true,用于非共享卷的共享卷为 false

      例子

    • "{{.vmname}}-disk-{{.DiskIndex}}"
    • "{{if eq .DiskIndex .RootDiskIndex}}root{{else}}data{{end}}-{{.DiskIndex}}"
    • "{{if .Shared}}shared-{{end}}{{.VmName}}-{{.DiskIndex}}"
    11
    可选:
    • 当设置为 true 时,MTV 会将一个或多个随机生成的字母数字字符添加到 PVC 名称中,以确保所有 PVC 都有唯一的名称。
    • 当设置为 false 时,如果您指定了 pvcNameTemplate,则 MTV 不会将此类字符添加到 PVC 的名称中。

      警告

      如果将 pvcNameTemplateUseGenerateName 设置为 false,则生成的 PVC 名称可能不是唯一的,并可能导致冲突。

    12
    确定在使用 virt-v2v 工具迁移前是否转换虚拟机,从而使虚拟机与 OpenShift Virtualization 兼容。
    • 当设置为 false 时,默认值 MTV 使用 virt-v2v 迁移虚拟机。
    • 当设置为 true 时,MTV 使用原始复制模式迁移虚拟机,该模式可在不首先转换虚拟机的情况下复制它们。

      原始复制模式可在不使用 virt-v2v 转换虚拟机的情况下复制虚拟机。这可以加快转换速度,迁移运行更广泛的操作系统的虚拟机,并支持使用 Linux Unified Key Setup (LUKS)加密的磁盘,而无需密钥。但是,使用原始复制模式迁移的虚拟机在 OpenShift Virtualization 中可能无法正常工作。有关 virt-v2v 的更多信息,请参阅 MTV 如何使用 virt-v2v 工具

    13
    确定当 skipGuestConversiontrue 时,迁移是否使用 VirtIO 设备或兼容性设备(SATA 总线、E1000E NIC),即原始副本模式用于迁移时。当 skipGuestConversionfalse 时,useCompatibilityMode 的设置无效,因为 virt-v2v 转换始终使用 VirtIO 设备。
    • 当设置为 true 时,SPM 使用迁移过程中的兼容性设备(SATA 总线、E1000E NIC),以确保虚拟机在迁移后可以引导。
    • 当设置为 false 时,MTV 在迁移过程中使用高性能 VirtIO 设备,virt-v2v 则确保虚拟机可在迁移后引导。在使用这个选项前,请验证源虚拟机中已安装了 VirtIO 驱动程序。
    14
    可选:在计划中为虚拟机指定卷接口名称模板。模板遵循 Go 模板语法,并可访问以下变量:
    • .PVCName: 使用这个卷挂载到虚拟机的 PVC 名称。
    • .VolumeIndex :卷接口(0)的 Sequential 索引。

      例子

    • "disk-{{.VolumeIndex}}"
    • "pvc-{{.PVCName}}"
    15
    您可以使用 idname 参数指定源虚拟机。
    16
    指定 VMware vSphere VM moRef。要检索 moRef,请参阅 检索 VMware vSphere moRef
    17
    可选:指定特定虚拟机的网络接口名称。覆盖 spec:networkNameTemplate 中设置的值。变量和示例,如调用 9 所示
    18
    可选:指定特定虚拟机的 PVC 名称。覆盖 spec:pvcNameTemplate 中设置的值。变量和示例如调用 10 所示
    19
    可选:指定特定虚拟机的卷名称。覆盖 spec:volumeNameTemplate 中设置的值。变量和示例,如调用 14 所示
    20
    可选: MTV 会自动为目标虚拟机的名称。您可以使用此参数并输入新名称来覆盖此名称。您输入的名称必须是唯一的,且它必须是有效的 Kubernetes 子域。否则,迁移会自动失败。
    21
    可选:为虚拟机指定最多两个 hook。每个 hook 必须在不同的迁移步骤中运行。
    22
    指定 Hook CR 的名称。
    23
    在迁移完成后,允许的值是 PreHook,然后迁移计划启动或 PostHook
    重要

    当您将 VMware 7 虚拟机迁移到使用 CentOS 7.9 的 OpenShift 4.13+ 平台时,网络接口的名称会改变,虚拟机的静态 IP 配置无法正常工作。

  3. 创建运行 Plan CR 的 Migration 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Migration
    metadata:
      name: <name_of_migration_cr>
      namespace: <namespace>
    spec:
      plan:
        name: <name_of_plan_cr>
        namespace: <namespace>
      cutover: <optional_cutover_time>
    EOF
    Copy to Clipboard Toggle word wrap
    注意

    如果您指定了一个截止时间,请使用 ISO 8601 格式以及 UTC 时间偏移,例如 2024-04-04T01:23:45.678+09:00

重要

forklift-controller 存在一个无法协调迁移计划的问题,然后返回一个 HTTP 500 错误。当您只在虚拟机上指定用户权限时,会导致此问题。

在 MTV 中,您需要在数据中心级别添加权限,其中包括虚拟机使用的存储、网络、交换机等。然后您必须将权限传播到子元素。

如果您不想添加这个级别的权限,您必须手动将权限添加到虚拟机主机上的每个对象。

12.2.1. 检索 VMware vSphere moRef

当您使用命令行使用 Migration Toolkit for Virtualization (MTV)迁移带有 VMware vSphere 源供应商的虚拟机时,您需要了解 vSphere 中特定实体的受管对象引用(moRef),如数据存储、网络和虚拟机。

您可以从 Inventory 服务检索一个或多个 vSphere 实体的 moRef。然后,您可以使用每个 moRef 作为检索另一个实体的 moRef 的参考。

流程

  1. 为项目检索路由:

    oc get route -n openshift-mtv
    Copy to Clipboard Toggle word wrap
  2. 检索 Inventory 服务路由:

    $ oc get route <inventory_service> -n openshift-mtv
    Copy to Clipboard Toggle word wrap
  3. 检索访问令牌:

    $ TOKEN=$(oc whoami -t)
    Copy to Clipboard Toggle word wrap
  4. 检索 VMware vSphere 供应商的 moRef :

    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere -k
    Copy to Clipboard Toggle word wrap
  5. 检索 VMware vSphere 源供应商的数据存储:

    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere/<provider id>/datastores/ -k
    Copy to Clipboard Toggle word wrap

    输出示例

    [
      {
        "id": "datastore-11",
        "parent": {
          "kind": "Folder",
          "id": "group-s5"
        },
        "path": "/Datacenter/datastore/v2v_general_porpuse_ISCSI_DC",
        "revision": 46,
        "name": "v2v_general_porpuse_ISCSI_DC",
        "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-11"
      },
      {
        "id": "datastore-730",
        "parent": {
          "kind": "Folder",
          "id": "group-s5"
        },
        "path": "/Datacenter/datastore/f01-h27-640-SSD_2",
        "revision": 46,
        "name": "f01-h27-640-SSD_2",
        "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-730"
      },
     ...
    Copy to Clipboard Toggle word wrap

在本例中,数据存储 v2v_general_porpuse_ISCSI_DC 的 moRef 是 datastore-11,而数据存储 f01-h27-640-SSD_2 的 moRef 是 datastore-730

12.2.2. 使用共享磁盘迁移虚拟机

您可以使用 Migration Toolkit for Virtualization (MTV)迁移带有共享磁盘的 VMware 虚拟机。此功能仅适用于冷迁移,不适用于共享引导磁盘。

共享磁盘是附加到多个虚拟机的磁盘,并使用多写器选项。由于这些特性,共享磁盘很难迁移。

在某些情况下,虚拟机中的应用程序需要共享磁盘。数据库和集群文件系统是共享磁盘的主要用例。

MTV 版本 2.7.11 或更高版本在 Plan 自定义资源(CR)中包括一个名为 migrateSharedDisks 的参数,用来指示 MTV 在迁移共享磁盘或在迁移过程中跳过它们,如下所示:

  • 如果设置为 true,则 MTV 会迁移共享磁盘。MTV 使用 virt-v2v 的常规冷迁移流程,并标记共享持久性卷声明(PVC)。
  • 如果设置为 false,则 MTV 会跳过共享磁盘。MTV 使用 KubeVirt Containerized-Data-Importer (CDI)进行磁盘传输。

在磁盘传输后,MTV 会自动尝试找到已共享的 PVC 以及已迁移的共享磁盘并将其附加到虚拟机。

默认情况下,migrationSharedDisks 设置为 true

要成功使用共享磁盘迁移虚拟机,请创建两个 Plan CR,如下所示:

  • 在第一个 中,将 migrateSharedDisks 设置为 true

    MTV 迁移以下内容:

    • 所有共享磁盘。
    • 对于每个共享磁盘,附加的虚拟机之一。如果可能,选择 VM 以便计划不包含连接到多个虚拟机的任何共享磁盘。有关进一步指导,请参见以下图。
    • 附加到为这个计划选择的虚拟机的所有未共享磁盘。
  • 在第二秒中,将 migrateSharedDisks 设置为 false

    MTV 迁移以下内容:

    • 所有其他虚拟机。
    • 第二个 Plan CR 中虚拟机的未共享磁盘。

当 MTV 迁移具有共享磁盘的虚拟机时,它不会检查它是否已迁移该共享磁盘。因此,务必要在两者中分配虚拟机,以便每个共享磁盘都会迁移一次,且只迁移一次。

要了解如何为每个 Plan CR 分配虚拟机和共享磁盘,请考虑下面的两个数字。在两者中,plan1migrateSharedDisks 设置为 true,并且将 plan2 的 migrationSharedDisks 设置为 false

在第一个图中,会正确分配虚拟机和共享磁盘:

图 12.1. 正确分配的虚拟机和共享磁盘示例

plan1 迁移虚拟机 2 和 4,共享磁盘 1、2 和 3,以及虚拟机 2 和 4 的非共享磁盘。此计划中包含 VM 2 和 4,因为它们各自连接到所有共享磁盘。

计划2 迁移虚拟机 1 和 3 及其非共享磁盘。plan2 不会迁移连接至虚拟机 1 和 3 的共享磁盘,因为 migrateSharedDisks 设置为 false

MTV 迁移每个虚拟机及其磁盘,如下所示:

  1. plan1 中:

    1. 虚拟机 3、共享磁盘 1 和 2,以及附加到虚拟机 3 的非共享磁盘。
    2. VM 4 共享磁盘 3,以及附加到虚拟机 4 的非共享磁盘。
  2. plan2 中:

    1. 虚拟机 1 和附加到它的非共享磁盘。
    2. 虚拟机 2 和附加到它的非共享磁盘。

结果是,虚拟机 2 和 4,所有共享磁盘都会迁移,但只会迁移一次。MTV 能够将所有虚拟机重新关联到其磁盘,包括共享磁盘。

在第二个图中,没有正确分配虚拟机和共享磁盘:

图 12.2. 错误地分配了虚拟机和共享磁盘的示例

在这种情况下,MTV 会迁移每个虚拟机及其磁盘,如下所示:

  1. plan1 中:

    1. 虚拟机 2、共享磁盘 1 和 2,以及附加到虚拟机 2 的非共享磁盘。
    2. VM 3、共享磁盘 2 和 3,以及附加到虚拟机 3 的非共享磁盘。
  2. plan2 中:

    1. 虚拟机 1 和附加到它的非共享磁盘。
    2. VM 4 和附加到它的非共享磁盘。

此迁移 "succeeds",但会产生问题:第一个 Plan CR 迁移共享磁盘 2 两次。您可以使用已知问题部分中讨论的两个临时解决方案之一来解决这个问题,这遵循流程。

流程

  1. 在 MTV 中,为共享磁盘创建迁移计划、连接到它们的最少虚拟机数量,以及这些虚拟机的未共享磁盘。
  2. 在 VMware 集群中,关闭附加到共享磁盘的所有虚拟机。
  3. 在 Red Hat OpenShift web 控制台中,点 Migration > Plans for virtualization
  4. 选择所需的计划。

    此时会打开 Plan 详情页面

  5. 点计划的 YAML 选项卡。
  6. 验证 migrateSharedDisks 是否已设置为 true

    migrateSharedDisks 设置为 true 的 Plan CR 示例

    apiVersion: forklift.konveyor.io/v1beta1
    kind: Plan
     name: transfer-shared-disks
     namespace: openshift-mtv
    spec:
     map:
       network:
         apiVersion: forklift.konveyor.io/v1beta1
         kind: NetworkMap
         name: vsphere-7gxbs
         namespace: openshift-mtv
         uid: a3c83db3-1cf7-446a-b996-84c618946362
       storage:
         apiVersion: forklift.konveyor.io/v1beta1
         kind: StorageMap
         name: vsphere-mqp7b
         namespace: openshift-mtv
         uid: 20b43d4f-ded4-4798-b836-7c0330d552a0
     migrateSharedDisks: true
     provider:
       destination:
         apiVersion: forklift.konveyor.io/v1beta1
         kind: Provider
         name: host
         namespace: openshift-mtv
         uid: abf4509f-1d5f-4ff6-b1f2-18206136922a
       source:
         apiVersion: forklift.konveyor.io/v1beta1
         kind: Provider
         name: vsphere
         namespace: openshift-mtv
         uid: be4dc7ab-fedd-460a-acae-a850f6b9543f
     targetNamespace: openshift-mtv
     vms:
       - id: vm-69
         name: vm-1-with-shared-disks
    Copy to Clipboard Toggle word wrap

  7. 启动第一个计划的迁移并等待它完成。
  8. 创建第二个 Plan CR,将所有其他虚拟机及其未共享磁盘迁移到与第一个目标命名空间相同的目标命名空间。
  9. 在 Red Hat OpenShift Web 控制台的 Plans for virtualization 页面中,选择新的计划。

    此时会打开 Plan 详情页面

  10. 点计划的 YAML 选项卡。
  11. migrateSharedDisks 设置为 false

    migrateSharedDisks 设置为 false 的 Plan CR 示例

    apiVersion: forklift.konveyor.io/v1beta1
    kind: Plan
     name: skip-shared-disks
     namespace: openshift-mtv
    spec:
     map:
       network:
         apiVersion: forklift.konveyor.io/v1beta1
         kind: NetworkMap
         name: vsphere-7gxbs
         namespace: openshift-mtv
         uid: a3c83db3-1cf7-446a-b996-84c618946362
       storage:
         apiVersion: forklift.konveyor.io/v1beta1
         kind: StorageMap
         name: vsphere-mqp7b
         namespace: openshift-mtv
         uid: 20b43d4f-ded4-4798-b836-7c0330d552a0
     migrateSharedDisks: false
     provider:
       destination:
         apiVersion: forklift.konveyor.io/v1beta1
         kind: Provider
         name: host
         namespace: openshift-mtv
         uid: abf4509f-1d5f-4ff6-b1f2-18206136922a
       source:
         apiVersion: forklift.konveyor.io/v1beta1
         kind: Provider
         name: vsphere
         namespace: openshift-mtv
         uid: be4dc7ab-fedd-460a-acae-a850f6b9543f
     targetNamespace: openshift-mtv
     vms:
       - id: vm-71
         name: vm-2-with-shared-disks
    Copy to Clipboard Toggle word wrap

  12. 启动第二个计划的迁移并等待它完成。
  13. 验证所有共享磁盘是否已附加到与迁移前相同的虚拟机,并且没有重复。如果出现问题,请参阅下文中已知问题的讨论。

12.2.2.1. 已知问题: Cyclic 共享磁盘依赖项

迁移共享磁盘的一个已知问题是,带有 cyclic 共享磁盘依赖项的虚拟机(VM)无法成功迁移。

  • 解释:当将 migrateSharedDisks 设置为 true 时,MTV 会迁移计划中的每个虚拟机,一个,一个,以及附加到它的任何共享磁盘,而无需确定是否已迁移共享磁盘。

对于 2 个虚拟机共享一个磁盘,则没有问题。MTV 将共享磁盘传输,并在迁移后将 2 个虚拟机附加到共享磁盘。

但是,如果 3 个或更多虚拟机之间存在共享磁盘的依赖项,则 MTV 会重复或省略其中一个共享磁盘。下图展示了此问题的最简单的版本。

图 12.3. cyclic 共享磁盘的简单示例

在这种情况下,无法在同一 Plan CR 中迁移虚拟机和共享磁盘。虽然可以使用 migrateSharedDisks 和 2 Plan CR 解决此问题,但它演示了在迁移使用共享磁盘的虚拟机时必须避免的基本问题。

如前文所述,尝试创建 2 个 Plan CR,在其中迁移每个共享磁盘一次。但是,如果迁移导致共享磁盘被重复或未传输,您可以使用以下临时解决方案之一:

  • 重复其中一个共享磁盘
  • "删除"其中一个共享磁盘
12.2.2.2.1. 复制共享磁盘

在下图中,VM 2 和 3 使用第一个计划中的共享磁盘迁移,并在第二个计划中迁移 VM 1。这消除了 cyclic 依赖项,但这个临时解决方案存在缺陷:它会重复共享磁盘 3。解决方案是删除重复的 PV 并再次迁移虚拟机 1。

图 12.4. 重复的共享磁盘

优点 :源虚拟机不会受到影响。

缺点:一个共享磁盘传输两次,因此您需要在迁移后手动删除重复的磁盘,并将 VM 3 重新连接到 Red Hat OpenShift 中的共享磁盘 3。

12.2.3. 使用命令行界面取消迁移

您可以使用命令行界面(CLI)在迁移过程中取消整个迁移或特定虚拟机的迁移。

12.2.3.1. 使用命令行界面取消整个迁移

您可以使用命令行界面(CLI)在迁移过程中取消整个迁移。

流程

  • 删除 Migration CR:

    $ oc delete migration <migration> -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定 Migration CR 的名称。

您可以使用命令行界面(CLI)在迁移过程中取消特定虚拟机(VM)的迁移。

流程

  1. 将特定的虚拟机添加到 Migration 清单的 spec.cancel 块中,如下例所示:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Migration
    metadata:
      name: <migration>
      namespace: <namespace>
    ...
    spec:
      cancel:
      - id: vm-102 
    1
    
      - id: vm-203
        name: rhel8-vm
    EOF
    Copy to Clipboard Toggle word wrap
    1
    您可以使用 id 键或 name 键指定虚拟机。

    id 键的值是受管对象的引用(VMware VM),或 VM UUID(RHV VM)。

  2. 检索 Migration 自定义资源(CR)以监控剩余的虚拟机的进度,如下例所示:

    $ oc get migration/<migration> -n <namespace> -o yaml
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat