×

您可以配置实时迁移设置,以确保迁移过程不会压垮集群。

您可以配置实时迁移策略,将不同的迁移配置应用于虚拟机 (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内存的秒数。例如,如果6GiB内存的虚拟机在4800秒内未完成迁移,则会超时。如果迁移方法BlockMigration,则计算中会包含正在迁移的磁盘的大小。
    3 集群中并行运行的迁移次数。默认值:5
    4 每个节点出站迁移的最大数量。默认值:2
    5 如果内存复制未能在此时间内取得进展,则会取消迁移,单位为秒。默认值:150
    6 如果虚拟机正在运行繁重的工作负载并且内存脏页率过高,这可能会阻止从一个节点到另一个节点的迁移收敛。为防止这种情况,您可以启用后期复制模式。默认情况下,allowPostCopy设置为false

您可以通过删除键/值对并保存文件来恢复任何spec.liveMigrationConfig字段的默认值。例如,删除progressTimeout: <value>以恢复默认值progressTimeout: 150

为繁重工作负载配置实时迁移

迁移运行繁重工作负载(例如数据库处理)且内存脏页率较高的虚拟机时,需要更高的带宽才能完成迁移。

如果脏页率过高,则从一个节点到另一个节点的迁移不会收敛。为防止这种情况,请启用后期复制模式。

如果初始预复制阶段未在定义的超时时间内完成,则会触发后期复制模式。在后期复制期间,虚拟机 CPU 在源主机上暂停,同时传输所需的最少内存页。然后,虚拟机 CPU 在目标主机上激活,其余内存页在运行时传输到目标节点。

通过更新位于openshift-cnv命名空间中的HyperConverged自定义资源 (CR),为繁重工作负载配置实时迁移。

步骤
  1. 编辑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以启用后期复制模式。
  2. 可选:如果您的主网络过于繁忙而无法进行迁移,请配置一个辅助的专用迁移网络。

后期复制模式可能会影响传输期间的性能,不应将其用于关键数据或不稳定的网络。

实时迁移策略

您可以创建实时迁移策略,将不同的迁移配置应用于由虚拟机或项目标签定义的虚拟机组。

您可以使用 OpenShift Virtualization Web 控制台创建实时迁移策略。

使用命令行创建实时迁移策略

您可以使用命令行创建实时迁移策略。KubeVirt 使用任何标签组合将实时迁移策略应用于选定的虚拟机 (VM)。

  • 虚拟机标签,例如sizeosgpu

  • 项目标签,例如prioritybandwidthhpc-workload

要使策略应用于特定虚拟机组,虚拟机组上的所有标签必须与策略的标签匹配。

如果多个实时迁移策略应用于一台虚拟机,则具有最多匹配标签的策略优先。

如果多个策略符合此条件,则会按匹配标签键的字母顺序对策略进行排序,并按此顺序选择第一个策略。

步骤
  1. 编辑您要应用实时迁移策略的虚拟机对象,并添加相应的虚拟机标签。

    1. 打开资源的 YAML 配置文件。

      $ oc edit vm <vm_name>
    2. 调整配置的.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
      # ...
    3. 保存并退出配置。

  2. 使用相应的标签配置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 指定虚拟机标签。
  3. 运行以下命令创建迁移策略。

    $ oc create migrationpolicy -f <migration_policy>.yaml