即時遷移
即時遷移是指在不停機的情況下將虛擬機器移動到不同的主機。為了完成即時遷移,背後會執行一些全面的流程和任務。
先決條件
當滿足以下要求時,即可進行即時遷移:
-
叢集至少有一個可排程的節點(除了目前節點之外)符合虛擬機器的所有排程規則。
-
遷移目標節點有足夠的可用資源來託管虛擬機器。
-
虛擬機器所需的 CPU、記憶體、磁碟區、裝置和其他資源可以在來源虛擬機器仍在執行時,在遷移目標節點上複製或重建。
不可遷移的虛擬機器
如果虛擬機器具有以下一個或多個特性,則被視為不可遷移:
-
具有以下屬性的磁碟區:
- 類型:
CD-ROM或Container Disk - 存取模式:
ReadWriteOnce - StorageClass 副本計數:
1(在所有情況下都不一定能偵測到。)
- 類型:
-
主機裝置直通,例如
PCI和vGPU -
將虛擬機器綁定到特定節點的節點選擇器
-
僅符合一個節點的排程規則
以下是在執行時檢查的規則條件範例。如需更多資訊,請參閱自動套用的親和性規則。
-
虛擬機器連接到僅覆蓋一個節點的叢集網路。
-
虛擬機器上啟用了 CPU 釘選,並且僅在一個節點上啟用了 CPU Manager。
-
要即時遷移虛擬機器,你必須首先移除不可遷移的裝置並新增可排程的節點。
可即時遷移的虛擬機器
不具有不可遷移虛擬機器屬性的虛擬機器可以進行即時遷移 。
遷移的運作方式
VirtualMachineInstanceMigration 物件
當觸發虛擬機器遷移動作時,會建立一個 VirtualMachineInstanceMigration 物件來追蹤作業的狀態和進度。Harvester 控制器透過確保實例物件的身分反映在遷移物件中,將 VirtualMachineInstanceMigration 物件與 VirtualMachineInstance 物件關聯起來。
在以下範例中,名為 demo 的虛擬機器有一個關聯的遷移物件。此物件的 UID 在遷移期間被新增到實例物件的 .status.migrationState.migrationUID 屬性中。
$ kubectl get vmi demo -ojsonpath={.status.migrationState.migrationUID}
1d6d7273-275d-48e0-bb76-62e240b42aaf
實例物件的名稱被新增到遷移物件的 .spec.vmiName 屬性中。
$ kubectl get vmim demo-6crrk -ojsonpath={.spec.vmiName}
demo
VirtualMachineInstanceMigration 物件名稱的格式會根據遷移是手動觸發還是自動觸發而有所不同。
當從 Migrate 選單項目觸發遷移時,VirtualMachineInstanceMigration 物件的名稱會以虛擬機器的名稱和隨機字串為前綴(例如,vm1-a3d1f)。
當遷移自動觸發時,VirtualMachineInstanceMigration 物件的名稱會以 kubevirt-evacuation- 和隨機字串為前綴(例如,kubevirt-evacuation-9c485)。
Harvester UI 不會指定遷移的來源。你必須檢查 VirtualMachineInstanceMigration 物件的名稱以檢索此資訊。
CPU 型號配對
每個節點都有多個 CPU 型號,這些型號使用不同的鍵標記。
- 主要 CPU 型號:
host-model-cpu.node.kubevirt.io/{cpu-model} - 支援的 CPU 型號:
cpu-model.node.kubevirt.io/{cpu-model} - 支援遷移的 CPU 型號:
cpu-model-migration.node.kubevirt.io/{cpu-model}
在即時遷移期間,控制器會檢查 VirtualMachineInstance (VMI) CR 中 spec.domain.cpu.model 的值,該值源自 VirtualMachine (VM) CR 中的 spec.template.spec.domain.cpu.model。如果未設定 spec.template.spec.domain.cpu.model 的值,控制器會使用預設值 host-model。
當使用 host-model 時,流程會擷取主要 CPU 型號的值,並使用標籤 cpu-model-migration.node.kubevirt.io/{cpu-model} 填充新建立的 pod 的 spec.NodeSelectors。
或者,你可以在 spec.domain.cpu.model 中自訂 CPU 型號。例如,如果 CPU 型號為 XYZ,流程會使用標籤 cpu-model.node.kubevirt.io/XYZ 填充新建立的 pod 的 spec.NodeSelectors。
然而,host-model 僅允許將虛擬機器遷移到具有相同 CPU 型號的節點。如需更多資訊,請參閱限制。
開始遷移
- 前往虛擬機器頁面。
- 找到你想遷移的虛擬機器,然後選擇 ⋮ > Migrate。
- 選擇你想遷移虛擬機器的目標節點。點擊 Apply。

在以下情況下,Migrate 選單選項不可用:
- 叢集只有一個節點。
- 虛擬機器是不可遷移的。
- 虛擬機器已經有一個執行中或待處理的遷移程序。

中止遷移
- 前往虛擬機器頁面。
- 找到你想中止的遷移中狀態的虛擬機器。選擇 ⋮ > Abort Migration。
當虛擬機器已經有一個執行中或待處理的遷移程序時,Abort Migration 選單項目才可用。
如果遷移程序是使用批次遷移建立的,請勿使用此 UI 功能。如需更多資訊,請參閱 VirtualMachineInstanceMigration 物件。
自動觸發的批次遷移
Harvester 升級和節點維護都受益於即時遷移。底層流程稱為批次遷移,與開始遷移中描述的流程略有不同。此流程包含以下步驟:
-
控制器監視節點物件上的專用污點。
-
控制器為目前節點上的每個可即時遷移的虛擬機器建立一個
VirtualMachineInstanceMigration物件。 -
遷移被排入佇列、內部排程並批次處理。Harvester UI 會顯示 Pending migration 和 Migrating 狀態以指示進度。
-
控制器監視處理並等待直到所有遷移完成或逾時。

遷移逾時
完成逾時
即時遷移程序將把虛擬機器記憶體頁面和磁碟區塊複製到 目的地。在某些情況下,虛擬機器寫入不同記憶體頁面或磁碟區塊的速度可能高於這些頁面或區塊被複製的速度。因此,遷移程序無法在合理的時間內完成。
如果即時遷移超過每 GiB 資料 800 秒的完成逾時時間,則會被中止。例如,具有 8 GiB 記憶體的虛擬機器將在 6400 秒後逾時。
進度逾時
當記憶體複製在 150 秒內沒有任何進展時,即時遷移也會被中止。
監控
如需有關檢視即時指標的資訊,請參閱即時遷移狀態和指標
限制
CPU 型號
host-model 僅允許將虛擬機器遷移到具有相同 CPU 型號的節點。然而,並不總是需要指定 CPU 型號。當未指定 CPU 型號時,你必須關閉虛擬機器,指派所有節點都支援的 CPU 型號,然後重新啟動虛擬機器。
範例:
- A 節點:
host-model-cpu.node.kubevirt.io/XYZcpu-model-migration.node.kubevirt.io/XYZcpu-model.node.kubevirt.io/123 - B 節點:
host-model-cpu.node.kubevirt.io/ABCcpu-model-migration.node.kubevirt.io/ABCcpu-model.node.kubevirt.io/123
使用 host-model 遷移虛擬機器是不可能的,因為 host-model-cpu.node.kubevirt.io 的值不相同。然而,兩個節點都支援 123 CPU 型號,因此你可以使用以下任一方法遷移具有 123 CPU 型號的任何虛擬機器:
- 叢集層級:執行
kubectl edit kubevirts.kubevirt.io -n harvester-system並新增spec.configuration.cpuModel: "123"。此變更也會影響新建立的虛擬機器。 - 個別虛擬機器:修改虛擬機器設定以包含
spec.template.spec.domain.cpu.model: "123"。
這兩種方法都需要你重新啟動虛擬機器。如果你確定叢集中的所有節點都支援特定的 CPU 型號,你可以在建立任何虛擬機器之前在叢集層級定義此型號。這樣做可以消除在即時遷移期間重新啟動虛擬機器(以指派 CPU 型號)的需求。
網路中斷
即時遷移對網路中斷非常敏感。在遷移過程中,來源節點和目標節點之間的網路連線中斷可能會產生各種結果。
mgmt 網路中斷
透過 mgmt(內建叢集網路)進行的即時遷移依賴於來源和目標節點上管理介面的可用性。mgmt 網路中斷被視為關鍵問題,因為它們不僅會中斷遷移程序,還會影響整體節點管理。
虛擬機器遷移網路中斷
虛擬機器遷移網路將遷移流量與其他網路活動隔離。雖然此設定可以改善遷移效能和可靠性,尤其是在網路流量高的環境中,但它也使遷移程序依賴於該特定網路的可用性。
虛擬機器遷移網路上的中斷可能以下列方式影響遷移程序:
- 短暫中斷:遷移程序突然停止。一旦恢復連線,程序就會恢復並可以成功完成,儘管會有延遲。
- 延長中斷:遷移作業逾時並失敗。來源虛擬機器繼續在來源節點上正常執行。
遷移程序以對等模式執行,這意味著來源節點上的 libvirt 守護程式 (libvirtd) 透過直接呼叫目的地守護程式來控制遷移。此外,內建的保持活動機制確保客戶端連線在遷移程序期間保持活動狀態。如果連線在特定時間內保持非活動狀態,它將被關閉,遷移程序將被中止。
預設情況下,保持活動間隔設為 5 秒,重試次數設為 5 次。根據這些預設值,如果連線在 30 秒內處於非活動狀態,遷移程序將被中止。然而,遷移可能會更早或更晚失敗,具體取決於實際的叢集條件。