文章大纲
Live migration
是将运行的虚拟机实例在线迁移到另一个节点的过程。
启用 livt-migration 支持
如果是 v0.56
之前的版本需要手动启动在线迁移的功能,在 featureGates
中添加 LiveMigration
。
限制
要对 VM 热迁移,还需满足以下要求:
- VM 使用的 PVC 必须是 RWX 模式
- 不允许 Pod 网络绑定到 bridge 接口类型
- 端口
49152
49153
在virt-launcher
pod 处于可用的
如果不符合热迁移的要求时,会在 VMI 的 Conditions 中抛出不满足的 message
,如:
cannot migrate VMI which does not use masquerade, bridge with kubevirt.io/allow-pod-bridge-network-live-migration VM annotation or a migratable plugin to connect to the pod network
上述原因是 Pod 网络应该使用 masqureade
类型,而不是 bridge
类型。
修改 VM 网络类型
编辑 VM 资源,为 VM 设置网络接口并指定网络的类型:
kind: VM
spec:
domain:
devices:
interfaces:
- name: default
masquerade: {}
networks:
- name: default
pod: {} # Stock pod network
在 domain
中定义了网络的名称和类型,在 spec
中声明网络定义后端,名字应与前面的匹配,网络类型为 pod
代表使用的是默认 Kubernetes 网络。
网络修改成 masquerade
后,删除 VMI,使 VMI 使用新的网络接口类型。
对 VM 进行热迁移
实施热迁移有两种方式:
- 使用
VirtulMachineInstanceMigration
对象 - 使用
virtctl migrate
命令
使用 VMIM 对象
可以参考以下资源定义,对 fedora-vm
VM 进行热迁移:
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstanceMigration
metadata:
name: migration-job
spec:
vmiName: fedora-vm
在开启热迁移之前,先验证 VM 运行的所在的节点:
vagrant@master01:~$ k describe vmi fedora-vm -n vm-migration | grep -i 'node name'
Node Name: worker01
进行迁移,并查看迁移的状态:
vagrant@master01:~$ kubectl -n vm-migration apply -f migration-job.yml
virtualmachineinstancemigration.kubevirt.io/migration-job created
vagrant@master01:~$ kubectl describe vmim migration-job -n vm-migration | grep -A 1 'Migration State'
Migration State:
Completed: true
查看当前运行的节点:
vagrant@master01:~$ k describe vmi fedora-vm -n vm-migration | grep -i 'node name'
Node Name: master01
可以看到 VMI 从 worker01
热迁移到了 master01
使用 virtctl 命令迁移
virtctl
提供了 migrate
子命令可用于热迁移 VMI:
vagrant@master01:~$ virtctl migrate fedora-vm -n vm-migration
VM fedora-vm was scheduled to migrate
查看迁移状态:
vagrant@master01:~$ kubectl describe vmi fedora-vm -n vm-migration | grep Migrated | tail -1
Normal Migrated 90s virt-handler The VirtualMachineInstance migrated to node worker01.
vagrant@master01:~$ k describe vmi fedora-vm -n vm-migration | grep -i 'node name'
Node Name: worker01
通过查看 VMI 的事件可以看到从原先的 master01
迁移到了 worker01
。
取消迁移
热迁移可以通过 virtctl
进行取消:
vagrant@master01:~$ virtctl migrate-cancel fedora-vm -n vm-migration
VM fedora-vm was scheduled to migrate-cancel
修改集群范围的迁移限制
默认情况下,集群中迁移的限制配置为:
- 最大并行迁移的虚拟机数为
5
- 单个节点最大并行迁移虚拟机数为
2
- 每个迁移限制带宽为
64MiB/s
这些值可以通过 kubevirt
CR 进行更改:
apiVersion: kubevirt.io/v1
kind: Kubevirt
metadata:
name: kubevirt
namespace: kubevirt
spec:
configuration:
migrations:
parallelMigrationsPerCluster: 5
parallelOutboundMigrationsPerNode: 2
bandwidthPerMigration: 64Mi
completionTimeoutPerGiB: 800
progressTimeout: 150
disableTLS: false
nodeDrainTaintKey: "kubevirt.io/drain"
allowAutoConverge: false
allowPostCopy: false
unsafeMigrationOverride: false