如果在任何 DFW 規則中設定了 [套用至] (這表示該 [套用至] 未設為 [DFW]),請使用此程序。

備註: 對於 NSX-VNSX-T 的移轉,請參閱知識庫文章 https://kb.vmware.com/s/article/56991 以取得詳細資訊。

對於 NSX-TNSX-V 的移轉,可能無法將工作負載虛擬機器移轉回 NSX-V,因為 NSX-T 中的分散式防火牆篩選器優先順序始終高於 NSX-V 中的分散式防火牆篩選器。因應措施是在執行 vMotion 動作之前,將工作負載虛擬機器放置於 NSX-T 排除清單中。

必要條件

  • 請確定:
    • vSphere vMotion 會在此移轉所涉及叢集中每台主機的 VMkernel 介面卡上啟用。如需在 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 會針對虛擬機器群組中每個將透過第 2 層橋接器將移轉至 NSX-T 覆疊區段的 NSX-V 工作負載虛擬機器,建立對應於其虛擬機器執行個體 UUID 的邏輯區段連接埠 (VIF)。如需此 API 要求本文的範例,請參閱 NSX 技術區域文章的隨即移轉程序區段。

  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 技術區域文章的 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 技術區域文章的隨即移轉程序區段。

  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 受管理物件瀏覽器 (MOB) (網址為 http://{vCenter-IP-Address}/mob),取得或確認虛擬機器的執行個體 UUID。您還可以對 vSphere 發出 API 呼叫,來取得或確認虛擬機器的執行個體 UUID。

  1. 在網頁瀏覽器中,進入 vCenter 受管理物件瀏覽器,網址為 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。

下一步

移轉工作負載虛擬機器後,就可以移除第 2 層橋接器。