第 12 章 Live migration(实时迁移)
12.1. 关于实时迁移 复制链接链接已复制到粘贴板!
实时迁移是在不中断虚拟工作负载的情况下,将正在运行的虚拟机 (VM) 移到集群中的另一节点的过程。实时迁移可以在集群升级过程中平稳过渡,或者每当需要排空节点进行维护或配置更改时进行清理。
默认情况下,实时迁移流量使用传输层安全 (TLS) 加密。
12.1.1. 实时迁移要求 复制链接链接已复制到粘贴板!
实时迁移有以下要求:
-
集群必须具有
ReadWriteMany(RWX) 访问模式的共享存储。 集群必须有足够的 RAM 和网络带宽。
注意您必须确保集群中有足够的内存请求容量来支持节点排空(这会导致实时迁移)。您可以使用以下计算来确定大约所需的备用内存:
Product of (Maximum number of nodes that can drain in parallel) and (Highest total VM memory request allocations across nodes)集群中可以并行运行的默认迁移数量为 5。
- 如果虚拟机使用主机模型 CPU,节点必须支持 CPU。
- 强烈建议为实时迁移配置专用的 Multus 网络。专用网络可最小化迁移期间租户工作负载网络饱和的影响。
12.1.2. 关于实时迁移权限 复制链接链接已复制到粘贴板!
在 OpenShift Virtualization 4.19 及更新的版本中,实时迁移操作仅限于明确授予 kubevirt.io:migrate 集群角色的用户。具有此角色的用户可以创建、删除和更新虚拟机(VM)实时迁移请求,这些请求由 VirtualMachineInstanceMigration (VMIM)自定义资源表示。
集群管理员可以将 kubevirt.io:migrate 角色绑定到命名空间或集群级别的可信用户或组。
在 OpenShift Virtualization 4.19 之前,命名空间管理员默认具有实时迁移权限。4.19 版本中更改了此行为,以防止对基础架构关键迁移操作造成意外或恶意中断。
作为集群管理员,您可以在更新前通过创建临时集群角色来保留旧的行为。为用户分配新角色后,请删除临时角色来强制实施更严格的权限。如果您已经更新,您仍然可以通过将 kubevirt.io:migrate 角色转换为 admin 集群角色来恢复到旧行为。
12.1.3. 在更新过程中保留 pre-4.19 实时迁移权限 复制链接链接已复制到粘贴板!
在升级到 OpenShift Virtualization 4.19 之前,您可以创建一个临时集群角色来保留以前的实时迁移权限,直到您准备好使更严格的默认权限生效。
先决条件
-
已安装 OpenShift CLI (
oc)。 - 有集群管理员权限。
流程
在升级到 OpenShift Virtualization 4.19 之前,请创建一个临时
ClusterRole对象。例如:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: rbac.authorization.k8s.io/aggregate-to-admin=true1 name: kubevirt.io:upgrademigrate rules: - apiGroups: - subresources.kubevirt.io resources: - virtualmachines/migrate verbs: - update - apiGroups: - kubevirt.io resources: - virtualmachineinstancemigrations verbs: - get - delete - create - update - patch - list - watch - deletecollection- 1
- 在更新 OpenShift Virtualization 前,这个集群角色会被聚合到
admin角色中。更新过程不会修改它,确保之前的行为被维护。
运行以下命令,将集群角色清单添加到集群中:
$ oc apply -f <cluster_role_file_name>.yaml- 将 OpenShift Virtualization 更新至 4.19 版本。
运行以下命令,将
kubevirt.io:migrate集群角色迁移到可信用户或组,将<namespace>,<first_user>,<second_user>, 和<group_name>替换为您自己的值。要在命名空间级别绑定角色,请运行以下命令:
$ oc create -n <namespace> rolebinding kvmigrate --clusterrole=kubevirt.io:migrate --user=<first_user> --user=<second_user> --group=<group_name>要在集群级别绑定角色,请运行以下命令:
$ oc create clusterrolebinding kvmigrate --clusterrole=kubevirt.io:migrate --user=<first_user> --user=<second_user> --group=<group_name>
当您将
kubevirt.io:migrate角色绑定到所有必要的用户时,运行以下命令删除临时ClusterRole对象:$ oc delete clusterrole kubevirt.io:upgrademigrate删除临时集群角色后,只有具有
kubevirt.io:migrate角色的用户才能创建、删除和更新实时迁移请求。
12.1.4. 授予实时迁移权限 复制链接链接已复制到粘贴板!
授予可信用户或组创建、删除和更新实时迁移实例。
先决条件
-
已安装 OpenShift CLI (
oc)。 - 有集群管理员权限。
流程
(可选)要更改默认行为,以便命名空间管理员始终有权创建、删除和更新实时迁移,请运行以下命令将
kubevirt.io:migrate角色聚合到admin集群角色中:$ oc label --overwrite clusterrole kubevirt.io:migrate rbac.authorization.k8s.io/aggregate-to-admin=true运行以下命令,将
kubevirt.io:migrate集群角色迁移到可信用户或组,将<namespace>,<first_user>,<second_user>, 和<group_name>替换为您自己的值。要在命名空间级别绑定角色,请运行以下命令:
$ oc create -n <namespace> rolebinding kvmigrate --clusterrole=kubevirt.io:migrate --user=<first_user> --user=<second_user> --group=<group_name>要在集群级别绑定角色,请运行以下命令:
$ oc create clusterrolebinding kvmigrate --clusterrole=kubevirt.io:migrate --user=<first_user> --user=<second_user> --group=<group_name>
12.1.5. VM 迁移调整 复制链接链接已复制到粘贴板!
您可以根据工作负载和迁移场景的类型调整集群范围的实时迁移设置。这可让您控制同时迁移的虚拟机数量、您要用于每个迁移的网络带宽,以及 OpenShift Virtualization 在取消进程前尝试完成迁移的时间。在 HyperConverged 自定义资源(CR) 中配置这些设置。
如果您要同时迁移每个节点的多个虚拟机,请设置 bandwidthPerMigration 限制,以防止大型或忙碌的虚拟机使用大量节点的网络带宽。默认情况下,bandwidthPerMigration 值为 0,这代表没有限制。
运行重度工作负载的大型虚拟机(如数据库处理)具有更高内存脏率,需要更高的带宽才能完成迁移。
在复制后模式启用后,如果初始预复制阶段没有在定义的超时内完成,则会触发。在复制后,虚拟机 CPU 会在源主机上暂停,同时传输最低所需的内存页面。然后,虚拟机 CPU 在目标主机上激活,其余内存页面在运行时传输到目标节点上。这可能会影响传输期间的性能。
后复制模式不应用于关键数据,或与不稳定的网络一起使用。
12.1.6. 常见实时迁移任务 复制链接链接已复制到粘贴板!
您可以执行以下实时迁移任务:
- 配置实时迁移设置
- 为繁重工作负载配置实时迁移
- 启动和取消实时迁移
- 在 OpenShift Container Platform web 控制台的 Migration 选项卡中监控所有实时迁移的进度。
- 在 web 控制台的 Metrics 选项卡中查看虚拟机迁移指标。