如果在任何 DFW 规则中配置了“应用对象”(这意味着“应用对象”未设置为“DFW”),请使用该过程。

注: 对于 NSX-VNSX-T 的迁移,请参见知识库文章 https://kb.vmware.com/s/article/56991 以了解更多信息。

对于 NSX-TNSX-V 的迁移,可能无法将工作负载虚拟机迁移回 NSX-V,因为 NSX-T 中的分布式防火墙筛选器始终优先于 NSX-V 中的分布式防火墙筛选器。解决办法是在执行 vMotion 操作之前,将工作负载虚拟机置于 NSX-T 排除列表中。

前提条件

  • 请确保:
    • 在此迁移涉及的集群中的每个主机的 VMkernel 适配器上启用了 vSphere vMotion。有关在 VMkernel 适配器上启用 vMotion 的详细步骤,请参见 vSphere产品文档。
    • NSX-T 中的目标主机具有足够的资源来接收迁移的虚拟机。
    • 源主机和目标主机处于运行状态。解决主机的任何问题,包括断开连接状态。

有关 vMotion 的详细信息,请参见 vSphere 产品文档中的通过 vMotion 迁移

过程

  1. 获取计划迁移的所有虚拟机的实例 UUID。
    在下一步中执行 API 调用时,需要使用这些实例 UUID。有关如何获取虚拟机的实例 UUID 的信息,请参见本节末尾的示例。
  2. 运行以下 POST API 请求:
    POST https://{nsxt-mgr-ip}/api/v1/migration/vmgroup?action=pre_migrate

    该 API 创建一个逻辑分段端口 (Logical Segment Port, VIF),它与要通过 L2 网桥迁移到 NSX-T 覆盖网络分段的虚拟机组中的每个 NSX-V 工作负载虚拟机的虚拟机实例 UUID 相对应。有关该 API 的示例请求正文,请参见 NSX Tech Zone 文章的直接迁移过程部分。

  3. 调用 API GetVmGroupExecutionDetails。从 NSX-T 3.2.2 开始,可使用该 API。
    调用 API GetVmGroupExecutionDetails 以获取具有相同 group_id(和跨 VC 迁移的 federation_site_id)的预迁移 API 调用的结果。结果包括“logical_switch_id_to_vm_instance_id_and_vnics_map”列表和可选的“failedVmInstanceIds”列表,其中包含在源 VC 中未找到的虚拟机的 UUID。例如:
    GET /api/v1/migration/vmgroup/actions/get_vm_group_execution_details?group_id=<group-id>&federation_site_id=<site_id>
    Response:
    {
      "logical_switch_id_to_vm_instance_id_and_vnics_map":[
        {
          "ls_id":"36885723-7581-4696-a195-ef83851dc35f",
          "vm_and_vnics_mapping":[
            {
              "vm_instance_id":"52199e21-6aab-26e4-8c82-069a17d67667",
              "vnics":[
                "4001"
              ]
            },
            {
              "vm_instance_id":"52630e5d-ce6f-fac0-424c-4aa4bdf6bd56",
              "vnics":[
                "4001"
              ]
            }
          ]
        }
      ],
      "failedVmInstanceIds":[
        "501557f6-2197-1fe8-14e5-89898cee5fec"
      ]
    }
  4. 按照下面的伪 python 代码编写脚本,以对虚拟机执行 vMotion 操作。

    例如,请参见 NSX Tech Zone 文章中的 Python 示例脚本一节。

        define _get_nsx_networks_in_host(self, host):
            ls_id_to_nsx_pgs_map = {}
            for net in host.network:
                if isinstance(net, vim.dvs.DistributedVirtualPortgroup):
                    if hasattr(net.config, 'backingType'):
                        if net.config.backingType == 'nsx' and net.config.logicalSwitchUuid:
                            ls_id_to_nsx_pgs_map[net.config.logicalSwitchUuid] =\
                               [net.key, net.config.distributedVirtualSwitch.uuid]
                elif isinstance(net, vim.OpaqueNetwork):
                    if net.summary.opaqueNetworkType == 'nsx.LogicalSwitch':
                        ls_id_to_nsx_pgs_map[net.summary.opaqueNetworkId] = [None, net.summary.opaqueNetworkId]
            return ls_id_to_nsx_pgs_map
     
         define _get_vms_vnic_to_ls_id_map(self, logical_switch_id_to_vm_instance_id_and_vnics_map):
            vm_uuid_2_vnics_map = {}
            for ls_id_2_vm_vnics in logical_switch_id_to_vm_instance_id_and_vnics_map:
                ls_id = ls_id_2_vm_vnics['ls_id']
                for vm_vnics in ls_id_2_vm_vnics['vm_and_vnics_mapping']:
                    vnic_2_ls_id = vm_uuid_2_vnics_map.get(vm_vnics['vm_instance_id'], {})
                    for vnic in vm_vnics['vnics']:
                        vnic_2_ls_id[vnic] = ls_id
                    vm_uuid_2_vnics_map[vm_vnics['vm_instance_id']] = vnic_2_ls_id
            return vm_uuid_2_vnics_map
        
        def _get_nsxt_vnic_spec(self, device, dvpg_key, switch_id, vif_id):
            If dvpg_key:
                vdsPgConn = vim.dvs.PortConnection()
                vdsPgConn.portgroupKey = dvpg_key
                vdsPgConn.switchUuid = switch_id
                device.backing = vim.vm.device.VirtualEthernetCard.DistributedVirtualPortBackingInfo()
                device.backing.port = vdsPgConn
            else:
                device.backing = vim.vm.device.VirtualEthernetCard.OpaqueNetworkBackingInfo()
                device.backing.opaqueNetworkId = switch_id
                device.backing.opaqueNetworkType = 'nsx.LogicalSwitch'
            device.externalId = vif_id
            dev_spec = vim.Vm.Device.VirtualDeviceSpec()
            dev_spec.SetOperation(vim.Vm.Device.VirtualDeviceSpec.Operation.edit)
            dev_spec.SetDevice(device)
            return dev_spec
        
        def _migrate_vm(self, vmObject, vnic_2_ls_id_map, ls_id_to_nsx_pgs_map):
            devices = vmObject.config.hardware.device
            nic_devices = [device for device in devices if isinstance(device, vim.Vm.device.VirtualEthernetCard)]
            vnic_changes = []
            for device in nic_devices:
                ls_id = vnic_2_ls_id_map.get(str(device.key))
                if ls_id:
                    vif_id = vmObject.config.instanceUuid + ":" + str(device.key)
                    nsx_pg = ls_id_to_nsx_pgs_map.get(ls_id)
                    vnic_spec = self._get_nsxt_vnic_spec(device, nsx_pg[0], nsx_pg[1], vif_id)
                    vnic_changes.append(vnic_spec)
            relocate_spec = vim.Vm.RelocateSpec()
            relocate_spec.SetDeviceChange(vnic_changes)
            # set other fields in the relocate_spec
            vmotion_task = vmObject.Relocate(relocate_spec)
            WaitForTask(vmotion_task)
        
        
        vm_uuid_2_vnics_map = self._get_vms_vnic_to_ls_id_map(logical_switch_id_to_vm_instance_id_and_vnics_map)
        for vm_uuid, vnic_2_ls_id_map in vm_uuid_2_vnics_map.items():
            # get the vmObject by the vm_uuid
            # find a target host that has all the networks needed by this VM
            ls_id_to_nsx_pgs_map = self._get_nsx_networks_in_host(host)
            self._migrate_vm(vmObject, vnic_2_ls_id_map, ls_id_to_nsx_pgs_map)
  5. 将安全标记和虚拟机静态成员资格应用于迁移的虚拟机。
    POST https://{nsxt-mgr-ip}/api/v1/migration/vmgroup?action=post_migrate
    具有 post_migrate 操作的 vmgroup API 端点会将 NSX-V 安全标记应用于 NSX-T 覆盖网络分段上已迁移的工作负载虚拟机。

    有关该 API 的示例请求正文,请参见 NSX Tech Zone 文章的直接迁移过程部分。

  6. 最终完成基础架构以完成迁移。
    POST https://{nsxt-mgr-ip}/api/v1/migration?action=finalize_infra
    此迁移 API 将删除在迁移过程中创建的任何临时对象配置,并确保 NSX-T 基础架构处于干净状态。例如,将从组中移除临时 IP 集。

    该 POST API 没有请求正文。

  7. 验证是否已将预期的配置项目迁移到 NSX-T 环境。
    例如,检查是否成功迁移以下配置:
    • 用户定义的分布式防火墙规则。
    • 所有分组对象,例如 IP 集、组、标记等。
    • 在动态组中显示有效的成员。
    • 将标记应用于迁移的工作负载虚拟机。
  8. 迁移工作负载页面上,单击完成
    将显示一个对话框,用于确认完成迁移。如果完成迁移,则清除所有迁移详细信息。无法再查看此迁移的设置。例如,在 解决配置页面上输入了哪些内容。

示例: 从 vCenter MOB 中获取虚拟机实例 UUID

此示例显示如何从 vCenter Server Managed Object Browser (MOB)(网址为 http://{vCenter-IP-Address}/mob)中获取或确认虚拟机的实例 UUID。您还可以通过对 vSphere 进行 API 调用来获取或确认虚拟机的实例 UUID。

  1. 在 Web 浏览器中,访问 vCenter Managed Object Browser,网址为 http//{vCenter-IP-Address}/mob
  2. 单击内容
  3. 在“名称”列中找到 rootFolder,然后在“值”列中单击相应的链接。例如,group-d1。
  4. 在“名称”列中找到 childEntity,然后在“值”列中单击相应的链接。例如,datacenter-21。
  5. 在“名称”列中找到 hostFolder,然后在“值”列中单击相应的链接。例如,group-h23。
  6. 在“名称”列中找到 childEntity。相应的“值”列包含指向主机集群的链接。单击相应的主机集群链接。例如,domain-c33。
  7. 在“名称”列中找到 host。相应的“值”列按 vCenter MOID 和主机名列出该集群中的主机。单击相应的主机链接,例如 host-32。
  8. 在“名称”列中找到 vm。相应的“值”列按 vCenter MOID 和主机名列出虚拟机。例如,vm-216 (web-01a)。单击您感兴趣的虚拟机。
  9. 在“名称”列中找到 config。单击“值”列中的 config
  10. 在“名称”列中找到 instanceUuid。相应的“值”列列出虚拟机实例 UUID。例如,502e71fa-1a00-759b-e40f-ce778e915f16。

下一步做什么

迁移工作负载虚拟机后,可以移除 L2 网桥。