一、应用场景
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 上。