9.2. 配置实时迁移
您可以配置实时迁移设置,以确保迁移过程不会给集群造成大量问题。
您可以配置实时迁移策略,将不同的迁移配置应用到虚拟机组。
9.2.1. 配置实时迁移限制和超时
通过更新位于 openshift-cnv
命名空间中的 HyperConverged
自定义资源(CR)为集群配置实时迁移限制和超时。
流程
编辑
HyperConverged
CR 并添加必要的实时迁移参数:$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
配置文件示例
apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged namespace: openshift-cnv spec: liveMigrationConfig: bandwidthPerMigration: 64Mi 1 completionTimeoutPerGiB: 800 2 parallelMigrationsPerCluster: 5 3 parallelOutboundMigrationsPerNode: 2 4 progressTimeout: 150 5 allowPostCopy: false 6
- 1
- 每个迁移的带宽限制,其中值为每秒字节数。例如,
2048Mi
表示 2048 MiB/s。默认:0
,代表没有限制。 - 2
- 如果迁移未能在此时间内完成则会取消,以每 GiB 内存秒数为单位。例如,如果有 6GiB 内存的虚拟机在 4800 秒内还没有完成,则超时。如果
Migration Method
是BlockMigration
,则迁移磁盘的大小纳入计算中。 - 3
- 集群中并行运行的迁移数。默认:
5
。 - 4
- 每个节点的最大出站迁移数。默认:
2
。 - 5
- 如果内存复制未能在此时间内取得进展,则会取消迁移,以秒为单位。默认:
150
。 - 6
- 如果虚拟机运行大量工作负载,且内存脏率太大,这可以防止从一个节点迁移到另一个节点。要防止这种情况,您可以启用复制后模式。默认情况下,
allowPostCopy
设置为false
。
您可以通过删除该键/值对并保存文件来恢复任何 spec.liveMigrationConfig
字段的默认值。例如,删除 progressTimeout: <value>
以恢复默认的 progressTimeout: 150
。
9.2.2. 为繁重工作负载配置实时迁移
迁移运行具有较高内存脏率的大量工作负载(如数据库处理)的虚拟机时,您需要更高的带宽才能完成迁移。
如果脏率太高,则从一个节点迁移到另一个节点不会聚合。要防止这种情况,请启用后复制模式。
如果初始预复制阶段没有在定义的超时内完成,则复制后模式将触发。在复制后,虚拟机 CPU 会在源主机上暂停,同时传输最低所需的内存页面。然后,虚拟机 CPU 在目标主机上激活,其余内存页面在运行时传输到目标节点上。
通过更新位于 openshift-cnv
命名空间中的 HyperConverged
自定义资源(CR)来为繁重工作负载配置实时迁移。
流程
编辑
HyperConverged
CR 并添加迁移繁重工作负载所需的参数:$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
配置文件示例
apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged namespace: openshift-cnv spec: liveMigrationConfig: bandwidthPerMigration: 0Mi 1 completionTimeoutPerGiB: 150 2 parallelMigrationsPerCluster: 5 3 parallelOutboundMigrationsPerNode: 1 4 progressTimeout: 150 5 allowPostCopy: true 6
- 1
- 每个迁移的带宽限制,其中值为每秒字节数。默认值为
0,
没有限制。 - 2
- 如果迁移没有在此时间内完成,并在启用后复制模式时触发后复制模式。这个值以秒为单位测量每个 GiB 内存。您可以降低
completionTimeoutPerGiB
在迁移过程早期触发复制后模式,或者引发completionTimeoutPerGiB
,以在迁移过程后触发复制后模式。 - 3
- 集群中并行运行的迁移数。默认值为
5
。迁移繁重工作负载时,保持parallelMigrationsPerCluster
设置较低。 - 4
- 每个节点的最大出站迁移数。为繁重工作负载配置每个节点的单一虚拟机。
- 5
- 如果内存复制未能在此时间内进行进度,则会取消迁移。这个值以秒为单位测量。为运行高负载的大型内存大小增加此参数。
- 6
- 当内存脏率很高时使用 post 复制模式,以确保迁移聚合。将
allowPostCopy
设置为true
以启用复制后模式。
- 可选:如果您的主网络对于迁移来说太忙,请配置一个二级专用迁移网络。
后复制模式可能会影响传输期间的性能,不应用于关键数据或不稳定的网络。
9.2.3. 其他资源
9.2.4. 实时迁移策略
您可以创建实时迁移策略,将不同的迁移配置应用到由 VM 或项目标签定义的虚拟机组。
您可以使用 OpenShift Virtualization web 控制台创建实时迁移策略。
9.2.4.1. 使用命令行创建实时迁移策略
您可以使用命令行创建实时迁移策略。kubevirt 使用任意标签组合将实时迁移策略应用到所选虚拟机(VM):
-
VM 标签,如
size
,os
, 或gpu
-
项目标签,如
priority
,bandwidth
, 或hpc-workload
要使策略应用到特定的虚拟机组,VM 组的所有标签都必须与策略标签匹配。
如果多个实时迁移策略应用到 VMI,则具有最高匹配标签的策略会优先使用。
如果多个策略满足此条件,则策略按照匹配标签键的字母顺序排序,并且第一个策略具有优先顺序。
流程
编辑要应用实时迁移策略的 VM 对象,并添加对应的 VM 标签。
打开资源的 YAML 配置:
$ oc edit vm <vm_name>
调整配置的
.spec.template.metadata.labels
部分中所需的标签值。例如,要将虚拟机标记为迁移策略的目的,请添加kubevirt.io/environment:
行:production
apiVersion: migrations.kubevirt.io/v1alpha1 kind: VirtualMachine metadata: name: <vm_name> namespace: default labels: app: my-app environment: production spec: template: metadata: labels: kubevirt.io/domain: <vm_name> kubevirt.io/size: large kubevirt.io/environment: production # ...
- 保存并退出配置。
使用对应标签配置
MigrationPolicy
对象。以下示例配置适用于标记为production
的所有虚拟机的策略:apiVersion: migrations.kubevirt.io/v1alpha1 kind: MigrationPolicy metadata: name: <migration_policy> spec: selectors: namespaceSelector: 1 hpc-workloads: "True" xyz-workloads-type: "" virtualMachineInstanceSelector: 2 kubevirt.io/environment: "production"
运行以下命令来创建迁移策略:
$ oc create migrationpolicy -f <migration_policy>.yaml