一、應用場景
1:物理機器硬件系統的維護,故障修復和升級(upgrade),但其上的虛擬機不允許關機;
2:物理機器軟件或系統升級、patch,為了不影響虛機業務,在更新之前,把虛擬機遷移到別的物理機器上;
3:一個物理機器上的負載太重,需要減少一些虛擬機來釋放資源。
二、熱遷要求
1、kubevirt 需啟用熱遷移 feature gates;
2、kubevirt 增加 vimi crd,添加指定遷移節點的屬性;
3、虛機的系統盤和數據盤都要使用云盤,pvc 需要是 ReadWriteMany 模式;
4、虛機 virt-launcher 的默認 pod 網絡,需要保留給熱遷移的數據流量使用,因此不能把虛機的網卡橋接到 pod 網絡,需通過 multus-cni 為集群添加一個附加 cni 網絡,把這個網絡提供作為虛機的業務網絡,即把虛機的網絡和網卡都配置為此附加網絡;
5、端口 49152, 49153 需要保留給 virt-launcher pod 中可用,虛機配置中不能引用此端口;
6、虛機如果配置了直通主機設備,比如 pci 設備(GPU、NVME盤等)透傳,或網卡直通 PF、VF 等,則不支持遷移;
7、虛機的調度不能使用 nodeSelector,與熱遷移的檢查會沖突導致無法遷移;
8、宿主機間的 CPU 型號需保持一致,可修改虛機的 cpu.model 為以下三種模式:
host-passthrough,host-model(虛機會自動使用與宿主機盡可能相近的 cpu 類型),kvm64
三種 mode 的熱遷移通用性是: custom(kvm64) > host-model > host-passthrough
三種 mode 的性能排序是:host-passthrough > host-model > custom(kvm64)
9、kube-ovn 允許配置虛擬機默認路由。
三、創建附加網絡
每個 namespace 需要創建一個附加網絡,可以在創建 namespace 流程中同時創建附加網絡;
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: vm-attach
namespace: ns01
spec:
config: >-
{"cniVersion": "0.3.0", "type": "kube-ovn", "server_socket":
"/run/openvswitch/kube-ovn-daemon.sock", "provider":
"vm-attach.ns01.ovn"}
創建完成后可通過 kubectl get network-attachment-definitions -A 檢查。
四、虛機配置修改
如下添加,附加網絡的名字、以及 namespace 需要對應前面已創建的名字。
annotations:
ovn.kubernetes.io/logical_switch: monitor
ovn.kubernetes.io/default_route: 'false'
vm-attach.ns01.ovn.kubernetes.io/allow_live_migration: 'true'
vm-attach.ns01.ovn.kubernetes.io/default_route: 'true'
vm-attach.ns01.ovn.kubernetes.io/ip_address: 172.16.0.100
vm-attach.ns01.ovn.kubernetes.io/logical_switch: sn-10011711-530327087576252416
vm-attach.ns01.ovn.kubernetes.io/mac_address: '00:00:00:28:28:40'
networks:
- name: vm-attach
multus:
networkName: ns01/vm-attach
interfaces:
- bridge: {}
name: vm-attach
五、執行熱遷移
創建 VirtualMachineInstanceMigration (VMIM) 對象,發起遷移。
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstanceMigration
metadata:
annotations:
kubevirt.io/latest-observed-api-version: v1
kubevirt.io/storage-observed-api-version: v1alpha3
name: kubevirt-migrate-vm-01
namespace: default
spec:
vmiName: vm-01
targetNode: node1
遷移過程,就是在保持原有虛機 launcher pod 正常運行情況下,同時在其他 node 節點啟動一個新的虛機 pod,成功后再刪除舊 pod,成功地將虛擬機內存頁和 pvc 掛載復制到新 node 上。