将虚拟机迁移到 Red Hat OpenShift Virtualization


Migration Toolkit for Virtualization 2.10

使用 Migration Toolkit for Virtualization 将虚拟机从 VMware vSphere、Red Hat Virtualization 或 OpenStack 平台或其他平台迁移到 Red Hat OpenShift Virtualization

Red Hat Modernization and Migration Documentation Team

摘要

使用 Red Hat OpenShift Web 控制台或命令行界面中的 Migration Toolkit for Virtualization (MTV)用户界面运行迁移计划。

第 1 章 执行迁移

当使用 Migration Toolkit for Virtualization (MTV)计划迁移后,您可以将虚拟机从以下源供应商迁移到 OpenShift Virtualization 目的地供应商:

  • VMware vSphere
  • Red Hat Virtualization(RHV)
  • OpenStack
  • 由 VMware vSphere 创建的开放虚拟设备(OVAs)
  • 远程 OpenShift Virtualization 集群

第 2 章 从 VMware vSphere 迁移

从 MTV UI 或命令行运行 VMware 迁移计划。

2.1. 先决条件

  • 您已计划从 VMware vSphere 迁移。

2.2. 在 MTV UI 中运行迁移计划

您可以运行迁移计划,并在 Red Hat OpenShift Web 控制台中查看其进度。

先决条件

  • 有效的迁移计划。

流程

  1. 在 Red Hat OpenShift web 控制台中,点 Migration > Plans for virtualization

    Plans 列表显示源和目标供应商、正在迁移的虚拟机数量、状态、迁移的日期以及每个计划的描述。

  2. 点迁移计划旁边的 Start 来启用迁移。
  3. 在打开的确认窗口中,单击 Start

    计划 的状态更改为 Running,并显示迁移的进度。

    仅限 warm 迁移:

    • precopy 阶段会启动。
    • Cutover 完成迁移。

      警告

      开始迁移后不要对虚拟机进行快照。在迁移启动后进行 snaphot 可能会导致迁移失败。

  4. 可选:点迁移的 Status 中的链接查看其整体状态和每个虚拟机的状态:

    • 左侧的链接表示迁移失败、成功还是持续。它还会报告迁移成功、失败或被取消的虚拟机数量。
    • 右侧的链接会打开 Plan Details 页面的 Virtual Machines 选项卡。对于每个虚拟机,标签会显示以下数据:

      • 虚拟机的名称
      • 迁移的开始和结束时间
      • 复制的数据量
      • 虚拟机迁移的进度管道

        警告

        对于正在导入的虚拟机,必须禁用 vMotion,包括 svMotion 和 relocate,以避免数据崩溃。

  5. 可选: 要在迁移的运行时或完成后查看迁移的日志,请执行以下操作:

    1. Virtual Machines 标签页。
    2. 点击您要检查的虚拟机左侧的箭头(>)。

      此时会显示虚拟机的详情。

    3. 在 Pod link 列中的 Pods 部分,点 Logs 链接。

      Logs 选项卡将打开。

      注意

      日志并不总是可用。以下是日志不可用的常见原因:

      • 迁移是从 OpenShift Virtualization 迁移到 OpenShift Virtualization。在这种情况下,不涉及 virt-v2v,因此不需要 pod。
      • 没有创建 pod。
      • pod 已被删除。
      • 迁移在运行 pod 前失败。
    4. 要查看原始日志,请点 Raw 链接。
    5. 要下载日志,请点 Download 链接。

2.2.1. 迁移计划选项

在 Red Hat OpenShift web 控制台的 Plans for virtualization 页面中,点迁移计划旁边的 Options 菜单 kebab 访问以下选项:

  • 编辑计划 :编辑迁移计划的详细信息。如果计划正在运行或成功完成,则无法编辑以下选项:

    • Plan 详情页面的 Settings 部分的所有属性。例如,温或冷迁移、目标命名空间和保留的静态 IP。
    • 计划在 Mappings 选项卡上的映射。
    • Hook 选项卡上列出的 hook。
  • 开始迁移 :只有在相关时才活动。
  • 重启迁移 :重启中断的迁移。在选择此选项前,请确保没有错误消息。如果存在,您需要编辑计划。
  • cutover: 仅限 Warm 迁移。仅在相关时才激活。点 Cutover 打开 Cutover 窗口,它支持以下选项:

    • 设置 cutover :为 cutover 设置日期和时间。
    • 删除 cutover :取消调度的 cutover。仅在相关时才激活。
  • 重复计划 :创建一个与现有计划相同的虚拟机(VM)、参数、映射和 hook 的新迁移计划。您可以将此功能用于以下任务:

    • 将虚拟机迁移到不同的命名空间。
    • 编辑归档的迁移计划。
    • 编辑具有不同状态的迁移计划,如 failed、canceled、running、critical 或 ready。
  • archive Plan :删除迁移计划的日志、历史记录和元数据。计划不能编辑或重启。它只能查看、复制或删除。

    注意

    归档计划 不可逆。但是,您可以复制归档的计划。

  • 删除计划 :永久删除迁移计划。您不能删除正在运行的迁移计划。

    注意

    删除计划是 不可逆的。

    删除迁移计划不会删除临时资源。要删除临时资源,请在删除前先归档计划。

    注意

    归档的结果,然后删除迁移计划会根据您使用 CLI 或 UI 创建计划及其存储和网络映射而有所不同。

    • 如果您使用 UI 创建它们,则迁移计划及其映射不再出现在 UI 中。
    • 如果您使用 CLI 创建它们,则映射可能仍然出现在 UI 中。这是因为 CLI 中的映射可以被多个迁移计划使用,但 UI 中创建的映射只能在一个迁移计划中使用。

2.2.2. 取消迁移

您可以使用 Red Hat OpenShift web 控制台在迁移计划进行时取消部分或所有虚拟机(VM)的迁移。

流程

  1. 在 Red Hat OpenShift web 控制台中,单击 Plans for virtualization
  2. 点正在运行的迁移计划的名称查看迁移详情。
  3. 选择一个或多个虚拟机,点 Cancel
  4. Yes, cancel 确认取消。

    Migration details by VM 列表中,取消的虚拟机的状态为 Canceled。未迁移且迁移的虚拟机不受影响。

您可以通过点 Migration Plan 页的迁移计划旁的 Restart 重启迁移。

2.3. 从命令行运行 VMware vSphere 迁移

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

重要

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

重要

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

注意

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

先决条件

  • 如果使用用户定义的网络(UDN),请注意 OpenShift Virtualization 中定义的命名空间名称。

流程

  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> 
    5
    
    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 网络附加定义的命名空间。
    5
    如果您使用用户定义的网络(UDN),则其命名空间在 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 参数指定源虚拟机。如果您使用 UDN,请验证供应商的 IP 地址是否在 UDN 的子网之外。如果 IP 地址位于 UDN 的子网内,则迁移会失败。
    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 中,您需要在数据中心级别添加权限,其中包括虚拟机使用的存储、网络、交换机等。然后您必须将权限传播到子元素。

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

2.3.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

2.3.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

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

图 2.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 能够将所有虚拟机重新关联到其磁盘,包括共享磁盘。

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

图 2.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. 验证所有共享磁盘是否已附加到与迁移前相同的虚拟机,并且没有重复。如果出现问题,请参阅下文中已知问题的讨论。

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

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

第 3 章 从 Red Hat Virtualization 迁移

从 MTV UI 或命令行运行 Red Hat Virtualization 迁移计划。

3.1. 先决条件

  • 您已计划从 Red Hat Virtualization 迁移。

3.2. 在 MTV UI 中运行迁移计划

您可以运行迁移计划,并在 Red Hat OpenShift Web 控制台中查看其进度。

先决条件

  • 有效的迁移计划。

流程

  1. 在 Red Hat OpenShift web 控制台中,点 Migration > Plans for virtualization

    Plans 列表显示源和目标供应商、正在迁移的虚拟机数量、状态、迁移的日期以及每个计划的描述。

  2. 点迁移计划旁边的 Start 来启用迁移。
  3. 在打开的确认窗口中,单击 Start

    计划 的状态更改为 Running,并显示迁移的进度。

    仅限 warm 迁移:

    • precopy 阶段会启动。
    • Cutover 完成迁移。

      警告

      开始迁移后不要对虚拟机进行快照。在迁移启动后进行 snaphot 可能会导致迁移失败。

  4. 可选:点迁移的 Status 中的链接查看其整体状态和每个虚拟机的状态:

    • 左侧的链接表示迁移失败、成功还是持续。它还会报告迁移成功、失败或被取消的虚拟机数量。
    • 右侧的链接会打开 Plan Details 页面的 Virtual Machines 选项卡。对于每个虚拟机,标签会显示以下数据:

      • 虚拟机的名称
      • 迁移的开始和结束时间
      • 复制的数据量
      • 虚拟机迁移的进度管道
  5. 可选: 要在迁移的运行时或完成后查看迁移的日志,请执行以下操作:

    1. Virtual Machines 标签页。
    2. 点击您要检查的虚拟机左侧的箭头(>)。

      此时会显示虚拟机的详情。

    3. 在 Pod link 列中的 Pods 部分,点 Logs 链接。

      Logs 选项卡将打开。

      注意

      日志并不总是可用。以下是日志不可用的常见原因:

      • 迁移是从 OpenShift Virtualization 迁移到 OpenShift Virtualization。在这种情况下,不涉及 virt-v2v,因此不需要 pod。
      • 没有创建 pod。
      • pod 已被删除。
      • 迁移在运行 pod 前失败。
    4. 要查看原始日志,请点 Raw 链接。
    5. 要下载日志,请点 Download 链接。

3.2.1. 迁移计划选项

在 Red Hat OpenShift web 控制台的 Plans for virtualization 页面中,点迁移计划旁边的 Options 菜单 kebab 访问以下选项:

  • 编辑计划 :编辑迁移计划的详细信息。如果计划正在运行或成功完成,则无法编辑以下选项:

    • Plan 详情页面的 Settings 部分的所有属性。例如,温或冷迁移、目标命名空间和保留的静态 IP。
    • 计划在 Mappings 选项卡上的映射。
    • Hook 选项卡上列出的 hook。
  • 开始迁移 :只有在相关时才活动。
  • 重启迁移 :重启中断的迁移。在选择此选项前,请确保没有错误消息。如果存在,您需要编辑计划。
  • cutover: 仅限 Warm 迁移。仅在相关时才激活。点 Cutover 打开 Cutover 窗口,它支持以下选项:

    • 设置 cutover :为 cutover 设置日期和时间。
    • 删除 cutover :取消调度的 cutover。仅在相关时才激活。
  • 重复计划 :创建一个与现有计划相同的虚拟机(VM)、参数、映射和 hook 的新迁移计划。您可以将此功能用于以下任务:

    • 将虚拟机迁移到不同的命名空间。
    • 编辑归档的迁移计划。
    • 编辑具有不同状态的迁移计划,如 failed、canceled、running、critical 或 ready。
  • archive Plan :删除迁移计划的日志、历史记录和元数据。计划不能编辑或重启。它只能查看、复制或删除。

    注意

    归档计划 不可逆。但是,您可以复制归档的计划。

  • 删除计划 :永久删除迁移计划。您不能删除正在运行的迁移计划。

    注意

    删除计划是 不可逆的。

    删除迁移计划不会删除临时资源。要删除临时资源,请在删除前先归档计划。

    注意

    归档的结果,然后删除迁移计划会根据您使用 CLI 或 UI 创建计划及其存储和网络映射而有所不同。

    • 如果您使用 UI 创建它们,则迁移计划及其映射不再出现在 UI 中。
    • 如果您使用 CLI 创建它们,则映射可能仍然出现在 UI 中。这是因为 CLI 中的映射可以被多个迁移计划使用,但 UI 中创建的映射只能在一个迁移计划中使用。

3.2.2. 取消迁移

您可以使用 Red Hat OpenShift web 控制台在迁移计划进行时取消部分或所有虚拟机(VM)的迁移。

流程

  1. 在 Red Hat OpenShift web 控制台中,单击 Plans for virtualization
  2. 点正在运行的迁移计划的名称查看迁移详情。
  3. 选择一个或多个虚拟机,点 Cancel
  4. Yes, cancel 确认取消。

    Migration details by VM 列表中,取消的虚拟机的状态为 Canceled。未迁移且迁移的虚拟机不受影响。

您可以通过点 Migration Plan 页的迁移计划旁的 Restart 重启迁移。

3.3. 从命令行运行 Red Hat Virtualization 迁移

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

先决条件

  • 如果使用用户定义的网络(UDN),请注意 OpenShift Virtualization 中定义的命名空间名称。
  • 如果您要迁移使用直接 LUN 磁盘的虚拟机,请确保 OpenShift Virtualization 目标集群的节点可以访问后端存储。
注意
  • 与从源提供程序 复制到目标 提供程序的磁盘镜像不同,LUN会从 源提供程序中的 虚拟机分离,然后附加到目标提供程序中创建的虚拟机(VM)。
  • 在迁移过程中,当需要回退到源供应商时,不会从源供应商中删除 LUN。但是,在将 LUN 重新附加到源供应商中的虚拟机之前,请确保目标环境中的虚拟机不会同时使用 LUN,这可能会导致数据崩溃。

流程

  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: ovirt
        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
    指定 RHV Manager 用户。
    3
    指定用户密码。
    4
    指定 "true" 以跳过证书验证,并指定 "false" 来验证证书。如果没有指定,则默认为 "false "。跳过证书验证会进行不安全的迁移,然后不需要证书。不安全的迁移意味着传输的数据通过安全连接发送,并可能会公开敏感数据。
    5
    输入 Manager CA 证书,除非被第三方证书替代,在这种情况下,输入 Manager Apache CA 证书。您可以在 https://<engine_host>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA 中检索 Manager CA 证书。
    6
    指定 API 端点 URL,例如 https://<engine_host>/ovirt-engine/api
  1. 为源供应商创建 Provider 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Provider
    metadata:
      name: <source_provider>
      namespace: <namespace>
    spec:
      type: ovirt
      url: <api_end_point> 
    1
    
      secret:
        name: <secret> 
    2
    
        namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定 API 端点的 URL,例如 https://<engine_host>/ovirt-engine/api
    2
    指定供应商 Secret CR 的名称。
  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> 
    5
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值是 podmultus
    2
    您可以使用 idname 参数来指定源网络。对于 id,请指定 RHV 网络通用唯一 ID (UUID)。
    3
    为每个额外 OpenShift Virtualization 网络指定网络附加定义。
    4
    仅在 类型 multus 时才需要。指定 OpenShift Virtualization 网络附加定义的命名空间。
    5
    如果您使用用户定义的网络(UDN),则其命名空间在 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_storage_domain> 
    2
    
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值有 ReadWriteOnceReadWriteMany
    2
    指定 RHV 存储域 UUID。例如,f2737930-b567-451a-9ceb-2887f6207009
  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>
      preserveClusterCpuModel: true 
    2
    
    spec:
      warm: false 
    3
    
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
      map: 
    4
    
        network: 
    5
    
          name: <network_map> 
    6
    
          namespace: <namespace>
        storage: 
    7
    
          name: <storage_map> 
    8
    
          namespace: <namespace>
      targetNamespace: <target_namespace>
      vms: 
    9
    
        - id: <source_vm1> 
    10
    
        - name: <source_vm2>
          hooks: 
    11
    
            - hook:
                namespace: <namespace>
                name: <hook> 
    12
    
              step: <step> 
    13
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定 Plan CR 的名称。
    2
    请参见以下注释。
    3
    指定迁移是温迁移还是冷迁移。如果您指定了 warm 迁移,且没有为 Migration 清单中的 cutover 参数指定一个值,则只有 precopy 阶段将运行。
    4
    每个计划仅指定一个网络映射和一个存储映射。
    5
    指定一个网络映射,即使要迁移的虚拟机没有分配给网络。在这种情况下,映射可以为空。
    6
    指定 NetworkMap CR 的名称。
    7
    指定一个存储映射,即使要迁移的虚拟机没有使用磁盘镜像分配。在这种情况下,映射可以为空。
    8
    指定 StorageMap CR 的名称。
    9
    您可以使用 idname 参数指定源虚拟机。如果您使用 UDN,请验证供应商的 IP 地址是否在 UDN 的子网之外。如果 IP 地址位于 UDN 的子网内,则迁移会失败。
    10
    指定 RHV VM UUID。
    11
    可选:为虚拟机指定最多两个 hook。每个 hook 必须在不同的迁移步骤中运行。
    12
    指定 Hook CR 的名称。
    13
    在迁移完成后,允许的值是 PreHook、在迁移计划启动前或 PostHook
    注意
    • 如果使用自定义 CPU 模型设置了迁移的机器,它将使用目标集群中的 CPU 模型设置,无论 preserveClusterCpuModel 的设置是什么。
    • 如果没有使用 自定义 CPU 模型来设置迁移的机器:

      • 如果 preserveClusterCpuModel 设为 'true',则 MTV 会在 RHV 中运行时根据集群的配置检查虚拟机的 CPU 模型,然后使用该 CPU 模型设置迁移的虚拟机。
      • 如果 preserveClusterCpuModel 设为 'false',则 MTV 不会设置 CPU 类型,并使用目标集群的默认 CPU 模型设置虚拟机。
  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

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

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

第 4 章 从 OpenStack 迁移

从 MTV UI 或命令行运行 OpenStack 迁移计划。

4.1. 先决条件

  • 您已计划从 OpenStack 迁移。

4.2. 在 MTV UI 中运行迁移计划

您可以运行迁移计划,并在 Red Hat OpenShift Web 控制台中查看其进度。

先决条件

  • 有效的迁移计划。

流程

  1. 在 Red Hat OpenShift web 控制台中,点 Migration > Plans for virtualization

    Plans 列表显示源和目标供应商、正在迁移的虚拟机数量、状态、迁移的日期以及每个计划的描述。

  2. 点迁移计划旁边的 Start 来启用迁移。
  3. 在打开的确认窗口中,单击 Start

    计划 的状态更改为 Running,并显示迁移的进度。

    警告

    开始迁移后不要对虚拟机进行快照。在迁移启动后进行 snaphot 可能会导致迁移失败。

  4. 可选:点迁移的 Status 中的链接查看其整体状态和每个虚拟机的状态:

    • 左侧的链接表示迁移失败、成功还是持续。它还会报告迁移成功、失败或被取消的虚拟机数量。
    • 右侧的链接会打开 Plan Details 页面的 Virtual Machines 选项卡。对于每个虚拟机,标签会显示以下数据:

      • 虚拟机的名称
      • 迁移的开始和结束时间
      • 复制的数据量
      • 虚拟机迁移的进度管道
  5. 可选: 要在迁移的运行时或完成后查看迁移的日志,请执行以下操作:

    1. Virtual Machines 标签页。
    2. 点击您要检查的虚拟机左侧的箭头(>)。

      此时会显示虚拟机的详情。

    3. 在 Pod link 列中的 Pods 部分,点 Logs 链接。

      Logs 选项卡将打开。

      注意

      日志并不总是可用。以下是日志不可用的常见原因:

      • 迁移是从 OpenShift Virtualization 迁移到 OpenShift Virtualization。在这种情况下,不涉及 virt-v2v,因此不需要 pod。
      • 没有创建 pod。
      • pod 已被删除。
      • 迁移在运行 pod 前失败。
    4. 要查看原始日志,请点 Raw 链接。
    5. 要下载日志,请点 Download 链接。

4.2.1. 迁移计划选项

在 Red Hat OpenShift web 控制台的 Plans for virtualization 页面中,点迁移计划旁边的 Options 菜单 kebab 访问以下选项:

  • 编辑计划 :编辑迁移计划的详细信息。如果计划正在运行或成功完成,则无法编辑以下选项:

    • Plan 详情页面的 Settings 部分的所有属性。例如,温或冷迁移、目标命名空间和保留的静态 IP。
    • 计划在 Mappings 选项卡上的映射。
    • Hook 选项卡上列出的 hook。
  • 开始迁移 :只有在相关时才活动。
  • 重启迁移 :重启中断的迁移。在选择此选项前,请确保没有错误消息。如果存在,您需要编辑计划。
  • cutover: 仅限 Warm 迁移。仅在相关时才激活。点 Cutover 打开 Cutover 窗口,它支持以下选项:

    • 设置 cutover :为 cutover 设置日期和时间。
    • 删除 cutover :取消调度的 cutover。仅在相关时才激活。
  • 重复计划 :创建一个与现有计划相同的虚拟机(VM)、参数、映射和 hook 的新迁移计划。您可以将此功能用于以下任务:

    • 将虚拟机迁移到不同的命名空间。
    • 编辑归档的迁移计划。
    • 编辑具有不同状态的迁移计划,如 failed、canceled、running、critical 或 ready。
  • archive Plan :删除迁移计划的日志、历史记录和元数据。计划不能编辑或重启。它只能查看、复制或删除。

    注意

    归档计划 不可逆。但是,您可以复制归档的计划。

  • 删除计划 :永久删除迁移计划。您不能删除正在运行的迁移计划。

    注意

    删除计划是 不可逆的。

    删除迁移计划不会删除临时资源。要删除临时资源,请在删除前先归档计划。

    注意

    归档的结果,然后删除迁移计划会根据您使用 CLI 或 UI 创建计划及其存储和网络映射而有所不同。

    • 如果您使用 UI 创建它们,则迁移计划及其映射不再出现在 UI 中。
    • 如果您使用 CLI 创建它们,则映射可能仍然出现在 UI 中。这是因为 CLI 中的映射可以被多个迁移计划使用,但 UI 中创建的映射只能在一个迁移计划中使用。

4.2.2. 取消迁移

您可以使用 Red Hat OpenShift web 控制台在迁移计划进行时取消部分或所有虚拟机(VM)的迁移。

流程

  1. 在 Red Hat OpenShift web 控制台中,单击 Plans for virtualization
  2. 点正在运行的迁移计划的名称查看迁移详情。
  3. 选择一个或多个虚拟机,点 Cancel
  4. Yes, cancel 确认取消。

    Migration details by VM 列表中,取消的虚拟机的状态为 Canceled。未迁移且迁移的虚拟机不受影响。

您可以通过点 Migration Plan 页的迁移计划旁的 Restart 重启迁移。

4.3. 从命令行运行 OpenStack 迁移

您可以使用命令行界面(CLI)从 OpenStack 源提供程序迁移。

先决条件

  • 如果使用用户定义的网络(UDN),请注意其命名空间的名称,如 OpenShift Virtualization 中定义的名称。

流程

  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: openstack
        createdForResourceType: providers
    type: Opaque
    stringData:
      user: <user> 
    2
    
      password: <password> 
    3
    
      insecureSkipVerify: <"true"/"false"> 
    4
    
      domainName: <domain_name>
      projectName: <project_name>
      regionName: <region_name>
      cacert: | 
    5
    
        <ca_certificate>
      url: <api_end_point> 
    6
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    ownerReferences 部分是可选的。
    2
    指定 OpenStack 用户。
    3
    指定用户 OpenStack 密码。
    4
    指定 "true" 以跳过证书验证,并指定 "false" 来验证证书。如果没有指定,则默认为 "false "。跳过证书验证会进行不安全的迁移,然后不需要证书。不安全的迁移意味着传输的数据通过安全连接发送,并可能会公开敏感数据。
    5
    如果没有设置此字段并禁用 跳过证书验证 时,MTV 会尝试使用系统 CA。
    6
    指定 API 端点 URL,例如 https://<identity_service>/v3
  1. 为源供应商创建 Provider 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Provider
    metadata:
      name: <source_provider>
      namespace: <namespace>
    spec:
      type: openstack
      url: <api_end_point> 
    1
    
      secret:
        name: <secret> 
    2
    
        namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定 API 端点的 URL。
    2
    指定供应商 Secret CR 的名称。
  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> 
    5
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值是 podmultus
    2
    您可以使用 idname 参数来指定源网络。对于 id,指定 OpenStack 网络 UUID。
    3
    为每个额外 OpenShift Virtualization 网络指定网络附加定义。
    4
    仅在 类型 multus 时才需要。指定 OpenShift Virtualization 网络附加定义的命名空间。
    5
    如果您使用用户定义的网络(UDN),则其命名空间在 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_volume_type> 
    2
    
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值有 ReadWriteOnceReadWriteMany
    2
    指定 OpenStack volume_type UUID。例如,f2737930-b567-451a-9ceb-2887f6207009
  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:
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
      map: 
    2
    
        network: 
    3
    
          name: <network_map> 
    4
    
          namespace: <namespace>
        storage: 
    5
    
          name: <storage_map> 
    6
    
          namespace: <namespace>
      targetNamespace: <target_namespace>
      vms: 
    7
    
        - id: <source_vm1> 
    8
    
        - name: <source_vm2>
          hooks: 
    9
    
            - hook:
                namespace: <namespace>
                name: <hook> 
    10
    
              step: <step> 
    11
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定 Plan CR 的名称。
    2
    每个计划仅指定一个网络映射和一个存储映射。
    3
    指定网络映射,即使要迁移的虚拟机没有分配给网络。在这种情况下,映射可以为空。
    4
    指定 NetworkMap CR 的名称。
    5
    指定存储映射,即使要迁移的虚拟机没有使用磁盘镜像分配。在这种情况下,映射可以为空。
    6
    指定 StorageMap CR 的名称。
    7
    您可以使用 idname 参数指定源虚拟机。如果您使用 UDN,请验证供应商的 IP 地址是否在 UDN 的子网之外。如果 IP 地址位于 UDN 的子网内,则迁移会失败。
    8
    指定 OpenStack VM UUID。
    9
    可选:为虚拟机指定最多两个 hook。每个 hook 必须在不同的迁移步骤中运行。
    10
    指定 Hook CR 的名称。
    11
    在迁移完成后,允许的值是 PreHook、在迁移计划启动前或 PostHook
  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

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

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

第 5 章 从 OVA 迁移

从 MTV UI 或命令行运行您的 OVA 迁移计划。

5.1. 先决条件

  • 您计划从 OVA 中进行迁移。

5.2. 在 MTV UI 中运行迁移计划

您可以运行迁移计划,并在 Red Hat OpenShift Web 控制台中查看其进度。

先决条件

  • 有效的迁移计划。

流程

  1. 在 Red Hat OpenShift web 控制台中,点 Migration > Plans for virtualization

    Plans 列表显示源和目标供应商、正在迁移的虚拟机数量、状态、迁移的日期以及每个计划的描述。

  2. 点迁移计划旁边的 Start 来启用迁移。
  3. 在打开的确认窗口中,单击 Start

    计划 的状态更改为 Running,并显示迁移的进度。

    警告

    开始迁移后不要对虚拟机进行快照。在迁移启动后进行 snaphot 可能会导致迁移失败。

  4. 可选:点迁移的 Status 中的链接查看其整体状态和每个虚拟机的状态:

    • 左侧的链接表示迁移失败、成功还是持续。它还会报告迁移成功、失败或被取消的虚拟机数量。
    • 右侧的链接会打开 Plan Details 页面的 Virtual Machines 选项卡。对于每个虚拟机,标签会显示以下数据:

      • 虚拟机的名称
      • 迁移的开始和结束时间
      • 复制的数据量
      • 虚拟机迁移的进度管道
  5. 可选: 要在迁移的运行时或完成后查看迁移的日志,请执行以下操作:

    1. Virtual Machines 标签页。
    2. 点击您要检查的虚拟机左侧的箭头(>)。

      此时会显示虚拟机的详情。

    3. 在 Pod link 列中的 Pods 部分,点 Logs 链接。

      Logs 选项卡将打开。

      注意

      日志并不总是可用。以下是日志不可用的常见原因:

      • 迁移是从 OpenShift Virtualization 迁移到 OpenShift Virtualization。在这种情况下,不涉及 virt-v2v,因此不需要 pod。
      • 没有创建 pod。
      • pod 已被删除。
      • 迁移在运行 pod 前失败。
    4. 要查看原始日志,请点 Raw 链接。
    5. 要下载日志,请点 Download 链接。

5.2.1. 迁移计划选项

在 Red Hat OpenShift web 控制台的 Plans for virtualization 页面中,点迁移计划旁边的 Options 菜单 kebab 访问以下选项:

  • 编辑计划 :编辑迁移计划的详细信息。如果计划正在运行或成功完成,则无法编辑以下选项:

    • Plan 详情页面的 Settings 部分的所有属性。例如,温或冷迁移、目标命名空间和保留的静态 IP。
    • 计划在 Mappings 选项卡上的映射。
    • Hook 选项卡上列出的 hook。
  • 开始迁移 :只有在相关时才活动。
  • 重启迁移 :重启中断的迁移。在选择此选项前,请确保没有错误消息。如果存在,您需要编辑计划。
  • cutover: 仅限 Warm 迁移。仅在相关时才激活。点 Cutover 打开 Cutover 窗口,它支持以下选项:

    • 设置 cutover :为 cutover 设置日期和时间。
    • 删除 cutover :取消调度的 cutover。仅在相关时才激活。
  • 重复计划 :创建一个与现有计划相同的虚拟机(VM)、参数、映射和 hook 的新迁移计划。您可以将此功能用于以下任务:

    • 将虚拟机迁移到不同的命名空间。
    • 编辑归档的迁移计划。
    • 编辑具有不同状态的迁移计划,如 failed、canceled、running、critical 或 ready。
  • archive Plan :删除迁移计划的日志、历史记录和元数据。计划不能编辑或重启。它只能查看、复制或删除。

    注意

    归档计划 不可逆。但是,您可以复制归档的计划。

  • 删除计划 :永久删除迁移计划。您不能删除正在运行的迁移计划。

    注意

    删除计划是 不可逆的。

    删除迁移计划不会删除临时资源。要删除临时资源,请在删除前先归档计划。

    注意

    归档的结果,然后删除迁移计划会根据您使用 CLI 或 UI 创建计划及其存储和网络映射而有所不同。

    • 如果您使用 UI 创建它们,则迁移计划及其映射不再出现在 UI 中。
    • 如果您使用 CLI 创建它们,则映射可能仍然出现在 UI 中。这是因为 CLI 中的映射可以被多个迁移计划使用,但 UI 中创建的映射只能在一个迁移计划中使用。

5.2.2. 取消迁移

您可以使用 Red Hat OpenShift web 控制台在迁移计划进行时取消部分或所有虚拟机(VM)的迁移。

流程

  1. 在 Red Hat OpenShift web 控制台中,单击 Plans for virtualization
  2. 点正在运行的迁移计划的名称查看迁移详情。
  3. 选择一个或多个虚拟机,点 Cancel
  4. Yes, cancel 确认取消。

    Migration details by VM 列表中,取消的虚拟机的状态为 Canceled。未迁移且迁移的虚拟机不受影响。

您可以通过点 Migration Plan 页的迁移计划旁的 Restart 重启迁移。

5.3. 从命令行运行开放虚拟设备(OVA)迁移

您可以使用命令行界面(CLI)从由 VMware vSphere 创建的开放虚拟设备(OVA)文件迁移到源供应商。

先决条件

  • 如果使用用户定义的网络(UDN),请注意 OpenShift Virtualization 中定义的命名空间名称。

流程

  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: ova
        createdForResourceType: providers
    type: Opaque
    stringData:
      url: <nfs_server:/nfs_path> 
    2
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    ownerReferences 部分是可选的。
    2
    其中: nfs_server 是创建共享的服务器的 IP 或主机名,nfs_path 是存储 OVA 文件的服务器上的路径。
  1. 为源供应商创建 Provider 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Provider
    metadata:
      name: <source_provider>
      namespace: <namespace>
    spec:
      type: ova
      url:  <nfs_server:/nfs_path> 
    1
    
      secret:
        name: <secret> 
    2
    
        namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    其中: nfs_server 是创建共享的服务器的 IP 或主机名,nfs_path 是存储 OVA 文件的服务器上的路径。
    2
    指定供应商 Secret CR 的名称。
  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:
            id: <source_network_id> 
    2
    
        - destination:
            name: <network_attachment_definition> 
    3
    
            namespace: <network_attachment_definition_namespace> 
    4
    
            type: multus
          source:
            id: <source_network_id>
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace> 
    5
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值是 podmultus
    2
    指定 OVA 网络通用唯一 ID (UUID)。
    3
    为每个额外 OpenShift Virtualization 网络指定网络附加定义。
    4
    仅在 类型 multus 时才需要。指定 OpenShift Virtualization 网络附加定义的命名空间。
    5
    如果您使用用户定义的网络(UDN),则其命名空间在 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:
            name:  Dummy storage for source provider <provider_name> 
    2
    
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值有 ReadWriteOnceReadWriteMany
    2
    对于 OVA,StorageMap 只能将 OVA 中的所有磁盘相关联的单个存储映射到目的地上的存储类。因此,存储在 UI 中被称为 "Dummy storage for source provider <provider_name>"。在 YAML 中,像上面显示一样编写短语,没有引号,并将 <provider_name> 替换为提供程序的实际名称。
  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:
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
      map: 
    2
    
        network: 
    3
    
          name: <network_map> 
    4
    
          namespace: <namespace>
        storage: 
    5
    
          name: <storage_map> 
    6
    
          namespace: <namespace>
      targetNamespace: <target_namespace>
      vms: 
    7
    
        - id: <source_vm1> 
    8
    
        - name: <source_vm2>
          hooks: 
    9
    
            - hook:
                namespace: <namespace>
                name: <hook> 
    10
    
              step: <step> 
    11
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定 Plan CR 的名称。
    2
    每个计划仅指定一个网络映射和一个存储映射。
    3
    指定网络映射,即使要迁移的虚拟机没有分配给网络。在这种情况下,映射可以为空。
    4
    指定 NetworkMap CR 的名称。
    5
    指定一个存储映射,即使要迁移的虚拟机没有使用磁盘镜像分配。在这种情况下,映射可以为空。
    6
    指定 StorageMap CR 的名称。
    7
    您可以使用 idname 参数指定源虚拟机。如果您使用 UDN,请验证供应商的 IP 地址是否在 UDN 的子网之外。如果 IP 地址位于 UDN 的子网内,则迁移会失败。
    8
    指定 OVA 虚拟机 UUID。
    9
    可选:为虚拟机指定最多两个 hook。每个 hook 必须在不同的迁移步骤中运行。
    10
    指定 Hook CR 的名称。
    11
    在迁移完成后,允许的值是 PreHook、在迁移计划启动前或 PostHook
  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

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

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

第 6 章 从 OpenShift Virtualization 迁移

从 MTV UI 或命令行运行 OpenShift Virtualization 迁移计划。

6.1. 先决条件

  • 您已计划从 OpenShift Virtualization 迁移。

6.2. 在 MTV UI 中运行迁移计划

您可以运行迁移计划,并在 Red Hat OpenShift Web 控制台中查看其进度。

先决条件

  • 有效的迁移计划。

流程

  1. 在 Red Hat OpenShift web 控制台中,点 Migration > Plans for virtualization

    Plans 列表显示源和目标供应商、正在迁移的虚拟机数量、状态、迁移的日期以及每个计划的描述。

  2. 点迁移计划旁边的 Start 来启用迁移。
  3. 在打开的确认窗口中,单击 Start

    计划 的状态更改为 Running,并显示迁移的进度。

    警告

    开始迁移后不要对虚拟机进行快照。在迁移启动后进行 snaphot 可能会导致迁移失败。

  4. 可选:点迁移的 Status 中的链接查看其整体状态和每个虚拟机的状态:

    • 左侧的链接表示迁移失败、成功还是持续。它还会报告迁移成功、失败或被取消的虚拟机数量。
    • 右侧的链接会打开 Plan Details 页面的 Virtual Machines 选项卡。对于每个虚拟机,标签会显示以下数据:

      • 虚拟机的名称
      • 迁移的开始和结束时间
      • 复制的数据量
      • 虚拟机迁移的进度管道
  5. 可选: 要在迁移的运行时或完成后查看迁移的日志,请执行以下操作:

    1. Virtual Machines 标签页。
    2. 点击您要检查的虚拟机左侧的箭头(>)。

      此时会显示虚拟机的详情。

    3. 在 Pod link 列中的 Pods 部分,点 Logs 链接。

      Logs 选项卡将打开。

      注意

      日志并不总是可用。以下是日志不可用的常见原因:

      • 迁移是从 OpenShift Virtualization 迁移到 OpenShift Virtualization。在这种情况下,不涉及 virt-v2v,因此不需要 pod。
      • 没有创建 pod。
      • pod 已被删除。
      • 迁移在运行 pod 前失败。
    4. 要查看原始日志,请点 Raw 链接。
    5. 要下载日志,请点 Download 链接。

6.2.1. 迁移计划选项

在 Red Hat OpenShift web 控制台的 Plans for virtualization 页面中,点迁移计划旁边的 Options 菜单 kebab 访问以下选项:

  • 编辑计划 :编辑迁移计划的详细信息。如果计划正在运行或成功完成,则无法编辑以下选项:

    • Plan 详情页面的 Settings 部分的所有属性。例如,温或冷迁移、目标命名空间和保留的静态 IP。
    • 计划在 Mappings 选项卡上的映射。
    • Hook 选项卡上列出的 hook。
  • 开始迁移 :只有在相关时才活动。
  • 重启迁移 :重启中断的迁移。在选择此选项前,请确保没有错误消息。如果存在,您需要编辑计划。
  • cutover: 仅限 Warm 迁移。仅在相关时才激活。点 Cutover 打开 Cutover 窗口,它支持以下选项:

    • 设置 cutover :为 cutover 设置日期和时间。
    • 删除 cutover :取消调度的 cutover。仅在相关时才激活。
  • 重复计划 :创建一个与现有计划相同的虚拟机(VM)、参数、映射和 hook 的新迁移计划。您可以将此功能用于以下任务:

    • 将虚拟机迁移到不同的命名空间。
    • 编辑归档的迁移计划。
    • 编辑具有不同状态的迁移计划,如 failed、canceled、running、critical 或 ready。
  • archive Plan :删除迁移计划的日志、历史记录和元数据。计划不能编辑或重启。它只能查看、复制或删除。

    注意

    归档计划 不可逆。但是,您可以复制归档的计划。

  • 删除计划 :永久删除迁移计划。您不能删除正在运行的迁移计划。

    注意

    删除计划是 不可逆的。

    删除迁移计划不会删除临时资源。要删除临时资源,请在删除前先归档计划。

    注意

    归档的结果,然后删除迁移计划会根据您使用 CLI 或 UI 创建计划及其存储和网络映射而有所不同。

    • 如果您使用 UI 创建它们,则迁移计划及其映射不再出现在 UI 中。
    • 如果您使用 CLI 创建它们,则映射可能仍然出现在 UI 中。这是因为 CLI 中的映射可以被多个迁移计划使用,但 UI 中创建的映射只能在一个迁移计划中使用。

6.2.2. 取消迁移

您可以使用 Red Hat OpenShift web 控制台在迁移计划进行时取消部分或所有虚拟机(VM)的迁移。

流程

  1. 在 Red Hat OpenShift web 控制台中,单击 Plans for virtualization
  2. 点正在运行的迁移计划的名称查看迁移详情。
  3. 选择一个或多个虚拟机,点 Cancel
  4. Yes, cancel 确认取消。

    Migration details by VM 列表中,取消的虚拟机的状态为 Canceled。未迁移且迁移的虚拟机不受影响。

您可以通过点 Migration Plan 页的迁移计划旁的 Restart 重启迁移。

您可以使用 Red Hat OpenShift Virtualization 供应商作为源供应商,或作为目的地供应商。您可以使用命令行界面(CLI)从 OpenShift Virtualization 源供应商迁移。

注意

源供应商的 Red Hat OpenShift 集群版本必须是 4.16 或更高版本。

流程

  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: openshift
        createdForResourceType: providers
    type: Opaque
    stringData:
      token: <token> 
    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
    为具有 cluster-admin 权限的服务帐户指定令牌。如果 令牌和 url 都留空,则使用本地 OpenShift 集群。
    3
    指定用户密码。
    4
    指定 "true" 以跳过证书验证,并指定 "false" 来验证证书。如果没有指定,则默认为 "false "。跳过证书验证会进行不安全的迁移,然后不需要证书。不安全的迁移意味着传输的数据通过安全连接发送,并可能会公开敏感数据。
    5
    如果没有设置此字段并禁用 跳过证书验证 时,MTV 会尝试使用系统 CA。
    6
    指定 API 服务器的端点的 URL。
  1. 为源供应商创建 Provider 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Provider
    metadata:
      name: <source_provider>
      namespace: <namespace>
    spec:
      type: openshift
      url: <api_end_point> 
    1
    
      secret:
        name: <secret> 
    2
    
        namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定 API 服务器的端点的 URL。
    2
    指定供应商 Secret CR 的名称。
  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:
            name: <network_name>
            type: pod
        - destination:
            name: <network_attachment_definition> 
    2
    
            namespace: <network_attachment_definition_namespace> 
    3
    
            type: multus
          source:
            name: <network_attachment_definition>
            namespace: <network_attachment_definition_namespace>
            type: multus
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值是 pod忽略multus
    2
    指定网络名称。当 类型为 multus 时,使用 OpenShift Virtualization 网络附加定义名称。
    3
    仅在 类型 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:
            name: <storage_class>
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值有 ReadWriteOnceReadWriteMany
  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:
      provider:
        source:
          name: <source_provider>
          namespace: <namespace>
        destination:
          name: <destination_provider>
          namespace: <namespace>
      map: 
    2
    
        network: 
    3
    
          name: <network_map> 
    4
    
          namespace: <namespace>
        storage: 
    5
    
          name: <storage_map> 
    6
    
          namespace: <namespace>
      targetNamespace: <target_namespace>
      vms:
        - name: <source_vm>
          namespace: <namespace>
          hooks: 
    7
    
            - hook:
                namespace: <namespace>
                name: <hook> 
    8
    
              step: <step> 
    9
    
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定 Plan CR 的名称。
    2
    每个计划仅指定一个网络映射和一个存储映射。
    3
    指定网络映射,即使要迁移的虚拟机没有分配给网络。在这种情况下,映射可以为空。
    4
    指定 NetworkMap CR 的名称。
    5
    指定存储映射,即使要迁移的虚拟机没有使用磁盘镜像分配。在这种情况下,映射可以为空。
    6
    指定 StorageMap CR 的名称。
    7
    可选:为虚拟机指定最多两个 hook。每个 hook 必须在不同的迁移步骤中运行。
    8
    指定 Hook CR 的名称。
    9
    在迁移完成后,允许的值是 PreHook、在迁移计划启动前或 PostHook
  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

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

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

第 7 章 高级迁移选项

执行高级迁移操作,如更改温迁移的预复制快照间隔、创建自定义规则进行验证,或在迁移计划中添加 hook。

7.1. 为 warm 迁移更改预复制间隔

您可以通过修补 ForkliftController 自定义资源(CR)来更改快照间隔。

流程

  • ForkliftController CR 进行补丁:

    $ oc patch forkliftcontroller/<forklift-controller> -n openshift-mtv -p '{"spec": {"controller_precopy_interval": <60>}}' --type=merge 
    1
    Copy to Clipboard Toggle word wrap
    1
    以分钟为单位指定 precopy 间隔。默认值为 60

    您不需要重启 forklift-controller pod。

7.2. 为 Validation 服务创建自定义规则

Validation 服务使用 Open Policy Agent(OPA)策略规则来检查要迁移的每个虚拟机(VM)的适用性。Validation 服务为每个虚拟机生成 问题 列表,它们作为虚拟机属性存储在 Provider Inventory 服务中。Web 控制台显示供应商清单中的每个虚拟机的顾虑。

您可以创建自定义规则来扩展 Validation 服务的默认规则集。例如,您可以创建一个规则来检查虚拟机是否有多个磁盘。

7.2.1. 关于 Rego 文件

验证规则使用 Rego 编写,即 Open Policy Agent (OPA) 原生查询语言。规则作为 .rego 文件存储在 Validation pod 的 /usr/share/opa/policies/io/konveyor/forklift/<provider> 目录中。

每个验证规则都在单独的 .rego 文件中定义,以及对特定条件的测试。如果条件评估为 true,则该规则会将 {"category", "label", "assessment"} hash 添加到 concerns 中。concerns 内容将添加到虚拟机清单记录中的 concerns 键中。Web 控制台显示供应商清单中每个虚拟机的 concerns 键的内容。

以下 .rego 文件示例检查在 VMware 虚拟机的集群中启用了分布式资源调度:

drs_enabled.rego 示例

package io.konveyor.forklift.vmware 
1


has_drs_enabled {
    input.host.cluster.drsEnabled 
2

}

concerns[flag] {
    has_drs_enabled
    flag := {
        "category": "Information",
        "label": "VM running in a DRS-enabled cluster",
        "assessment": "Distributed resource scheduling is not currently supported by OpenShift Virtualization. The VM can be migrated but it will not have this feature in the target environment."
    }
}
Copy to Clipboard Toggle word wrap

1
每个验证规则都在软件包中定义。软件包命名空间是 io.konveyor.forklift.vmware(VMware)和 io.konveyor.forklift.ovirt(Red Hat Virtualization)。
2
查询参数基于 Validation 服务 JSON 的 input 键。

7.2.2. 检查默认验证规则

在创建自定义规则前,您必须检查 Validation 服务的默认规则,以确保您不会创建重新定义现有默认值的规则。

示例:如果默认规则包含行 default valid_input = false,并且您创建一个包含行 default valid_input = true,则 Validation 服务将不会启动。

流程

  1. 连接到 Validation pod 的终端:

    $ oc rsh <validation_pod>
    Copy to Clipboard Toggle word wrap
  2. 进入您的供应商的 OPA 策略目录:

    $ cd /usr/share/opa/policies/io/konveyor/forklift/<provider> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定 vmwareovirt
  3. 搜索默认策略:

    $ grep -R "default" *
    Copy to Clipboard Toggle word wrap

7.2.3. 创建验证规则

您可以通过将包含规则的配置映射自定义资源(CR)应用到 Validation 服务来创建验证规则。

重要
  • 如果您创建与现有规则相同的规则,Validation 服务将使用规则执行 OR 操作。
  • 如果您创建使用默认规则迭代的规则,则 Validation 服务将不会启动。

验证规则示例

验证规则基于由 Provider Inventory 服务收集的虚拟机(VM)属性。

例如,VMware API 使用此路径来检查 VMware 虚拟机是否配置了 NUMA 节点关联性:MOR:VirtualMachine.config.extraConfig["numa.nodeAffinity"]

Provider Inventory 服务使用列表值简化了此配置并返回一个可测试属性:

"numaNodeAffinity": [
    "0",
    "1"
],
Copy to Clipboard Toggle word wrap

您可以根据此属性创建一个 Rego 查询,并将其添加到 forklift-validation-config 配置映射中:

`count(input.numaNodeAffinity) != 0`
Copy to Clipboard Toggle word wrap

流程

  1. 根据以下示例创建配置映射 CR:

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: <forklift-validation-config>
      namespace: openshift-mtv
    data:
      vmware_multiple_disks.rego: |-
        package <provider_package> 
    1
    
    
        has_multiple_disks { 
    2
    
          count(input.disks) > 1
        }
    
        concerns[flag] {
          has_multiple_disks 
    3
    
            flag := {
              "category": "<Information>", 
    4
    
              "label": "Multiple disks detected",
              "assessment": "Multiple disks detected on this VM."
            }
        }
    EOF
    Copy to Clipboard Toggle word wrap
    1
    指定供应商软件包名称。允许的值是 VMware 的 io.konveyor.forklift.vmwareio.konveyor.forklift.ovirt
    2
    指定 concerns 名称和 Rego 查询。
    3
    指定 concerns 名称和 flag 参数值。
    4
    允许的值是 Critical, Warning, 和 Information
  2. 通过将 forklift-controller 部署扩展到 0 来停止 Validation pod:

    $ oc scale -n openshift-mtv --replicas=0 deployment/forklift-controller
    Copy to Clipboard Toggle word wrap
  3. 通过将 forklift-controller 部署扩展到 1 来启动 Validation pod:

    $ oc scale -n openshift-mtv --replicas=1 deployment/forklift-controller
    Copy to Clipboard Toggle word wrap
  4. 检查 Validation pod 日志,以验证 pod 是否已启动:

    $ oc logs -f <validation_pod>
    Copy to Clipboard Toggle word wrap

    如果自定义规则与默认规则冲突,则 Validation pod 将不会启动。

  5. 删除源供应商:

    $ oc delete provider <provider> -n openshift-mtv
    Copy to Clipboard Toggle word wrap
  6. 添加源供应商以应用新规则:

    $ 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
    
      secret:
        name: <secret> 
    3
    
        namespace: openshift-mtv
    EOF
    Copy to Clipboard Toggle word wrap
    1
    允许的值有 ovirtvsphereopenstack
    2
    指定 API 端点 URL,例如 https://<vCenter_host>/sdk for vSphere, https://<engine_host>/ovirt-engine/api for RHV, 或 https://<identity_service>/v3 (OpenStack)。
    3
    指定供应商 Secret CR 的名称。

您必须在创建自定义规则后更新规则版本,以便 Inventory 服务检测到更改并验证虚拟机。

7.2.4. 更新清单规则版本

每次更新规则时,您必须更新 inventory 规则版本,以便 Provider Inventory 服务检测到更改并触发 Validation 服务。

规则版本记录在每个供应商的 rules_version.rego 文件中。

流程

  1. 检索当前的规则版本:

    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version 
    1
    Copy to Clipboard Toggle word wrap

    输出示例

    {
       "result": {
           "rules_version": 5
       }
    }
    Copy to Clipboard Toggle word wrap

  2. 连接到 Validation pod 的终端:

    $ oc rsh <validation_pod>
    Copy to Clipboard Toggle word wrap
  3. 更新 /usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.rego 文件中的规则版本。
  4. Validation pod 终端注销。
  5. 验证更新的规则版本:

    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version 
    1
    Copy to Clipboard Toggle word wrap

    输出示例

    {
       "result": {
           "rules_version": 6
       }
    }
    Copy to Clipboard Toggle word wrap

7.2.5. 检索库存服务 JSON

您可以通过向虚拟机发送一个 Inventory 服务查询来获取 Inventory 服务 JSON。输出中包含一个 "input" 键,其中包含由 Validation 服务规则查询的清单属性。

您可以根据 "input" 键中的任何属性(如 input.snapshot.kind )创建验证规则。

流程

  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. 触发 HTTP GET 请求(例如,使用 Curl):

    $ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers -k
    Copy to Clipboard Toggle word wrap
  5. 检索供应商的 UUID

    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider> -k 
    1
    Copy to Clipboard Toggle word wrap
    1 1 1
    供应商允许的值有 vsphereovirtopenstack
  6. 检索供应商的虚拟机:

    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/vms -k
    Copy to Clipboard Toggle word wrap
  7. 检索虚拟机的详情:

    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/workloads/<vm> -k
    Copy to Clipboard Toggle word wrap

    输出示例

    {
        "input": {
            "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/workloads/vm-431",
            "id": "vm-431",
            "parent": {
                "kind": "Folder",
                "id": "group-v22"
            },
            "revision": 1,
            "name": "iscsi-target",
            "revisionValidated": 1,
            "isTemplate": false,
            "networks": [
                {
                    "kind": "Network",
                    "id": "network-31"
                },
                {
                    "kind": "Network",
                    "id": "network-33"
                }
            ],
            "disks": [
                {
                    "key": 2000,
                    "file": "[iSCSI_Datastore] iscsi-target/iscsi-target-000001.vmdk",
                    "datastore": {
                        "kind": "Datastore",
                        "id": "datastore-63"
                    },
                    "capacity": 17179869184,
                    "shared": false,
                    "rdm": false
                },
                {
                    "key": 2001,
                    "file": "[iSCSI_Datastore] iscsi-target/iscsi-target_1-000001.vmdk",
                    "datastore": {
                        "kind": "Datastore",
                        "id": "datastore-63"
                    },
                    "capacity": 10737418240,
                    "shared": false,
                    "rdm": false
                }
            ],
            "concerns": [],
            "policyVersion": 5,
            "uuid": "42256329-8c3a-2a82-54fd-01d845a8bf49",
            "firmware": "bios",
            "powerState": "poweredOn",
            "connectionState": "connected",
            "snapshot": {
                "kind": "VirtualMachineSnapshot",
                "id": "snapshot-3034"
            },
            "changeTrackingEnabled": false,
            "cpuAffinity": [
                0,
                2
            ],
            "cpuHotAddEnabled": true,
            "cpuHotRemoveEnabled": false,
            "memoryHotAddEnabled": false,
            "faultToleranceEnabled": false,
            "cpuCount": 2,
            "coresPerSocket": 1,
            "memoryMB": 2048,
            "guestName": "Red Hat Enterprise Linux 7 (64-bit)",
            "balloonedMemory": 0,
            "ipAddress": "10.19.2.96",
            "storageUsed": 30436770129,
            "numaNodeAffinity": [
                "0",
                "1"
            ],
            "devices": [
                {
                    "kind": "RealUSBController"
                }
            ],
            "host": {
                "id": "host-29",
                "parent": {
                    "kind": "Cluster",
                    "id": "domain-c26"
                },
                "revision": 1,
                "name": "IP address or host name of the vCenter host or RHV Engine host",
                "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/hosts/host-29",
                "status": "green",
                "inMaintenance": false,
                "managementServerIp": "10.19.2.96",
                "thumbprint": <thumbprint>,
                "timezone": "UTC",
                "cpuSockets": 2,
                "cpuCores": 16,
                "productName": "VMware ESXi",
                "productVersion": "6.5.0",
                "networking": {
                    "pNICs": [
                        {
                            "key": "key-vim.host.PhysicalNic-vmnic0",
                            "linkSpeed": 10000
                        },
                        {
                            "key": "key-vim.host.PhysicalNic-vmnic1",
                            "linkSpeed": 10000
                        },
                        {
                            "key": "key-vim.host.PhysicalNic-vmnic2",
                            "linkSpeed": 10000
                        },
                        {
                            "key": "key-vim.host.PhysicalNic-vmnic3",
                            "linkSpeed": 10000
                        }
                    ],
                    "vNICs": [
                        {
                            "key": "key-vim.host.VirtualNic-vmk2",
                            "portGroup": "VM_Migration",
                            "dPortGroup": "",
                            "ipAddress": "192.168.79.13",
                            "subnetMask": "255.255.255.0",
                            "mtu": 9000
                        },
                        {
                            "key": "key-vim.host.VirtualNic-vmk0",
                            "portGroup": "Management Network",
                            "dPortGroup": "",
                            "ipAddress": "10.19.2.13",
                            "subnetMask": "255.255.255.128",
                            "mtu": 1500
                        },
                        {
                            "key": "key-vim.host.VirtualNic-vmk1",
                            "portGroup": "Storage Network",
                            "dPortGroup": "",
                            "ipAddress": "172.31.2.13",
                            "subnetMask": "255.255.0.0",
                            "mtu": 1500
                        },
                        {
                            "key": "key-vim.host.VirtualNic-vmk3",
                            "portGroup": "",
                            "dPortGroup": "dvportgroup-48",
                            "ipAddress": "192.168.61.13",
                            "subnetMask": "255.255.255.0",
                            "mtu": 1500
                        },
                        {
                            "key": "key-vim.host.VirtualNic-vmk4",
                            "portGroup": "VM_DHCP_Network",
                            "dPortGroup": "",
                            "ipAddress": "10.19.2.231",
                            "subnetMask": "255.255.255.128",
                            "mtu": 1500
                        }
                    ],
                    "portGroups": [
                        {
                            "key": "key-vim.host.PortGroup-VM Network",
                            "name": "VM Network",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
                        },
                        {
                            "key": "key-vim.host.PortGroup-Management Network",
                            "name": "Management Network",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
                        },
                        {
                            "key": "key-vim.host.PortGroup-VM_10G_Network",
                            "name": "VM_10G_Network",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
                        },
                        {
                            "key": "key-vim.host.PortGroup-VM_Storage",
                            "name": "VM_Storage",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
                        },
                        {
                            "key": "key-vim.host.PortGroup-VM_DHCP_Network",
                            "name": "VM_DHCP_Network",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
                        },
                        {
                            "key": "key-vim.host.PortGroup-Storage Network",
                            "name": "Storage Network",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
                        },
                        {
                            "key": "key-vim.host.PortGroup-VM_Isolated_67",
                            "name": "VM_Isolated_67",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
                        },
                        {
                            "key": "key-vim.host.PortGroup-VM_Migration",
                            "name": "VM_Migration",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
                        }
                    ],
                    "switches": [
                        {
                            "key": "key-vim.host.VirtualSwitch-vSwitch0",
                            "name": "vSwitch0",
                            "portGroups": [
                                "key-vim.host.PortGroup-VM Network",
                                "key-vim.host.PortGroup-Management Network"
                            ],
                            "pNICs": [
                                "key-vim.host.PhysicalNic-vmnic4"
                            ]
                        },
                        {
                            "key": "key-vim.host.VirtualSwitch-vSwitch1",
                            "name": "vSwitch1",
                            "portGroups": [
                                "key-vim.host.PortGroup-VM_10G_Network",
                                "key-vim.host.PortGroup-VM_Storage",
                                "key-vim.host.PortGroup-VM_DHCP_Network",
                                "key-vim.host.PortGroup-Storage Network"
                            ],
                            "pNICs": [
                                "key-vim.host.PhysicalNic-vmnic2",
                                "key-vim.host.PhysicalNic-vmnic0"
                            ]
                        },
                        {
                            "key": "key-vim.host.VirtualSwitch-vSwitch2",
                            "name": "vSwitch2",
                            "portGroups": [
                                "key-vim.host.PortGroup-VM_Isolated_67",
                                "key-vim.host.PortGroup-VM_Migration"
                            ],
                            "pNICs": [
                                "key-vim.host.PhysicalNic-vmnic3",
                                "key-vim.host.PhysicalNic-vmnic1"
                            ]
                        }
                    ]
                },
                "networks": [
                    {
                        "kind": "Network",
                        "id": "network-31"
                    },
                    {
                        "kind": "Network",
                        "id": "network-34"
                    },
                    {
                        "kind": "Network",
                        "id": "network-57"
                    },
                    {
                        "kind": "Network",
                        "id": "network-33"
                    },
                    {
                        "kind": "Network",
                        "id": "dvportgroup-47"
                    }
                ],
                "datastores": [
                    {
                        "kind": "Datastore",
                        "id": "datastore-35"
                    },
                    {
                        "kind": "Datastore",
                        "id": "datastore-63"
                    }
                ],
                "vms": null,
                "networkAdapters": [],
                "cluster": {
                    "id": "domain-c26",
                    "parent": {
                        "kind": "Folder",
                        "id": "group-h23"
                    },
                    "revision": 1,
                    "name": "mycluster",
                    "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/clusters/domain-c26",
                    "folder": "group-h23",
                    "networks": [
                        {
                            "kind": "Network",
                            "id": "network-31"
                        },
                        {
                            "kind": "Network",
                            "id": "network-34"
                        },
                        {
                            "kind": "Network",
                            "id": "network-57"
                        },
                        {
                            "kind": "Network",
                            "id": "network-33"
                        },
                        {
                            "kind": "Network",
                            "id": "dvportgroup-47"
                        }
                    ],
                    "datastores": [
                        {
                            "kind": "Datastore",
                            "id": "datastore-35"
                        },
                        {
                            "kind": "Datastore",
                            "id": "datastore-63"
                        }
                    ],
                    "hosts": [
                        {
                            "kind": "Host",
                            "id": "host-44"
                        },
                        {
                            "kind": "Host",
                            "id": "host-29"
                        }
                    ],
                    "dasEnabled": false,
                    "dasVms": [],
                    "drsEnabled": true,
                    "drsBehavior": "fullyAutomated",
                    "drsVms": [],
                    "datacenter": null
                }
            }
        }
    }
    Copy to Clipboard Toggle word wrap

7.3. 在 MTV 迁移计划中添加 hook

您可以在 Migration Toolkit for Virtualization (MTV)迁移计划中添加 hook,以便在迁移之前或之后在虚拟机上执行自动操作。

7.3.1. 关于 MTV 迁移计划的 hook

您可以在 Migration Toolkit for Virtualization (MTV)迁移计划中添加 hook,以便在迁移之前或之后在虚拟机上执行自动操作。

您可以使用 MTV CLI 或 MTV 用户界面在 Red Hat OpenShift web 控制台中为 Virtualization (MTV)迁移计划添加 hook。

  • 预迁移 hook 是 hook,可在位于供应商的虚拟机上执行操作。这会为迁移准备虚拟机。
  • 迁移后 hook 是在迁移到 OpenShift Virtualization 的虚拟机上执行操作的 hook。
7.3.1.1. 默认 hook 镜像

MTV hook 的默认 hook 镜像是 quay.io/kubev2v/hook-runner。镜像基于 Ansible Runner 镜像,并添加 python-openshift,以提供 Ansible Kubernetes 资源和最新的 oc 二进制文件。

7.3.1.2. hook 执行

作为迁移 hook 的一部分提供的 Ansible Playbook 作为 ConfigMap 挂载到 hook 容器中。hook 容器使用您选择的 ServiceAccountopenshift-mtv 命名空间中的所需集群中作为作业运行。

添加 hook 时,您必须指定 Hook CR 所在的命名空间、hook 的名称,以及 hook 是否为 pre-migration hook 或 post-migration hook。

重要

要让 hook 在虚拟机上运行,必须使用 SSH 启动虚拟机并可用。

下图显示了使用迁移 hook 的一般过程。具体步骤请参阅 使用 Red Hat OpenShift Web 控制台将迁移 hook 添加到迁移计划中,并使用 CLI 将迁移 hook 添加到迁移计划中

图 7.1. 在迁移计划中添加 hook

Process:

  1. 输入您的 Ansible hook 和凭证。

    1. 使用 UI 或 CLI 将 Ansible hook 镜像输入到 MTV 控制器。

      • 在 UI 中,指定 ansible-runner 并输入包含 hook 的 playbook.yml
      • 在 CLI 中,输入 hook 镜像,该镜像指定运行 hook 的 playbook。
    2. 如果您需要额外数据在 pod 中运行 playbook (如 SSH 数据),请创建一个包含虚拟机凭证的 Secret。Secret 不挂载到 pod,而是由 playbook 调用。

      注意

      此 Secret 与包含源供应商凭证的 Secret CR 不同。

  2. MTV 控制器创建 ConfigMap,其中包含:

    • workload.yml,其中包含有关虚拟机的信息。
    • playbook.yml,这是您要运行的原始字符串 playbook。
    • plan.yml,即 Plan CR。

      ConfigMap 包含虚拟机的名称,并指示 playbook 执行的操作。

  3. MTV 控制器会创建一个启动用户指定镜像的作业。

    1. ConfigMap 挂载到容器。

      Ansible hook 导入之前输入的用户的 Secret。

  4. 该作业运行迁移前 hook 或迁移后 hook,如下所示:

    1. 对于 pre-migration hook,作业会使用 SSH 登录到源供应商上的虚拟机,并运行 hook。
    2. 对于迁移后 hook,作业使用 SSH 登录到 OpenShift Virtualization 上的虚拟机,并运行 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 上运行的虚拟机:启用远程执行

其他资源

有关创建服务帐户的说明,请参阅 了解并创建服务帐户

流程

  1. 在 Red Hat OpenShift web 控制台中,点 Migration > Plans for virtualization,然后点击您要将 hook 添加到的迁移计划。
  2. Hook
  3. 对于 pre-migration hook,请执行以下步骤:

    1. Pre migration hook 部分中,将 Enable hook 开关切换为 Enable pre migration hook
    2. 输入 Hook 运行程序镜像。如果要指定 spec.playbook,则需要使用具有 ansible-runner 的镜像。
    3. 将 hook 粘贴到 Ansible playbook 文本框中的 YAML 文件。
  4. 对于迁移后 hook,请执行以下步骤:

    1. Post migration hook 中,切换 Enable hook 开关 启用后迁移 hook
    2. 输入 Hook 运行程序镜像。如果要指定 spec.playbook,则需要使用具有 ansible-runner 的镜像。
    3. 将 hook 粘贴到 Ansible playbook 文本框中的 YAML 文件。
  5. 在选项卡的顶部,单击 Update hook
  6. 在终端中,输入以下命令将每个 hook 与 Red Hat OpenShift 服务帐户关联:

    $ oc -n openshift-mtv patch hook <name_of_hook> \
      -p '{"spec":{"serviceAccount":"<service_account>"}}' --type merge
    Copy to Clipboard Toggle word wrap

以下迁移 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
Copy to Clipboard Toggle word wrap

7.3.3. 使用 CLI 在迁移计划中添加迁移 hook

您可以使用 Hook CR 使用 Migration Toolkit for Virtualization (MTV) CLI 将预迁移 hook 或迁移后 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 上运行的虚拟机:启用远程执行

其他资源

有关创建服务帐户的说明,请参阅 了解并创建服务帐户

流程

  1. 如果需要,为虚拟机创建一个具有 SSH 私钥的 Secret。

    1. 选择现有密钥或生成密钥对。
    2. 在虚拟机上安装公钥。
    3. 将 Secret 中的私钥编码为 base64。

      apiVersion: v1
      data:
        key: VGhpcyB3YXMgZ2Vu...
      kind: Secret
      metadata:
        name: ssh-credentials
        namespace: openshift-mtv
      type: Opaque
      Copy to Clipboard Toggle word wrap
  2. 通过串联一个文件并以 Base64 编码方式对 playbook 进行编码,例如:

    $ cat playbook.yml | base64 -w0
    Copy to Clipboard Toggle word wrap
  3. 创建 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
    Copy to Clipboard Toggle word wrap
    1
    (可选)Red Hat OpenShift 服务帐户。如果要操作集群的任何资源,则必须提供 serviceAccount
    2
    base64 编码的 Ansible Playbook.如果指定了 playbook,镜像 必须包含 ansible-runner
    注意

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

    注意

    要解码附加的 playbook,请使用自定义输出检索资源,并将其传送到 base64。例如:

    $ oc get -n konveyor-forklift hook playbook -o \
        go-template='{{ .spec.playbook }}' | base64 -d
    Copy to Clipboard Toggle word wrap
  4. 在迁移的 Plan CR 中,对于每个虚拟机,请在 CR 的末尾添加以下部分:

      vms:
        - id: <vm_id>
          hooks:
            - hook:
                namespace: <namespace>
                name: <name_of_hook>
              step: <type_of_hook> 
    1
    Copy to Clipboard Toggle word wrap
    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
Copy to Clipboard Toggle word wrap

7.3.4. 关于用户定义的网络

从 Migration Toolkit for Virtualization 2.10 开始,您可以使用用户定义的网络(UDN)作为所有供应商迁移的默认网络,但 OpenShift Virtualization 除外。通过这种灵活性,您可以更加一致地将虚拟机迁移到 OpenShift Virtualization。

MTV 已重新设计,可让您轻松地将虚拟机迁移到 UDN 命名空间。在 OpenShift Virtualization 中配置 UDN 后,您可以在迁移计划映射中将它指定为默认网络。MTV 现在可以将 UDN 与常规 pod 网络区分开。

您可以使用 Red Hat OpenShift Web 控制台或使用 MTV 命令行界面创建迁移计划。创建迁移计划的步骤已更新,以包含新功能。

您可以使用 Red Hat OpenShift Web 控制台或命令行界面(CLI)升级或卸载 Virtualization (MTV)。

8.1. 升级 Migration Toolkit for Virtualization

您可以使用 Red Hat OpenShift Web 控制台安装新版本,以升级 MTV Operator。

流程

  1. 在 Red Hat OpenShift web 控制台中,点 OperatorsInstalled OperatorsMigration Toolkit for Virtualization OperatorSubscription
  2. 将更新频道更改为正确的发行版本。

    请参阅 Red Hat OpenShift 文档中的更改更新频道。

  3. 确认 Upgrade statusUp to date 变为 Upgrade available。如果没有,重启 CatalogSource pod:

    1. 记录目录源,如 redhat-operators
    2. 在命令行中检索目录源 pod:

      $ oc get pod -n openshift-marketplace | grep <catalog_source>
      Copy to Clipboard Toggle word wrap
    3. 删除 Pod:

      $ oc delete pod -n openshift-marketplace <catalog_source_pod>
      Copy to Clipboard Toggle word wrap

      升级状态Up to date 改为 Upgrade available

      如果您在 Subscriptions 选项卡上将 Update approval 设置为 Automatic,则升级会自动启动。

  4. 如果您在 Subscriptions 标签页中将 Update approval 设置为 Manual,请批准升级。

    请参阅 Red Hat OpenShift 文档中的 手动批准待处理的升级

  5. 如果您要从 MTV 2.2 升级并定义了 VMware 源供应商,请添加 VDDK init 镜像来编辑 VMware 供应商。否则,更新会将任何 VMware 供应商的状态更改为 Critical。如需更多信息,请参阅 添加 VMSphere 源供应商
  6. 如果您在 MTV 2.2 中的 Red Hat OpenShift 目的地供应商中映射到 NFS,请编辑 NFS 存储配置文件中的 AccessModesVolumeMode 参数。否则,升级会使 NFS 映射无效。如需更多信息,请参阅自定义存储配置集

8.2. 使用 Red Hat OpenShift Web 控制台卸载 MTV

您可以使用 Red Hat OpenShift web 控制台卸载 Virtualization (MTV)。

先决条件

  • 您必须以具有 cluster-admin 权限的用户身份登录。

流程

  1. 在 Red Hat OpenShift web 控制台中,点 Operators > Installed Operators
  2. Migration Toolkit for Virtualization Operator

    Operator Details 页面在 Details 标签页中打开。

  3. ForkliftController 选项卡。
  4. 单击 Actions,再选择 Delete ForkLiftController

    这会打开确认窗口。

  5. 点击 Delete

    控制器已被删除。

  6. 打开 Details 选项卡。

    此时会出现 Create ForkliftController 按钮,而不是您删除的控制器。不需要点它。

  7. 在页面右上角,点 Actions 并选择 Uninstall Operator

    此时会打开确认窗口,显示任何操作对象实例。

  8. 要删除所有实例,请选中 Delete all operand instance for this operator 复选框。默认情况下清除复选框。

    重要

    如果 Operator 配置了非集群资源,则这些应用程序将继续运行,需要手动清理。

  9. Uninstall

    Installed Operators 页面将打开,并且 Migration Toolkit for Virtualization Operator 已从已安装的 Operator 列表中删除。

  10. Home > Overview
  11. 在页面的 Status 部分中,单击 Dynamic Plugins

    Dynamic Plugins 弹出将打开,将 forklift-console-plugin 列为失败的插件。如果 forklift-console-plugin 没有显示为失败的插件,请刷新 web 控制台。

  12. 单击 forklift-console-plugin

    ConsolePlugin 详情页面 会在 Details 选项卡中打开。

  13. 在页面的右上角,点 Actions,然后从列表中选择 Delete ConsolePlugin

    这会打开确认窗口。

  14. 点击 Delete

    该插件已从 Overview 页面上的 动态插件 列表中移除。如果插件仍然存在,重启 Overview 页面。

8.3. 从命令行卸载 MTV

您可以从命令行卸载 Migration Toolkit for Virtualization (MTV)。

注意

此操作不会删除 MTV Operator 管理的资源,包括自定义资源定义(CRD)和自定义资源(CR)。要在卸载 MTV Operator 后删除它们,您可能需要手动删除 MTV Operator CRD。

先决条件

  • 您必须以具有 cluster-admin 权限的用户身份登录。

流程

  1. 运行以下命令来删除 forklift 控制器:

    $ oc delete ForkliftController --all -n openshift-mtv
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来删除 MTV Operator 的订阅:

    $ oc get subscription -o name|grep 'mtv-operator'| xargs oc delete
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令,删除 MTV Operator 的 clusterserviceversion

    $ oc get clusterserviceversion -o name|grep 'mtv-operator'| xargs oc delete
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来删除插件控制台 CR:

    $ oc delete ConsolePlugin forklift-console-plugin
    Copy to Clipboard Toggle word wrap
  5. 可选:运行以下命令来删除自定义资源定义(CRD):

    oc get crd -o name | grep 'forklift.konveyor.io' | xargs oc delete
    Copy to Clipboard Toggle word wrap
  6. 可选:通过运行以下命令删除 MTV 项目来执行清理:

    oc delete project openshift-mtv
    Copy to Clipboard Toggle word wrap

第 9 章 迁移故障排除

对迁移问题进行故障排除,导航自定义资源(CR)、服务和工作流,并下载日志和 CR 以进行故障排除。

9.1. 错误消息

本节论述了错误消息以及如何解决它们。

9.1.1. 已达到温导入重试的限制

如果在 precopy 阶段一个 VMware 虚拟机 (VM) 已达到最大的改变的块跟踪(CBT)快照的数量 (28),则会在温迁移中会显 warm import retry limit reached 错误消息。

要解决这个问题,请从虚拟机中删除一些 CBT 快照并重启迁移计划。

9.1.2. 无法将磁盘镜像调整为所需的大小

迁移失败时会显示 Unable to resize disk image to required size 错误消息,因为目标供应商的虚拟机使用块存储上带有 EXT4 文件系统的持久性卷。出现这个问题的原因是 CDI 假设的默认开销没有完全包括根分区的保留位置。

要解决这个问题,将 CDI 中的文件系统开销增加到大于 10%。

9.2. 使用 must-gather 工具

您可以使用 must-gather 工具来收集 MTV 自定义资源 (CR) 的日志和信息。您必须将 must-gather 数据文件附加到所有客户问题单。

您可以使用过滤选项为特定命名空间、迁移计划或虚拟机 (VM) 收集数据。

注意

如果您在过滤的 must-gather 命令中指定不存在的资源,则不会创建存档文件。

先决条件

  • 您必须以具有 cluster-admin 角色的用户身份登录到 OpenShift Virtualization 集群。
  • 已安装 Red Hat OpenShift CLI (oc)

流程

  1. 进入要存储 must-gather 数据的目录。
  2. 运行 oc adm must-gather 命令:

    $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.10.0
    Copy to Clipboard Toggle word wrap

    数据被保存为 /must-gather/must-gather.tar.gz。您可以将此文件上传到红帽客户门户网站中的支持问题单中。

  3. 可选:使用以下选项运行 oc adm must-gather 命令来收集过滤的数据:

    • 命名空间:

      $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.10.0 \
        -- NS=<namespace> /usr/bin/targeted
      Copy to Clipboard Toggle word wrap
    • 迁移计划:

      $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.10.0 \
        -- PLAN=<migration_plan> /usr/bin/targeted
      Copy to Clipboard Toggle word wrap
    • 虚拟机:

      $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.10.0 \
        -- VM=<vm_id> NS=<namespace> /usr/bin/targeted 
      1
      Copy to Clipboard Toggle word wrap
      1
      指定在 Plan CR 中显示的 VM ID

9.3. MTV 自定义资源和服务

Migration Toolkit for Virtualization (MTV)作为 Red Hat OpenShift Operator 提供。它将创建和管理以下自定义资源 (CR) 和服务。

9.3.1. MTV 自定义资源

  • Provider CR 存储启用 MTV 连接到并与源和目标供应商交互的属性。
  • NetworkMapping CR 映射源供应商的网络。
  • StorageMapping CR 会映射源和目标供应商的存储。
  • Plan CR 包含具有相同迁移参数和相关网络和存储映射的虚拟机列表。
  • Migration CR 运行一个迁移计划。

    每个迁移计划只能有一个 Migration CR 可以在指定时间运行。您可以为单个 Plan CR 创建多个 Migration CR。

9.3.2. MTV 服务

  • Inventory 服务执行以下操作:

    • 连接到源和目标供应商。
    • 维护本地清单以进行映射和计划。
    • 存储虚拟机配置。
    • 如果检测到虚拟机配置更改,则运行 Validation 服务。
  • Validation 服务通过应用规则检查虚拟机是否适合迁移。
  • Migration Controller 服务编配迁移。

    当您创建迁移计划时,Migration Controller 服务会验证计划并添加状态标签。如果计划无法验证,计划状态为 Not ready,则计划无法用于执行迁移。如果计划通过验证,计划状态为 Ready,它可用于执行迁移。迁移成功后,Migration Controller 服务会将计划状态更改为 Completed

  • Populator Controller 服务使用 Volume Populators 编配磁盘传输。
  • Kubevirt ControllerContainerized Data Import(CDI)Controller 服务处理大多数技术操作。

9.4. 高级别迁移工作流

高级别工作流显示用户视图的迁移过程:

  1. 您可以创建一个源供应商、目标供应商、网络映射和存储映射。
  2. 您可以创建一个包含以下资源的 Plan 自定义资源(CR):

    • 源供应商
    • 目标供应商,如果目标集群上没有安装 MTV
    • 网络映射
    • 存储映射
    • 一个或多个虚拟机 (VM)
  3. 您可以通过创建一个引用 Plan CR 的 Migration CR 来运行迁移计划。

    如果出于某种原因无法迁移所有虚拟机,则可以为同一 Plan CR 创建多个 Migration CR,直到虚拟机迁移为止。

  4. 对于 Plan CR 中的每个虚拟机,Migration Controller 服务会在 Migration CR 中记录虚拟机迁移进度。
  5. Plan CR 中每个虚拟机的数据传输完成后,Migration Controller 服务会创建一个 VirtualMachine CR。

    当迁移所有虚拟机时,Migration Controller 服务会将 Plan CR 的状态更新为 Completed。每个源虚拟机的电源状态在迁移后会被维护。

9.4.1. 详细的迁移工作流

您可以使用详细的迁移工作流来排除迁移失败的问题。

工作流描述了以下步骤:

温迁移或迁移到远程 OpenShift 集群:

  1. 当您创建 Migration 自定义资源(CR)来运行迁移计划时,Migration Controller 服务会为每个源虚拟机磁盘创建一个 DataVolume CR。

    对于每个 VM 磁盘:

  2. Containerized Data Importer(CDI) 控制器服务根据 DataVolume CR 中指定的参数创建一个持久性卷声明 (PVC)。
  3. 如果 StorageClass 有动态置备程序,则 StorageClass 置备程序会动态置备持久性卷(PV)。
  4. CDI Controller 服务创建一个 importer pod。
  5. importer pod 将虚拟机磁盘流传输到 PV。

    虚拟机磁盘传输后:

  6. Migration Controller 服务会在从 VMware 导入时创建一个 转换 pod,并附加 PVC。

    conversion pod 运行 virt-v2v,它会在目标虚拟机的 PVC 中安装和配置设备驱动程序。

  7. Migration Controller 服务为每个源虚拟机(VM)创建一个 VirtualMachine CR,连接到 PVC。
  8. 如果虚拟机在源环境中运行,则虚拟机上的 Migration Controller 电源,KubeVirt Controller 服务会创建一个 virt-launcher pod 和 VirtualMachineInstance CR。

    virt-launcher pod 运行 QEMU-KVM,并附加了作为 VM 磁盘的 PVC。

从 RHV 或 OpenStack 冷迁移到本地 OpenShift 集群:

  1. 当您创建 Migration 自定义资源(CR)来运行迁移计划时,Migration Controller 服务为每个源虚拟机磁盘创建一个 PersistentVolumeClaim CR,当源是 RHV 时,一个 OvirtVolumePopulator,或源是 OpenStack 时的 OpenstackVolumePopulator CR。

    对于每个 VM 磁盘:

  2. Populator Controller 服务创建一个临时的持久性卷声明(PVC)。
  3. 如果 StorageClass 有动态置备程序,则 StorageClass 置备程序会动态置备持久性卷(PV)。

    • Migration Controller 服务创建一个 dummy pod 来绑定 所有 PVC。pod 的名称包含 pvcinit
  4. Populator Controller 服务创建一个 填充器 pod。
  5. 填充器 pod 将磁盘数据传输到 PV。

    虚拟机磁盘传输后:

  6. 临时 PVC 被删除,初始 PVC 指向带有数据的 PV。
  7. Migration Controller 服务为每个源虚拟机(VM)创建一个 VirtualMachine CR,连接到 PVC。
  8. 如果虚拟机在源环境中运行,则虚拟机上的 Migration Controller 电源,KubeVirt Controller 服务会创建一个 virt-launcher pod 和 VirtualMachineInstance CR。

    virt-launcher pod 运行 QEMU-KVM,并附加了作为 VM 磁盘的 PVC。

从 VMware 冷迁移到本地 OpenShift 集群:

  1. 当您创建 Migration 自定义资源(CR)来运行迁移计划时,Migration Controller 服务会为每个源虚拟机磁盘创建一个 DataVolume CR。

    对于每个 VM 磁盘:

  2. Containerized Data Importer (CDI) 控制器服务会根据 DataVolume CR 中指定的参数创建一个空白的持久性卷声明(PVC)。
  3. 如果 StorageClass 有动态置备程序,则 StorageClass 置备程序会动态置备持久性卷(PV)。

对于所有虚拟机磁盘:

  1. Migration Controller 服务创建一个 dummy pod 来绑定 所有 PVC。pod 的名称包含 pvcinit
  2. Migration Controller 服务为所有 PVC 创建一个 转换 pod。
  3. conversion pod 运行 virt-v2v,它将虚拟机转换为 KVM hypervisor,并将磁盘的数据传送到对应的 PV。

    虚拟机磁盘传输后:

  4. Migration Controller 服务为每个源虚拟机(VM)创建一个 VirtualMachine CR,连接到 PVC。
  5. 如果虚拟机在源环境中运行,则虚拟机上的 Migration Controller 电源,KubeVirt Controller 服务会创建一个 virt-launcher pod 和 VirtualMachineInstance CR。

    virt-launcher pod 运行 QEMU-KVM,并附加了作为 VM 磁盘的 PVC。

9.4.2. MTV 如何使用 virt-v2v 工具

Migration Toolkit for Virtualization (MTV)使用 virt-v2v 工具将虚拟机(VM)的磁盘镜像转换为与 OpenShift Virtualization 兼容的格式。该工具使迁移变得更加容易,因为它会自动执行使虚拟机使用 OpenShift Virtualization 所需的任务。例如,如果可能,在转换的虚拟机中启用半虚拟化 VirtIO 驱动程序并安装 QEMU 客户机代理。

virt-v2v 包括在 Red Hat Enterprise Linux (RHEL)版本 7 及更高版本中。

9.4.2.1. MTV 迁移中的 virt-v2v 的主要功能

在迁移过程中,MTV 使用 virt-v2v 收集有关虚拟机的元数据,对虚拟机磁盘进行必要的更改,并将包含虚拟机的磁盘复制到 OpenShift Virtualization。

virt-v2v 对虚拟机磁盘进行以下更改,以便为迁移准备它们:

  • 附加组件:

    • VirtIO 驱动程序注入,如网络或磁盘驱动程序。
    • 准备特定于 hypervisor 的工具或代理,如 QEMU 客户机代理安装。
    • 修改引导配置,如更新的引导装载程序或引导条目。
  • 删除:

    • 不必要的或以前的特定于管理程序的文件,如 VMware 工具或 VirtualBox 添加。
    • 旧的网络驱动程序配置,例如删除 VMware 特定的 NIC 驱动程序。
    • 与目标系统不兼容的配置设置,如旧的引导设置。

如果您要从 VMware 或从开放虚拟设备(OVA)文件迁移,virt-v2v 还会在迁移期间或迁移后首次重启虚拟机期间设置其 IP 地址。

注意

您还可以使用 MTV 迁移前或之后运行预定义的 Ansible hook。如需更多信息,请参阅 在 MTV 迁移计划中添加 hook

这些 hook 不一定使用 virt-v2v

9.4.2.2. 自定义、删除和安装文件

MTV 使用 virt-v2v 在转换过程中执行额外的客户机自定义,比如以下操作:

  • 自定义以保留 IP 地址
  • 自定义以保留驱动器符
注意

对于基于 Red Hat Enterprise Linux (RHEL)的客户机,virt-v2v 会尝试从 Red Hat registry 安装客户机代理。如果迁移在分离的环境中运行,安装程序会失败,您必须使用 hook 或其他自动化来安装客户机代理。

如需更多信息,请参阅 man 参考页面:

9.4.2.3. 权限和 virt-v2v

virt-v2v 不需要客户端操作系统本身的权限或访问凭证,因为 virt-v2v 不会针对正在运行的虚拟机运行,而只针对虚拟机的磁盘运行。

9.5. 收集日志和自定义资源信息

您可以使用 Red Hat OpenShift Web 控制台或命令行界面(CLI)为以下目标下载日志和自定义资源(CR) yaml 文件:

  • 迁移计划:Web 控制台或 CLI。
  • 虚拟机:Web 控制台或 CLI.
  • 命名空间:仅限 CLI。

must-gather 工具会在存档文件中收集以下日志和 CR 文件:

  • CR:

    • DataVolume CR:代表在迁移的虚拟机中挂载的磁盘。
    • VirtualMachine CR:代表一个迁移的虚拟机。
    • Plan CR:定义 VM 和存储和网络映射。
    • Job CR:可选:代表迁移前 hook、迁移后 hook 或两者。
  • 日志:

    • Importer pod: Disk-to-data-volume 转换日志。importer pod 的命名格式是 importer-<migration_plan>-<vm_id><5_char_id>,例如 importer-mig-plan-ed90dfc6-9a17-4a8btnfh,其中 ed90dfc6-9a17-4a8 是经过裁剪的 RHV VM ID,btnfh 是生成的 5 个字符的 ID。
    • conversion pod:虚拟机转换日志.conversion pod 运行 virt-v2v,它会在虚拟机的 PVC 中安装和配置设备驱动程序。conversion pod 的命名格式是 <migration_plan>-<vm_id><5_char_id>
    • virt-launcher pod:VM launcher 日志.当迁移的虚拟机被开启后,virt-launcher Pod 运行 QEMU-KVM,并附加了作为虚拟机磁盘的 PVC。
    • forklift-controller pod:针对 must-gather 命令指定的迁移计划、虚拟机或命名空间过滤日志。
    • forklift-must-gather-api pod:日志针对 must-gather 命令指定的迁移计划、虚拟机或命名空间过滤。
    • hook-job pod:针对 hook 任务过滤日志。hook-job 命名约定是 < migration_plan>-<vm_id><5_char_id >,例如 plan2j-vm-3696-posthook-4mx85plan2j-vm-3696-prehook-mwqnl

      注意

      must-gather 归档文件中不包含空的或排除的日志文件。

VMware 迁移计划的 must-gather 归档结构示例

must-gather
└── namespaces
    ├── target-vm-ns
    │   ├── crs
    │   │   ├── datavolume
    │   │   │   ├── mig-plan-vm-7595-tkhdz.yaml
    │   │   │   ├── mig-plan-vm-7595-5qvqp.yaml
    │   │   │   └── mig-plan-vm-8325-xccfw.yaml
    │   │   └── virtualmachine
    │   │       ├── test-test-rhel8-2disks2nics.yaml
    │   │       └── test-x2019.yaml
    │   └── logs
    │       ├── importer-mig-plan-vm-7595-tkhdz
    │       │   └── current.log
    │       ├── importer-mig-plan-vm-7595-5qvqp
    │       │   └── current.log
    │       ├── importer-mig-plan-vm-8325-xccfw
    │       │   └── current.log
    │       ├── mig-plan-vm-7595-4glzd
    │       │   └── current.log
    │       └── mig-plan-vm-8325-4zw49
    │           └── current.log
    └── openshift-mtv
        ├── crs
        │   └── plan
        │       └── mig-plan-cold.yaml
        └── logs
            ├── forklift-controller-67656d574-w74md
            │   └── current.log
            └── forklift-must-gather-api-89fc7f4b6-hlwb6
                └── current.log
Copy to Clipboard Toggle word wrap

您可以从 Red Hat OpenShift web 控制台下载有关已完成的、失败或取消迁移计划的自定义资源(VM)的日志和信息。

流程

  1. 在 Red Hat OpenShift web 控制台中,点 MigrationPlans for virtualization
  2. 点迁移计划名称旁的 Get logs
  3. Get logs 窗口中点 Get logs

    日志会被收集。此时会显示 Log collection complete 信息。

  4. Download logs 下载存档文件。
  5. 要下载迁移的虚拟机的日志,请点迁移计划名称,然后点 VM 的 Get logs

9.5.2. 从命令行访问日志和自定义资源信息

您可以使用 must-gather 工具从命令行访问自定义资源(CR)的日志和信息。您必须将 must-gather 数据文件附加到所有客户问题单。

您可以使用过滤选项收集特定命名空间、完成、失败或取消迁移的虚拟机(VM)的数据。

注意

如果您在过滤的 must-gather 命令中指定不存在的资源,则不会创建存档文件。

先决条件

  • 您必须以具有 cluster-admin 角色的用户身份登录到 OpenShift Virtualization 集群。
  • 已安装 Red Hat OpenShift CLI (oc)

流程

  1. 进入要存储 must-gather 数据的目录。
  2. 运行 oc adm must-gather 命令:

    $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.10.0
    Copy to Clipboard Toggle word wrap

    数据被保存为 /must-gather/must-gather.tar.gz。您可以将此文件上传到红帽客户门户网站中的支持问题单中。

  3. 可选:使用以下选项运行 oc adm must-gather 命令来收集过滤的数据:

    • 命名空间:

      $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.10.0 \
        -- NS=<namespace> /usr/bin/targeted
      Copy to Clipboard Toggle word wrap
    • 迁移计划:

      $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.10.0 \
        -- PLAN=<migration_plan> /usr/bin/targeted
      Copy to Clipboard Toggle word wrap
    • 虚拟机:

      $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.10.0 \
        -- VM=<vm_name> NS=<namespace> /usr/bin/targeted 
      1
      Copy to Clipboard Toggle word wrap
      1
      您必须指定虚拟机名称,而不是虚拟机 ID,因为它出现在 Plan CR 中。

第 10 章 MTV 性能建议

检查网络和存储性能、冷和温迁移以及多个迁移或单个迁移的建议。

10.1. MTV 性能建议

本节的目的是根据在测试过程中观察到的发现,使用 Migration Toolkit for Virtualization (MTV)共享虚拟机(VM)的建议。

此处提供的数据是从红帽实验室测试中收集而来的,仅供参考。 

总体而言,这些数字应该考虑显示最佳情况情况。

观察到的迁移性能可能与这些结果不同,这取决于几个因素。

10.1.1. 确保快速存储和网络速度

确保 VMware 和 Red Hat OpenShift (OCP)环境的快速存储和网络速度。

  • 要执行快速迁移,VMware 必须有对数据存储的快速读取访问权限。VMware ESXi 主机之间的网络应该很快,确保 10 GiB 网络连接,并避免网络瓶颈。

    • 将 VMware 网络扩展到 OCP Workers Interface 网络环境。
    • 确保 VMware 网络提供高吞吐量(10 千兆位以太网)和快速网络以确保接收率与 ESXi 数据存储的读取率一致。
    • 请注意,迁移过程使用显著的网络带宽,并且使用迁移网络。如果其他服务使用该网络,它可能会影响这些服务及其迁移率。
    • 例如,200 到 325 MiB/s 是与将数据传输到 OCP 接口的每个 ESXi 主机的 vmnic 的平均网络传输率。

数据存储会读取总传输时间,因此务必要确保从 ESXi 数据存储到 ESXi 主机可以快速读取。  

number: 200 到 300 MiB/s 示例是单个 ESXi 服务器的 vSphere 和 ESXi 端点的平均读取率。当使用多个 ESXi 服务器时,可能会提高数据存储读取率。

10.1.3. 端点类型 

MTV 2.6 允许以下 vSphere 供应商选项:

  • ESXi 端点(来自 ESXi 的清单和磁盘传输),在 MTV 2.6 中引入
  • vCenter Server 端点;没有 ESXi 主机的网络(清单和从 vCenter 传输)
  • vCenter 端点和 ESXi 网络可用(来自 vCenter 的清单、来自 ESXi 的磁盘传输)。

在传输很多注册到多个 ESXi 主机的虚拟机时,建议使用 vCenter 端点和 ESXi 网络。

注意

从 vSphere 7.0 开始,ESXi 主机可以标记要用于 Network Block Device (NBD)传输的网络。这可以通过使用适当的 vSphereBackupNFC 标签标记所需的虚拟网络接口卡(NIC)来实现。完成后,MTV 可以使用 ESXi 接口进行网络传输至 OpenShift,只要 worker 和 ESXi 主机接口可被访问。当迁移用户可能无法访问 ESXi 凭证时,这特别有用,但希望控制哪个 ESXi 接口用于迁移。 

如需了解更多详细信息,请参阅: (MTV-1230)

您可以使用以下 ESXi 命令,该命令为 NBD 备份指定接口 vmk2

esxcli network ip interface tag add -t vSphereBackupNFC -i vmk2
Copy to Clipboard Toggle word wrap

在可能的情况下,确保使用与最大性能相关的 BIOS 配置集设置用于执行迁移的主机。使用 vSphere 中控制的主机应该检查是否设置了 高性能

测试显示,当传输设置了 BIOS 和主机电源管理集的 10 个虚拟机时,迁移在平均数据存储的读速率中增加了 15 MiB。

10.1.5. 避免 VMware 网络上的额外网络负载

在使用 ESXi 端点时,您可以选择迁移网络来减少 VMware 网络上的网络负载。

通过合并虚拟化供应商,MTV 可以选择可在 ESXi 主机上访问的特定网络,以将虚拟机迁移到 OpenShift。从 MTV UI 中的 ESXi 主机选择此迁移网络可确保使用所选网络作为 ESXi 端点来执行传输。

您必须确保所选网络与 OCP 接口的连接,有足够的带宽用于迁移,并且网络接口没有饱和。

在具有快速网络(如 10GbE 网络)的环境中,可能会预期迁移网络影响以匹配 ESXi 数据存储读取的速度。

10.1.6. 每个 ESXi 主机控制最大并发磁盘迁移

设置 MAX_VM_INFLIGHT MTV 变量,以控制 ESXi 主机允许的最大并发虚拟机传输数量。 

MTV 允许使用此变量控制并发性 ; 默认情况下,它被设置为 20。

当设置 MAX_VM_INFLIGHT 时,请考虑 ESXi 主机需要最大并发虚拟机传输的数量。 务必要考虑同时传输的迁移类型。温迁移,由迁移将在计划时间迁移的正在运行的虚拟机定义。

温迁移使用快照来比较和迁移之前磁盘快照之间的区别。在最终运行的虚拟机到 OpenShift 之前,快照之间差异的迁移会随特定间隔进行。 

在 MTV 2.6 中,MAX_VM_INFLIGHT 保留每个虚拟机的一个传输插槽,无论特定快照的当前迁移活动或属于单个虚拟机的磁盘数量。 由 MAX_VM_INFLIGHT 设置的总用于指示允许每个 ESXi 主机的并发虚拟机 tranfers 数。

Example

  • MAX_VM_INFLIGHT = 20 和 2 ESXi 主机在提供程序中定义的 20 和 2 ESXi 主机意味着每个主机都可以传输 20 个虚拟机。

当迁移特定 ESXi 主机的多个虚拟机时,为多个虚拟机启动并发迁移会导致更快地迁移。 

测试演示:从单一主机迁移 10 个虚拟机(每个包含 35 GiB 数据,总大小为 50 GiB)比按顺序迁移相同数量的虚拟机要快得多。 

可以从单个主机增加并发迁移到 10 多台虚拟机,但其显示没有显著改进。 

例子

  • 1 个磁盘虚拟机需要 6 分钟,迁移率为 100 MiB/s
  • 10 个磁盘虚拟机需要 22 分钟,迁移率为 272 MiB/s
  • 20 个单一磁盘虚拟机需要 42 分钟,迁移率为 284 MiB/s
注意

从上述示例中,很明显地迁移 10 个虚拟机的速度比按顺序迁移同一虚拟机的迁移速度要快三倍。

当同时移动 10 或 20 个虚拟机时,迁移率几乎相同。

10.1.8. 使用多个主机更快地迁移

使用带有注册虚拟机的多个主机在用于迁移的 ESXi 主机中平均分布,从而可以更快地迁移时间。

测试显示,在传输超过 10 个磁盘 VMS 时,每个磁盘 VMS 都包含超过 50G 的总数据,使用额外的主机可减少迁移时间。

例子

  • 80 个磁盘虚拟机,包括每个 35 GiB 数据,使用单个主机需要 2 小时和 43 分钟,迁移率为 294 MiB/s。
  • 80 个磁盘虚拟机,包括每个 35 GiB 数据,使用 8 ESXi 主机需要 41 分钟,迁移率为 1,173 MiB/s。
注意

从上述示例中,从 8 个 ESXi 主机迁移 80 个虚拟机(10 个从每个主机)迁移 80 个虚拟机的速度比从单个 ESXi 主机运行相同的虚拟机速度要快四倍。 

同时迁移大量虚拟机,同时从 8 个 ESXi 主机中迁移可能会提高性能。但是,它没有被测试,因此不推荐这样做。

单个迁移计划可以引用的最大磁盘数为 500。如需了解更多详细信息,请参阅 (MTV-1203)。 

当尝试在单个迁移计划中迁移许多虚拟机时,所有迁移可能需要一些时间才能启动。 通过将一个迁移计划分成多个迁移计划,可以同时启动它们。

比较以下迁移:

  • 1 计划中的 500 个使用 8 ESXi 主机的虚拟机,max_vm_inflight=100,需要 5 小时和 10 分钟。
  • 使用 8 个计划中的 8 个 ESXi 主机( max_vm_inflight=100 )需要 57 分钟。

测试显示,通过将单个大计划分成多个中等规模的计划,例如,每个计划使用 100 个虚拟机,可以减少总迁移时间。

10.1.10. 为冷迁移测试的最大值

  • 测试的 ESXi 主机的最大数量:8
  • 单个迁移计划中的最大虚拟机数量:500
  • 单个测试中迁移的虚拟机的最大数量: 5000
  • 同时执行的迁移计划的最大数量: 40
  • 最大单个磁盘大小迁移:6 TB 磁盘,其中包括 3TB 数据
  • 单个虚拟机上迁移的最大磁盘数: 50
  • 最高观察到的单个数据存储从单个 ESXi 服务器读取率: 312 MiB/second
  • 使用八个 ESXi 服务器和两个数据存储的读率最高观察到的多数据存储:1,242 MiB/second
  • 最高观察到的虚拟 NIC 传输率到 OpenShift worker: 327 MiB/second
  • 单个磁盘的最大迁移传输率:162 MiB/秒(在传输非并发迁移 1.5 TB 数据时观察到)
  • 来自单个 ESXi 主机的最大冷迁移传输率(单一磁盘):294 MiB/s (并发迁移 30 个虚拟机,使用 35/50 GiB,来自 Single ESXi)
  • 来自多个 ESXi 主机的最大冷迁移传输率(单个磁盘):1173MB/s (并发迁移 80 个虚拟机,使用 35/50 GiB,从 8 ESXi 服务器,每个 ESXi 中的 10 个虚拟机)

10.1.11. 温迁移建议

以下建议特定于温迁移:

  • 并行迁移到 400 个磁盘

测试涉及并行迁移 200 个虚拟机,每 2 个磁盘使用 8 ESXi 主机,共 400 个磁盘。在迁移计划中不会并行迁移超过 400 个磁盘的测试,因此不建议并行迁移超过这个数量的磁盘。

  • 为最快的速度并行迁移最多 200 个磁盘

测试成功在具有 200、300 和 400 磁盘的并行磁盘迁移上执行。在测试迁移 200 个磁盘和迁移 300 和 400 磁盘时,预复制迁移率大约有 25%。

因此,建议以 200 个或更少形式执行并行磁盘迁移,而不是 300 到 400 个磁盘,除非前复制速度减少 25% 不会影响您的截止计划。

  • 在可能的情况下,设置在迁移计划启动后马上设置截止时间

要减少温迁移的整体时间,建议在迁移计划启动后立即进行 cutover。这会导致 MTV 每个虚拟机 只运行一个 precopy。这个建议是有效的,无论迁移计划中的虚拟机数量如何。

  • 在快照之间增加预复制间隔

如果您要使用单个虚拟机创建多个迁移计划,并在迁移开始和剪切之间有足够的时间,将 controller_precopy_interval 参数的值增加到 120 到 240 分钟(含)。较长的设置将在剪切前减少每个虚拟机的快照和磁盘传输总数。

10.1.12. 为 warm 迁移测试的最大值

  • 测试的 ESXi 主机的最大数量:8
  • worker 节点的最大数量:12
  • 单个迁移计划中的最大虚拟机数量:200
  • 并行磁盘传输的最大数量:400,200 个虚拟机,6 ESXis,传输率为 667 MB/s
  • 最大单个磁盘大小迁移:6 TB 磁盘,其中包括 3TB 数据
  • 单一虚拟机中迁移的最大磁盘数: 3
  • 每个 ESXi 主机的最大并行磁盘传输数:68
  • 在没有并发迁移的情况下观察到单个磁盘的最大传输率:76.5 MB/s
  • 从一个 ESXi 主机观察到多个磁盘的最大传输率: 253 MB/s (并发迁移 10 个虚拟机,每个磁盘 1 个磁盘,每个磁盘使用 35/50 GiB)
  • 观察到多个磁盘的总传输率(8 ESXi 主机:802 MB/s (并发迁移 70 个虚拟机,每个磁盘有 3 个磁盘,每个磁盘使用 35/50 GiB)

10.1.13. 迁移带有大量磁盘的虚拟机的建议

建议为每个独立磁盘使用 1 TB 或更高磁盘上的数据的虚拟机:

  • 调度适当的维护窗口,以迁移大型磁盘虚拟机(VM)。这种迁移是敏感的操作,可能需要仔细规划维护窗口和停机时间,特别是在较低存储和网络活动期间。
  • 检查在那些大型虚拟机(VM)迁移过程中没有运行其他迁移活动或其他大量网络或存储活动。您应该将这些大型虚拟机迁移视为特殊情况。在这些迁移过程中,请优先选择 MTV 活动。计划在这些虚拟机上有较少的活动和相关数据存储时,将这些虚拟机迁移到一个时间。
  • 对于具有高 churn 率的大型虚拟机,这意味着数据在快照之间经常更改,请考虑从默认减少 warm 迁移 controller_precopy_interval,即 60 分钟。 确保在调度切换前至少 24 小时启动此过程,以便允许多个成功的 precopy 快照完成。 在调度 cutover 时,请确保维护窗口允许有足够的时间复制更改的最后一个快照,并且剪切过程从该维护窗口开始。
  • 对于非常大的单磁盘虚拟机,在一些停机时间时,请选择冷迁移,而不是温迁移,特别是在大型虚拟机快照时。
  • 考虑将特定的大型磁盘中的数据分割为多个磁盘,在使用温迁移时启用 MTV 的并行磁盘迁移。
  • 如果您有大型数据库磁盘,持续写入大量数据,如果无法停机和虚拟机快照,则可能需要考虑数据库数据的特定复制选项,以便在 MTV 之外以这些特定迁移为目标。如果适用此案例,请查阅您的数据库特定选项。

当您使用 Migration Toolkit for Virtualization (MTV)同步输入/输出(AIO)缓冲时,您可以更改 Network Block Device (NBD)传输网络文件复制(NFC)参数来提高迁移性能。

警告

使用 AIO 缓冲仅适用于冷迁移用例。

在初始化温迁移前禁用 AIO 设置。如需了解更多详细信息,请参阅禁用 AIO 缓冲配置

10.1.14.1. 密钥发现
  • 通过在带有以下值的单一 ESXi 主机上迁移多个(10)虚拟机(VM)来实现最佳迁移性能:

    • VixDiskLib.nfcAio.Session.BufSizeIn64KB=16
    • vixDiskLib.nfcAio.Session.BufCount=4
  • 在使用 AIO 缓冲设置时请注意以下改进(同步缓冲数):

    • 迁移时间缩短为 31.1%,从 0:24:32 缩短为 0:16:54。
    • 读取率从 347.83 MB/s 增加到 504.93 MB/s。
  • 在单一虚拟机上使用 AIO 缓冲设置时,无法显著改进。
  • 当使用来自多个主机的多个虚拟机的 AIO 缓冲设置时,无法显著改进。

支持基于使用以下版本执行的测试:

  • vSphere 7.0.3
  • VDDK 7.0.3

10.1.15. 启用并配置 AIO 缓冲

您可以启用并配置与 Migration Toolkit for Virtualization (MTV)的同步输入/输出(AIO)缓冲。

流程

  1. 确保 openshift-mtv 命名空间中的 forklift-controller pod 支持 AIO 缓冲值。由于 pod 名称前缀是动态的,因此运行以下命令来检查 pod 名称:

    oc get pods -n openshift-mtv | grep forklift-controller | awk '{print $1}'
    Copy to Clipboard Toggle word wrap

    例如,如果 pod 名称前缀为 "forklift-controller-667f57c8f8-qllnx",则输出为:

    forklift-controller-667f57c8f8-qllnx
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,检查 pod 的环境变量:

    oc get pod forklift-controller-667f57c8f8-qllnx -n openshift-mtv -o yaml
    Copy to Clipboard Toggle word wrap
  3. 检查输出中的以下行:

    ...
    \- name: VIRT\_V2V\_EXTRA\_ARGS
    \- name: VIRT\_V2V\_EXTRA\_CONF\_CONFIG\_MAP
    ...
    Copy to Clipboard Toggle word wrap
  4. openshift-mtv 命名空间中,执行以下步骤来编辑 ForkliftController 自定义资源(CR):

    1. 运行以下命令,访问 ForkliftController CR 进行编辑:

      oc edit forkliftcontroller -n openshift-mtv
      Copy to Clipboard Toggle word wrap
    2. ForkliftController CR 的 spec 部分添加以下行:

      virt_v2v_extra_args: "--vddk-config /mnt/extra-v2v-conf/input.conf"
      virt_v2v_extra_conf_config_map: "perf"
      Copy to Clipboard Toggle word wrap
  5. 运行以下命令来创建所需的配置映射 perf

    oc -n openshift-mtv create cm perf
    Copy to Clipboard Toggle word wrap
  6. 将所需的缓冲区配置值转换为 Base64。例如,对于 16/4,运行以下命令:

    echo -e "VixDiskLib.nfcAio.Session.BufSizeIn64KB=16\nvixDiskLib.nfcAio.Session.BufCount=4" | base64
    Copy to Clipboard Toggle word wrap

    输出结果类似如下:

    Vml4RGlza0xpYi5uZmNBaW8uU2Vzc2lvbi5CdWZTaXplSW42NEtCPTE2CnZpeERpc2tMaWIubmZjQWlvLlNlc3Npb24uQnVmQ291bnQ9NAo=
    Copy to Clipboard Toggle word wrap
  7. 在配置映射 perf 中,在 binaryData 部分中输入 Base64 字符串,例如:

    apiVersion: v1
    kind: ConfigMap
    binaryData:
      input.conf: Vml4RGlza0xpYi5uZmNBaW8uU2Vzc2lvbi5CdWZTaXplSW42NEtCPTE2CnZpeERpc2tMaWIubmZjQWlvLlNlc3Npb24uQnVmQ291bnQ9NAo=
    metadata:
      name: perf
      namespace: openshift-mtv
    Copy to Clipboard Toggle word wrap
  8. 重启 forklift-controller pod 以应用新配置。
  9. 确保 VIRT_V2V_EXTRA_ARGS 环境变量反映了更新的设置。
  10. 运行迁移计划并检查迁移 pod 的日志。确认 AIO 缓冲区设置作为参数传递,特别是 --vddk-config 值。

    例如,如果您运行以下命令:

    exec: /usr/bin/virt-v2v … --vddk-config /mnt/extra-v2v-conf/input.conf
    Copy to Clipboard Toggle word wrap

    如果 debug_level = 4,日志包括类似如下的部分:

    Buffer size calc for 16 value:
    (16 * 64 * 1024 = 1048576)
    nbdkit: vddk[1]: debug: [NFC VERBOSE] NfcAio_OpenSession:
    Opening an AIO session.
    nbdkit: vddk[1]: debug: [NFC INFO] NfcAioInitSession:
    Disabling
    read-ahead buffer since the AIO buffer size of 1048576 is >=
    the read-ahead buffer size of 65536. Explicitly setting flag
    '`NFC_AIO_SESSION_NO_NET_READ_AHEAD`'
    nbdkit: vddk[1]: debug: [NFC VERBOSE] NfcAioInitSession: AIO Buffer Size is 1048576
    nbdkit: vddk[1]: debug: [NFC VERBOSE] NfcAioInitSession: AIO Buffer
    Count is 4
    Copy to Clipboard Toggle word wrap
  11. 验证迁移 pod 中是否有正确的配置映射值。通过登录到迁移 pod 并运行以下命令完成此操作:

    cat /mnt/extra-v2v-conf/input.conf
    Copy to Clipboard Toggle word wrap

    输出示例如下:

    VixDiskLib.nfcAio.Session.BufSizeIn64KB=16
    vixDiskLib.nfcAio.Session.BufCount=4
    Copy to Clipboard Toggle word wrap
  12. 可选:运行以下命令来启用调试日志。命令将配置转换为 Base64,包括高级别:

    echo -e
    "`VixDiskLib.nfcAio.Session.BufSizeIn64KB=16\nVixDiskLib.nfcAio.Session.BufCount=4\nVixDiskLib.nfc.LogLevel=4`"
    | base64
    Copy to Clipboard Toggle word wrap
    注意

    添加高级别会降低性能,且仅用于调试目的。

10.1.16. 禁用 AIO 缓冲

您可以使用 Migration Toolkit for Virtualization (MTV)禁用冷迁移的 AIO 缓冲。您必须使用 MTV 为温迁移禁用 AIO 缓冲。

注意

以下流程假设根据启用和配置 AIO 缓冲中的步骤启用并配置 AIO 缓冲

流程

  1. openshift-mtv 命名空间中,执行以下步骤来编辑 ForkliftController 自定义资源(CR):

    1. 运行以下命令,访问 ForkliftController CR 进行编辑:

      oc edit forkliftcontroller -n openshift-mtv
      Copy to Clipboard Toggle word wrap
    2. ForkliftController CR 的 spec 部分删除以下行:

      virt_v2v_extra_args: "`–vddk-config /mnt/extra-v2v-conf/input.conf`"
      virt_v2v_extra_conf_config_map: "`perf`"
      Copy to Clipboard Toggle word wrap
  2. 删除名为 perf 的配置映射:

    oc delete cm perf -n openshift-mtv
    Copy to Clipboard Toggle word wrap
  3. 可选:重启 forklift-controller pod,以确保更改生效。

10.2. MTV 性能附加组件

此处提供的数据是从红帽实验室测试中收集而来的,仅供参考。 

总体而言,这些数字应该考虑显示最佳情况情况。

观察到的迁移性能可能与这些结果不同,这取决于几个因素。

第 11 章 Telemetry

红帽使用遥测从 Migration Toolkit for Virtualization (MTV)安装收集匿名使用数据,以帮助我们提高 MTV 的可用性和效率。

MTV 收集以下数据:

  • 迁移计划状态 :迁移数量。包括失败、成功或被取消的那些。
  • Provider :每个供应商的迁移数量。包括 Red Hat Virtualization、vSphere、OpenStack、OVA 和 OpenShift Virtualization 供应商。
  • mode :按模式的迁移数量。包括冷迁移和温迁移。
  • target :按目标的迁移数量。包括本地和远程迁移。
  • 计划 ID :迁移计划的 ID 号。数字由 MTV 分配。

指标每 10 秒计算一次,并每周、每月和每年报告。

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat