跳至主要内容

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 之前關閉虛擬機器。
  • 在 VirtualMachineImport CRD 規格中,將 forcePowerOff 欄位設定為 true。
  • 安裝 VMware Tools 或 open-vm-tools。