Live migration 是将运行的虚拟机实例在线迁移到另一个节点的过程。

启用 livt-migration 支持

如果是 v0.56 之前的版本需要手动启动在线迁移的功能,在 featureGates 中添加 LiveMigration 。

限制

要对 VM 热迁移,还需满足以下要求:

  • VM 使用的 PVC 必须是 RWX 模式
  • 不允许 Pod 网络绑定到 bridge 接口类型
  • 端口 49152 49153 在 virt-launcher pod 处于可用的

如果不符合热迁移的要求时,会在 VMI 的 Conditions 中抛出不满足的 message ,如:

1
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 设置网络接口并指定网络的类型:

1
2
3
4
5
6
7
8
9
10
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 进行热迁移:

1
2
3
4
5
6
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstanceMigration
metadata:
name: migration-job
spec:
vmiName: fedora-vm

在开启热迁移之前,先验证 VM 运行的所在的节点:

1
2
vagrant@master01:~$ k describe vmi fedora-vm -n vm-migration | grep -i 'node name'
Node Name: worker01

进行迁移,并查看迁移的状态:

1
2
3
4
5
6
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

查看当前运行的节点:

1
2
vagrant@master01:~$ k describe vmi fedora-vm -n vm-migration | grep -i 'node name'
Node Name: master01

可以看到 VMI 从 worker01 热迁移到了 master01

使用 virtctl 命令迁移

virtctl 提供了 migrate 子命令可用于热迁移 VMI:

1
2
vagrant@master01:~$ virtctl migrate fedora-vm -n vm-migration
VM fedora-vm was scheduled to migrate

查看迁移状态:

1
2
3
4
5
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 进行取消:

1
2
vagrant@master01:~$ virtctl migrate-cancel fedora-vm -n vm-migration
VM fedora-vm was scheduled to migrate-cancel

修改集群范围的迁移限制

默认情况下,集群中迁移的限制配置为:

  • 最大并行迁移的虚拟机数为 5
  • 单个节点最大并行迁移虚拟机数为 2
  • 每个迁移限制带宽为 64MiB/s

这些值可以通过 kubevirt CR 进行更改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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