VM 匯入
自 v1.1.0 版本起提供
透過 vm-import-controller 附加元件,使用者可以將虛擬機器從 VMware 和 OpenStack 匯入到 Harvester。
若要使用 VM 匯入功能,使用者需要啟用 vm-import-controller 附加元件。

預設情況下,vm-import-controller 利用暫時性儲存 (ephemeral storage),該儲存掛載自 /var/lib/kubelet。
在移轉期間,大型 VM 的節點可能會耗盡此掛載點的空間,導致後續的調度失敗。
為了避免這種情況,建議使用者啟用 PVC 支援的儲存 (PVC-backed storage) 並自訂所需的儲存量。根據最佳實務,PVC 大小應為要移轉的最大 VM 大小的兩倍。這一點至關重要,因為 PVC 被用作暫存空間 (scratch space) 來下載 VM,並將磁碟轉換為原始映像檔。

vm-import-controller
目前支援以下來源供應商:
- VMware
- OpenStack
API
vm-import-controller 引入了兩個 CRD。
Sources (來源)
Sources 允許使用者定義有效的來源叢集。
例如:
apiVersion: migration.harvesterhci.io/v1beta1
kind: VmwareSource
metadata:
name: vcsim
namespace: default
spec:
endpoint: "https://vscim/sdk"
dc: "DCO"
credentials:
name: vsphere-credentials
namespace: default
Secret 包含 vCenter 端點的憑證:
apiVersion: v1
kind: Secret
metadata:
name: vsphere-credentials
namespace: default
stringData:
"username": "user"
"password": "password"
作為調和 (reconciliation) 程序的一部分,控制器將登入 vCenter 並驗證來源規格中指定的 dc 是否有效。
一旦通過此檢查,來源將被標記為就緒 (ready),並可用於 VM 移轉。
$ kubectl get vmwaresource.migration
NAME STATUS
vcsim clusterReady
對於基於 OpenStack 的來源叢集,定義範例如下:
apiVersion: migration.harvesterhci.io/v1beta1
kind: OpenstackSource
metadata:
name: devstack
namespace: default
spec:
endpoint: "https://devstack/identity"
region: "RegionOne"
credentials:
name: devstack-credentials
namespace: default
Secret 包含 OpenStack 端點的憑證:
apiVersion: v1
kind: Secret
metadata:
name: devstack-credentials
namespace: default
stringData:
"username": "user"
"password": "password"
"project_name": "admin"
"domain_name": "default"
"ca_cert": "pem-encoded-ca-cert"
作為調和程序的一部分,控制器嘗試列出專案中的 VM 並將來源標記為就緒。
$ kubectl get openstacksource.migration
NAME STATUS
devstack clusterReady
VirtualMachineImport (虛擬機器匯入)
VirtualMachineImport CRD 提供了一種方式讓使用者定義來源 VM,並對應到實際的來源叢集以執行 VM 匯出/匯入。
一個 VirtualMachineImport 範例如下所示:
apiVersion: migration.harvesterhci.io/v1beta1
kind: VirtualMachineImport
metadata:
name: alpine-export-test
namespace: default
spec:
virtualMachineName: "alpine-export-test"
folder: "Discovered VM"
networkMapping:
- sourceNetwork: "dvSwitch 1"
destinationNetwork: "default/vlan1"
- sourceNetwork: "dvSwitch 2"
destinationNetwork: "default/vlan2"
networkInterfaceModel: "e1000"
defaultNetworkInterfaceModel: "virtio"
skipPreflightChecks: false
storageClass: "my-storage-class"
defaultDiskBusType: "scsi"
sourceCluster:
name: vcsim
namespace: default
kind: VmwareSource
apiVersion: migration.harvesterhci.io/v1beta1
forcePowerOff: false
gracefulShutdownTimeoutSeconds: 30
這將觸發控制器將 VMware 來源叢集上名為 "alpine-export-test" 的 VM 匯出、處理並在 Harvester 叢集中重新建立。
控制器在開始匯入程序之前會檢查設定,並在偵測到錯誤(如未知的 StorageClasses 或網路)時取消匯入。這些檢查預設為啟用,但可以透過將 skipPreflightChecks 設定為 true 來停用。
匯入程序的持續時間取決於虛擬機器的大小。雖然匯入程序可能需要一些時間,但您應該會看到為定義的虛擬機器中的每個磁碟建立了 VirtualMachineImages。
如果來源虛擬機器位於資料夾中,您可以在選用的 folder 欄位中指定資料夾名稱。
networkMapping 中的項目清單將定義來源網路介面如何對應到 Harvester 網路。
如有必要,您可以使用 networkInterfaceModel 欄位個別指定每個來源網路介面的型號。有效值為 e1000、e1000e、ne2k_pci、pcnet、rtl8139 和 virtio。
在以下情況下,使用 defaultNetworkInterfaceModel 欄位指定預設介面型號特別有用:
- 您想要覆寫當 VMware 匯入自動偵測無效時所使用的預設型號,或覆寫 OpenStack 匯入時所有網路介面使用的預設型號。
- 未提供網路對應,且自動建立了
pod-network網路介面。
如果您未指定值,預設使用 virtio。
如果找不到相符項目,每個未對應的網路介面都會連接到預設的 managementNetwork。
storageClass 欄位指定在匯入程序期間用於映像檔和供應持久性卷冊的 StorageClass。如果未指定,將使用預設的 StorageClass。
defaultDiskBusType 欄位允許您指定匯入磁碟的匯流排類型。Harvester 以以下方式使用此欄位:
- VMware 來源:僅當 Harvester 無法自動偵測匯流排類型時才使用該值。
- OpenStack 來源:該值用於所有匯入的磁碟。
有效值為 sata、scsi、usb 和 virtio。如果您未指定值,預設使用 virtio。
預設情況下,vm-import-controller 會在開始匯入程序之前嘗試優雅地關閉 (gracefully shut down) 來源虛擬機器的客體作業系統。如果虛擬機器未在特定時間內優雅關機,將強制執行強制斷電 (hard power off)。您可以透過變更 gracefulShutdownTimeoutSeconds 欄位的值來調整優雅關機的時間週期,預設值為 60 秒。透過將 forcePowerOff 欄位設定為 true,可以強制 執行強制斷電而不嘗試優雅關機。
如果您正在匯入基於 VMware 的虛擬機器,vm-import-controller 的行為取決於虛擬機器上是否安裝了 VMware Tools。
| VMware Tools 狀態 | vm-import-controller 行為 |
|---|---|
| 已安裝 | 在開始匯入程序之前嘗試上述的優雅關機。 |
| 未安裝 | 顯示類似以下的日誌:handler virtualmachine-import-job-change: failed to shutdown the guest OS of the source VM: ServerFaultCode: Cannot complete operation because VMware Tools is not running in this virtual machine., requeuing |
vm-import-controller 僅支援 VMware 的 forcePowerOff 和 gracefulShutdownTimeoutSeconds 欄位,因為 OpenStack 會自動執行優雅關機和強制斷電的組合操作。
一旦虛擬機器成功匯入,物件將反映狀態:
$ kubectl get virtualmachineimport.migration
NAME STATUS
alpine-export-test virtualMachineRunning
openstack-cirros-test virtualMachineRunning
同樣地,使用者也可以為 OpenStack 來源定義 VirtualMachineImport:
apiVersion: migration.harvesterhci.io/v1beta1
kind: VirtualMachineImport
metadata:
name: openstack-demo
namespace: default
spec:
virtualMachineName: "openstack-demo" # 實體的名稱或 UUID
networkMapping:
- sourceNetwork: "shared"
destinationNetwork: "default/vlan1"
- sourceNetwork: "public"
destinationNetwork: "default/vlan2"
sourceCluster:
name: devstack
namespace: default
kind: OpenstackSource
apiVersion: migration.harvesterhci.io/v1beta1
OpenStack 允許使用者擁有多個同名實體 (instances)。在這種情況下,建議使用者使用實體 ID (Instance ID)。當使用名稱時,調和邏輯會嘗試執行名稱到 ID 的查找。
已知問題
來源虛擬機器名稱不符合 RFC1123 標準
建立虛擬機器物件時,vm-import-controller 附加元件使用來源虛擬機器的名稱,這可能不符合 Kubernetes 物件的 命名標準。您可能需要重新命名來源虛擬機器以允許匯入成功完成。
未安裝 VMware Tools 的基於 VMware 的虛擬機器未被移轉
當您嘗試在 Harvester v1.6.0 中匯入基於 VMware 的虛擬機器時,如果虛擬機器上未安裝 VMware Tools,則會發生以下情況:
- vm-import-controller 不會優雅地關閉客體作業系統。
- 當優雅關機期間 (
gracefulShutdownTimeoutSeconds) 結束時,vm-import-controller 不會強制執行強制斷電。 - 虛擬機器未從 VMware 移轉。
若要解決此問題,請執行以下任一變通方法:
- 在將其移轉到 Harvester 之前關閉虛擬機器。
- 在
VirtualMachineImportCRD 規格中,將forcePowerOff欄位設定為true。 - 安裝 VMware Tools 或 open-vm-tools。