$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
您可以配置实时迁移设置以确保迁移过程不会压垮集群。
您可以配置实时迁移策略以将不同的迁移配置应用于虚拟机 (VM) 组。
通过更新位于 `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 内存的秒数。例如,如果 6 GiB 内存的虚拟机在 4800 秒内未完成迁移,则会超时。如果 `迁移方法` 为 `BlockMigration`,则迁移磁盘的大小将包含在计算中。 |
3 | 集群中并行运行的迁移数量。默认值:`5`。 |
4 | 每个节点出站迁移的最大数量。默认值:`2`。 |
5 | 如果内存复制未能在此时间内取得进展,则取消迁移,单位为秒。默认值:`150`。 |
6 | 如果虚拟机运行繁重的工作负载并且内存脏页比率过高,这可能会阻止从一个节点到另一个节点的迁移收敛。为避免这种情况,您可以启用后期复制模式。默认情况下,`allowPostCopy` 设置为 `false`。 |
您可以通过删除该键/值对并保存文件来恢复任何 `spec.liveMigrationConfig` 字段的默认值。例如,删除 `progressTimeout: <value>` 以恢复默认值 `progressTimeout: 150`。 |
迁移运行繁重工作负载(例如数据库处理)且内存脏页比率较高的虚拟机时,需要更高的带宽才能完成迁移。
如果脏页比率过高,则从一个节点到另一个节点的迁移不会收敛。为避免这种情况,请启用后期复制模式。
如果在定义的超时时间内未完成初始预复制阶段,则会触发后期复制模式。在后期复制期间,虚拟机 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 | 当内存脏页比率较高时,使用后期复制模式以确保迁移收敛。将 `allowPostCopy` 设置为 `true` 以启用后期复制模式。 |
可选:如果主网络对于迁移来说太繁忙,请配置一个辅助的专用迁移网络。
后期复制模式可能会影响传输过程中的性能,不应将其用于关键数据或不稳定的网络。 |
您可以创建实时迁移策略以将不同的迁移配置应用于由虚拟机或项目标签定义的虚拟机组。
您可以使用 OpenShift Virtualization Web 控制台创建实时迁移策略。 |
您可以使用命令行创建实时迁移策略。KubeVirt 使用任何标签组合将实时迁移策略应用于选定的虚拟机 (VM)。
虚拟机标签,例如size
、os
或gpu
项目标签,例如priority
、bandwidth
或hpc-workload
要使策略应用于特定组的虚拟机,该组虚拟机上的所有标签必须与策略的标签匹配。
如果多个实时迁移策略应用于同一虚拟机,则具有最多匹配标签的策略优先。 如果多个策略满足此条件,则会按匹配标签键的字母顺序对策略进行排序,并且按此顺序排列的第一个策略优先。 |
编辑您想要应用实时迁移策略的虚拟机对象,并添加相应的虚拟机标签。
打开资源的 YAML 配置文件。
$ oc edit vm <vm_name>
调整配置中.spec.template.metadata.labels
部分所需的标签值。例如,为了将虚拟机标记为迁移策略的production
虚拟机,请添加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"
1 | 指定项目标签。 |
2 | 指定虚拟机标签。 |
运行以下命令创建迁移策略:
$ oc create migrationpolicy -f <migration_policy>.yaml