虚拟机热迁移

概述

虚拟机热迁移技术允许在不关闭或不中断虚拟机的情况下,将虚拟机从一台物理服务器迁移到另一台物理服务器。平台的虚拟机方案基于开源组件 KubeVirt 实现,默认使用 pre-copy 内存迁移。

Pre-Copy

pre-copy 内存迁移是一种常用的虚拟机迁移技术,它通过预先复制虚拟机的内存数据,确保迁移过程中的服务连续性。具体过程如下:

  1. 初始阶段:在迁移开始时,源主机会在虚拟机继续运行的同时,将虚拟机的内存页复制到目标主机。由于虚拟机仍在运行,部分内存页可能会在复制过程中被修改。
  2. 迭代复制:源主机会反复将已修改的内存页复制到目标主机,直到已修改页的数量下降到可接受的水平。每一轮复制称为一次迭代,未修改的内存页数量会在每次迭代后逐步减少。
  3. 停止并复制:当剩余未复制的内存页足够少时,虚拟机会短暂暂停(通常只需几秒到十几秒),在此期间将最后的内存页复制到目标主机,并同步虚拟机的 CPU 和设备状态到目标主机。
  4. 恢复运行:虚拟机在目标主机上恢复运行。

约束与限制

建议参与热迁移操作的两台物理机使用相同的硬件配置。如果配置不一致(例如 CPU 型号不同),迁移可能失败。

前提条件

请提前启用相关的虚拟机热迁移功能。

操作步骤

部署 kubevirt-operator

注意:具体步骤和参数说明请参见 安装。

  1. 进入管理员。

  2. 在左侧导航栏中,点击应用商店管理 > Operators。

  3. 点击页面顶部的集群,切换到需要部署 Operator 的集群。

  4. 在 OperatorHub 选项卡中,点击 KubeVirt HyperConverged Cluster Operator 卡片上的 部署。

  5. 按需配置参数并点击部署。您可以在已部署选项卡中查看 Operator 的部署状态。

创建 HyperConverged 实例

具体创建步骤请参见 创建 HyperConverged 实例。

准备虚拟机

注意:建议使用 Kube-OVN Underlay 网络。相关配置请参见 创建子网 (Kube-OVN Underlay Network)。

  1. 进入容器平台。

  2. 在左侧导航栏中,点击虚拟化 > 虚拟机。

  3. 点击创建虚拟机。

  4. 在基本信息区域点击更多展开更多配置项,然后点击 Annotations 对应的 添加,按照以下键值对添加注解。如果网络插件为 Kube-OVN,则无需手动填写该注解。

    注意:由于表单限制,请先输入注解的值,再输入注解的键。

    Annotation
    Valuetrue
    Keykubevirt.io/allow-pod-bridge-network-live-migration
  5. 按需配置其他虚拟机参数。具体参数说明请参见相关产品文档。

    参数说明
    Volume Mode必须使用 Block Mode。
    Storage Class必须使用 CephRBD block storage type storage class。
    Network Mode推荐使用 Bridge。
  6. 点击创建。

开始热迁移

注意:仅当虚拟机状态为 Running 时,才能启动热迁移。

  1. 进入容器平台。

  2. 在左侧导航栏中,点击虚拟化 > 虚拟机。

  3. 启动热迁移。可通过以下两种方式进行:

    • 在列表中找到需要迁移的虚拟机,点击右侧的 ⋮ > 热迁移。
    • 在列表中点击需要迁移的虚拟机名称,进入详情页,然后点击 Actions > 热迁移。
  4. 点击确认。您可以通过虚拟机状态或实时事件查看迁移进度。当状态从 Migrating 变为 Running,或者实时事件中出现类似 Migrated: The VirtualMachineInstance migrated to node 10.1.1.1. 的信息时,表示迁移成功。

使用 API

通过创建一个名为正在运行的虚拟机实例的 VirtualMachineInstanceMigration 来启动热迁移:

apiVersion: kubevirt.io/v1
kind: VirtualMachineInstanceMigration
metadata:
  name: migrate-web-01
  namespace: demo
spec:
  vmiName: web-01
kubectl apply -f migration.yaml
# phase progresses Pending -> Scheduling -> Running -> Succeeded
kubectl get virtualmachineinstancemigration migrate-web-01 -n demo -o jsonpath='{.status.phase}{"\n"}'

当阶段为 Succeeded 时,实例正在目标节点上运行 — 请参见 VirtualMachineInstance.status.migrationState.targetNode。要取消正在进行的迁移,请删除其 VirtualMachineInstanceMigration 对象(没有 cancel 字段):

kubectl delete virtualmachineinstancemigration migrate-web-01 -n demo

迁移设置

集群范围的热迁移限制以及按命名空间的覆盖项,通过 HyperConverged 资源和集群级 MigrationPolicy 对象进行配置,如下所述。

集群默认值

集群默认值是 KubeVirt 的 liveMigrationConfig,由 HyperConverged operator 管理。请将其设置在 HyperConverged 资源上,切勿直接设置在 KubeVirt 上,因为 operator 会将该值回写:

kubectl get hyperconverged kubevirt-hyperconverged -n kubevirt -o jsonpath='{.spec.liveMigrationConfig}'
# {"parallelMigrationsPerCluster":5,"parallelOutboundMigrationsPerNode":2,
#  "completionTimeoutPerGiB":150,"progressTimeout":150,
#  "allowAutoConverge":false,"allowPostCopy":false}
字段默认值含义
parallelMigrationsPerCluster5集群范围内允许的最大并发迁移数
parallelOutboundMigrationsPerNode2每个节点允许的最大并发出站迁移数
completionTimeoutPerGiB150迁移在被中止前,每 GiB 对应的秒数
progressTimeout150在无进展情况下中止迁移前的秒数
allowAutoConvergefalse限制 guest CPU 以帮助迁移收敛
allowPostCopyfalse如果 pre-copy 无法收敛,则切换到 post-copy

命名空间策略

集群级 MigrationPolicy 会覆盖其 selector 匹配到的命名空间(或虚拟机)的默认值:

apiVersion: migrations.kubevirt.io/v1alpha1
kind: MigrationPolicy
metadata:
  name: policy-fast
spec:
  selectors:
    namespaceSelector:
      kubernetes.io/metadata.name: demo
  allowAutoConverge: true
  completionTimeoutPerGiB: 100

如果某个虚拟机所属的命名空间未匹配任何策略,则使用集群默认值。