KubeVirt 08:VM 在线迁移

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

启用 livt-migration 支持

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

限制

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

  • VM 使用的 PVC 必须是 RWX 模式
  • 不允许 Pod 网络绑定到 bridge 接口类型
  • 端口 49152 49153virt-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

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

滚动至顶部