14.2. 在 Compute 节点之间迁移虚拟机实例

有时,您需要将实例从一个 Compute 节点迁移到另一个 Compute 节点,以执行维护、重新平衡工作负载或替换故障或出现故障的节点。

Compute 节点维护
如果您需要临时将 Compute 节点从服务外来,以执行硬件维护或修复、内核升级和软件更新,您可以将 Compute 节点上运行的实例迁移到另一个 Compute 节点。
Compute 节点失败
如果 Compute 节点要出现故障,并且需要服务或替换它,您可以将故障 Compute 节点中的实例迁移到健康的 Compute 节点。
Compute 节点失败
如果 Compute 节点已经失败,您可以撤离实例。您可以使用名称、UUID、网络地址以及实例在 Compute 节点失败前的任何其他分配资源,从另一个 Compute 节点上的原始镜像重建实例。
工作负载重新平衡
您可以将一个或多个实例迁移到另一个 Compute 节点,以重新平衡工作负载。例如,您可以在 Compute 节点上整合实例以节省电源,将实例迁移到物理地连接到其他联网资源的 Compute 节点,以减少延迟或跨 Compute 节点分发实例以避免热点并增加弹性。

director 配置所有 Compute 节点以提供安全迁移。所有 Compute 节点还需要一个共享的 SSH 密钥,以便每个主机的用户在迁移过程中能够访问其他 Compute 节点。director 使用 OS::TripleO::Services::NovaCompute 可组合服务创建该密钥。此可组合服务是所有 Compute 角色上默认包含的主要服务之一。有关更多信息,请参阅高级 Overcloud 自定义指南中的可组合服务和自定义角色

注意

如果您有可正常工作的 Compute 节点,并且您希望复制实例用于备份目的,或者将实例复制到不同的环境中,请按照 Director 安装和使用指南中的 将虚拟机导入到 overcloud 中的步骤。

14.2.1. 迁移类型

Red Hat OpenStack Platform (RHOSP)支持以下迁移类型。

冷迁移

冷迁移或非实时迁移涉及关闭正在运行的实例,然后再将其从源 Compute 节点迁移到目标 Compute 节点。

冷迁移

冷迁移涉及实例的一些停机时间。迁移的实例维护对同一卷和 IP 地址的访问。

注意

冷迁移要求源和目标 Compute 节点都在运行。

实时迁移

实时迁移涉及将实例从源 Compute 节点移到目标 Compute 节点,而不将其关闭,同时保持状态一致性。

实时迁移

实时迁移实例涉及很少或不明显的停机时间。但是,实时迁移会影响迁移操作的持续时间的性能。因此,在迁移时,应从关键路径获取实例。

重要

实时迁移会影响正在移动的工作负载的性能。红帽不支持在实时迁移过程中增加数据包丢失、网络延迟、内存延迟或降低网络范围、内存带宽、存储 IO 或 CPU 性能。

注意

实时迁移要求源和目标 Compute 节点都在运行。

在某些情况下,实例无法使用实时迁移。如需更多信息,请参阅 迁移限制

撤离

如果需要迁移实例,因为源 Compute 节点已经失败,您可以撤离实例。

14.2.2. 迁移限制

迁移限制通常会出现块迁移、配置磁盘或者一个或多个实例访问 Compute 节点上的物理硬件时。

CPU 限制

源和目标 Compute 节点必须具有相同的 CPU 架构。例如,红帽不支持将实例从 x86_64 CPU 迁移到 ppc64le CPU。

不支持在不同 CPU 型号之间迁移。在某些情况下,源和目标 Compute 节点的 CPU 必须完全匹配,如使用 CPU 主机透传的实例。在所有情况下,目标节点的 CPU 功能必须是源节点上 CPU 功能的超集。

内存限制

目标 Compute 节点必须有足够的可用 RAM。内存超额订阅可能会导致迁移失败。

块迁移限制

迁移使用 Compute 节点上本地存储的磁盘的实例比迁移使用共享存储的卷支持的实例(如 Red Hat Ceph Storage)要长得多。这是因为 OpenStack Compute (nova)默认通过 control plane 网络在 Compute 节点间迁移本地磁盘块。相反,使用共享存储的卷实例(如 Red Hat Ceph Storage)不必迁移卷,因为每个 Compute 节点已经能够访问共享存储。

注意

由迁移大量 RAM 的本地磁盘或实例导致的 control plane 网络中的网络拥塞可能会影响使用 control plane 网络的其他系统的性能,如 RabbitMQ。

只读驱动器迁移限制

只有在驱动器同时具有读写功能时,才支持迁移驱动器。例如,OpenStack Compute (nova)无法迁移 CD-ROM 驱动器或只读配置驱动器。但是,OpenStack Compute (nova)可以同时迁移具有读取和写入功能的驱动器,包括带有驱动器格式的配置驱动器,如 vfat

实时迁移限制

在某些情况下,实时迁移实例涉及额外的限制。

重要

实时迁移会影响正在移动的工作负载的性能。红帽不支持在实时迁移期间提高数据包丢失、网络延迟、内存延迟或网络带宽、内存带宽、存储 IO 或 CPU 性能。

迁移过程中没有新的操作
要在源和目标节点上实现实例副本之间的状态一致性,RHOSP 必须防止实时迁移期间的新操作。否则,如果写入内存的速度比实时迁移复制内存状态快,实时迁移可能需要很长时间或可能永远不会结束。
使用 NUMA 的 CPU 固定
Compute 配置中的 NovaSchedulerDefaultFilters 参数必须包含值 AggregateInstanceExtraSpecsFilterNUMATopologyFilter
多单元云
在多单元云中,可以将实例实时迁移到同一单元中的不同主机,但不能跨单元格迁移。
浮动实例
在实时迁移浮动实例时,如果目标 Compute 节点上的 NovaComputeCpuSharedSet 配置与源 Compute 节点上的 NovaComputeCpuSharedSet 的配置不同,则实例不会分配给为目标 Compute 节点上的共享(未固定)实例配置的 CPU。因此,如果您需要实时迁移浮动实例,您必须为专用(固定)和共享(未固定)实例使用相同的 CPU 映射来配置所有 Compute 节点,或者将主机聚合用于共享实例。
目标 Compute 节点容量
目标 Compute 节点必须有足够的容量来托管要迁移的实例。
SR-IOV 实时迁移
具有基于 SR-IOV 的网络接口的实例可以实时迁移。带有直接模式 SR-IOV 网络接口实时迁移实例会导致网络停机。这是因为,在迁移过程中需要分离和重新附加直接模式接口。
ML2/OVN 部署上的数据包丢失

ML2/OVN 不支持在没有数据包丢失的情况下进行实时迁移。这是因为 OVN 无法处理多个端口绑定,因此不知道何时迁移端口。

要最小化实时迁移过程中的数据包丢失,请将 ML2/OVN 部署配置为在迁移完成后声明目标主机上的实例:

parameter_defaults:
  ComputeExtraConfig:
    nova::config::nova_config:
      workarounds/enable_qemu_monitor_announce_self:
        value: 'True'
ML2/OVS 部署上的实时迁移

要最小化 ML2/OVS 部署中实时迁移实例时的数据包丢失,请配置 ML2/OVS 部署以启用网络服务(neutron)实时迁移事件,并在迁移完成后声明目标主机上的实例:

parameter_defaults:
  NetworkExtraConfig:
    neutron::config::neutron_config:
      nova/live_migration_events:
        value: 'True'
  ComputeExtraConfig:
    nova::config::nova_config:
      workarounds/enable_qemu_monitor_announce_self:
        value: 'True'

阻止实时迁移的限制

您无法实时迁移使用以下功能的实例。

PCI 透传
QEMU/KVM 虚拟机监控程序支持将 Compute 节点上的 PCI 设备附加到实例。使用 PCI 透传为实例授予 PCI 设备独占访问,就像它们物理连接到实例的操作系统一样。但是,由于 PCI 透传涉及直接访问物理设备,QEMU/KVM 不支持使用 PCI 透传实时迁移实例。
端口资源请求

您无法实时迁移使用资源请求的端口的实例,如保证最小带宽 QoS 策略。使用以下命令检查端口是否有资源请求:

$ openstack port show <port_name/port_id>

14.2.3. 准备迁移

在迁移一个或多个实例前,您需要确定 Compute 节点名称和要迁移的实例的 ID。

流程

  1. 识别源 Compute 节点主机名和目标 Compute 节点主机名:

    (undercloud)$ source ~/overcloudrc
    (overcloud)$ openstack compute service list
  2. 列出源 Compute 节点上的实例,并找到您要迁移的实例或实例的 ID:

    (overcloud)$ openstack server list --host <source> --all-projects

    <source> 替换为源 Compute 节点的名称或 ID。

  3. 可选: 如果您要从源 Compute 节点迁移实例以便在节点上执行维护,则必须禁用该节点,以防止调度程序在维护期间将新实例分配给节点:

    (overcloud)$ source ~/stackrc
    (undercloud)$ openstack compute service set <source> nova-compute --disable

    <source> 替换为源 Compute 节点的名称或 ID。

现在,您已准备好执行迁移。按照 冷迁移实例实时迁移实例的详细步骤操作。

14.2.4. 冷迁移实例

冷迁移实例涉及停止实例并将其移动到另一个 Compute 节点。冷迁移有助于实时迁移无法进行迁移,如迁移使用 PCI 透传的实例。调度程序自动选择目标 Compute 节点。如需更多信息,请参阅 迁移限制

流程

  1. 要冷迁移实例,请输入以下命令关闭并移动实例:

    (overcloud)$ openstack server migrate <instance> --wait
    • <instance > 替换为要迁移的实例的名称或 ID。
    • 如果迁移本地存储的卷,则指定 --block-migration 标记。
  2. 等待迁移完成。等待实例迁移完成后,您可以检查迁移状态。如需更多信息,请参阅 检查迁移状态
  3. 检查实例的状态:

    (overcloud)$ openstack server list --all-projects

    "VERIFY_RESIZE" 状态表示您需要确认或恢复迁移:

    • 如果迁移按预期工作,请确认它:

      (overcloud)$ openstack server resize --confirm <instance>

      <instance > 替换为要迁移的实例的名称或 ID。"ACTIVE" 状态表示实例已准备就绪。

    • 如果迁移无法正常工作,请恢复它:

      (overcloud)$ openstack server resize --revert <instance>

      <instance > 替换为实例的名称或 ID。

  4. 重启实例:

    (overcloud)$ openstack server start <instance>

    <instance > 替换为实例的名称或 ID。

  5. 可选:如果您禁用了源 Compute 节点进行维护,您必须重新启用该节点,以便可以为其分配新实例:

    (overcloud)$ source ~/stackrc
    (undercloud)$ openstack compute service set <source> nova-compute --enable

    <source > 替换为源 Compute 节点的主机名。

14.2.5. 实时迁移实例

实时迁移将实例从源 Compute 节点移到目标 Compute 节点,且停机时间最少。实时迁移可能并不适用于所有实例。如需更多信息,请参阅 迁移限制

流程

  1. 要实时迁移实例,请指定实例和目标 Compute 节点:

    (overcloud)$ openstack server migrate <instance> --live-migration [--host <dest>] --wait
    • <instance > 替换为实例的名称或 ID。
    • <dest> 替换为目标 Compute 节点的名称或 ID。

      注意

      openstack server migrate 命令涵盖迁移使用共享存储的实例,这是默认设置。指定 --block-migration 标志来迁移本地存储的卷:

      (overcloud)$ openstack server migrate <instance> --live-migration [--host <dest>] --wait --block-migration
  2. 确认实例正在迁移:

    (overcloud)$ openstack server show <instance>
    
    +----------------------+--------------------------------------+
    | Field                | Value                                |
    +----------------------+--------------------------------------+
    | ...                  | ...                                  |
    | status               | MIGRATING                            |
    | ...                  | ...                                  |
    +----------------------+--------------------------------------+
  3. 等待迁移完成。等待实例迁移完成后,您可以检查迁移状态。如需更多信息,请参阅 检查迁移状态
  4. 检查实例的状态,以确认迁移是否成功:

    (overcloud)$ openstack server list --host <dest> --all-projects

    <dest> 替换为目标 Compute 节点的名称或 ID。

  5. 可选:如果您禁用了源 Compute 节点进行维护,您必须重新启用该节点,以便可以为其分配新实例:

    (overcloud)$ source ~/stackrc
    (undercloud)$ openstack compute service set <source> nova-compute --enable

    <source > 替换为源 Compute 节点的主机名。

14.2.6. 检查迁移状态

迁移涉及完成迁移前的几个状态转换。在正常运行的迁移期间,迁移状态通常会有如下变换:

  1. Queued : 计算服务已接受迁移实例的请求,迁移是待处理的。
  2. Preparing: Compute 服务正在准备迁移实例。
  3. Running: Compute 服务正在迁移实例。
  4. Post-migrating : 计算服务已在目标 Compute 节点上构建实例,并在源 Compute 节点上释放资源。
  5. completed : 计算服务已完成迁移实例,并完成从源 Compute 节点上释放资源。

流程

  1. 检索实例的迁移 ID 列表:

    $ nova server-migration-list <instance>
    
    +----+-------------+-----------  (...)
    | Id | Source Node | Dest Node | (...)
    +----+-------------+-----------+ (...)
    | 2  | -           | -         | (...)
    +----+-------------+-----------+ (...)

    <instance > 替换为实例的名称或 ID。

  2. 显示迁移的状态:

    $ nova server-migration-show <instance> <migration_id>
    • <instance > 替换为实例的名称或 ID。
    • <migration_id > 替换为迁移 ID。

      运行 nova server-migration-show 命令会返回以下示例输出:

      +------------------------+--------------------------------------+
      | Property               | Value                                |
      +------------------------+--------------------------------------+
      | created_at             | 2017-03-08T02:53:06.000000           |
      | dest_compute           | controller                           |
      | dest_host              | -                                    |
      | dest_node              | -                                    |
      | disk_processed_bytes   | 0                                    |
      | disk_remaining_bytes   | 0                                    |
      | disk_total_bytes       | 0                                    |
      | id                     | 2                                    |
      | memory_processed_bytes | 65502513                             |
      | memory_remaining_bytes | 786427904                            |
      | memory_total_bytes     | 1091379200                           |
      | server_uuid            | d1df1b5a-70c4-4fed-98b7-423362f2c47c |
      | source_compute         | compute2                             |
      | source_node            | -                                    |
      | status                 | running                              |
      | updated_at             | 2017-03-08T02:53:47.000000           |
      +------------------------+--------------------------------------+
      提示

      OpenStack Compute 服务根据要复制的剩余内存字节数来测量迁移的进度。如果这个数字没有随着时间的推移减少,则迁移可能无法完成,计算服务可能会中止它。

有时,实例迁移可能需要很长时间或遇到错误。如需更多信息,请参阅 迁移故障排除

14.2.7. 清空实例

如果要将实例从死或关闭的 Compute 节点移动到同一环境中的新主机,您可以撤离它。

撤离过程会破坏原始实例,并使用原始镜像、实例名称、UUID、网络地址以及原始实例为其分配的任何其他资源在另一个 Compute 节点上重建它。

如果实例使用共享存储,则在撤离过程中不会重建实例根磁盘,因为磁盘可以被目标 Compute 节点访问。如果实例没有使用共享存储,那么目标 Compute 节点上也会重建实例根磁盘。

注意
  • 您只能在 Compute 节点被隔离时执行撤离,API 报告 Compute 节点的状态为 "down" 或 "forced-down"。如果 Compute 节点没有报告为 "down" 或 "forced-down",则 evacuate 命令会失败。
  • 要执行撤离,您必须是云管理员。

14.2.7.1. 清空一个实例

您可以一次撤离实例。

流程

  1. 以管理员身份登录失败的 Compute 节点。
  2. 禁用 Compute 节点:

    (overcloud)[stack@director ~]$ openstack compute service set \
     <host> <service> --disable
    • <host > 替换为要从中撤离实例的 Compute 节点的名称。
    • <service > 替换为要禁用的服务的名称,如 nova-compute
  3. 要撤离实例,请输入以下命令:

    (overcloud)[stack@director ~]$ nova evacuate [--password <pass>] <instance> [<dest>]
    • <pass> 替换为为 evacuated 实例设置的 admin 密码。如果没有指定密码,则生成随机密码并在撤离完成后输出。
    • <instance > 替换为要撤离的实例的名称或 ID。
    • <dest > 替换为要撤离实例的 Compute 节点的名称。如果没有指定目标 Compute 节点,则计算调度程序会为您选择一个。您可以使用以下命令查找可能的 Compute 节点:

      (overcloud)[stack@director ~]$ openstack hypervisor list

14.2.7.2. 清空主机上的所有实例

您可以撤离指定 Compute 节点上的所有实例。

流程

  1. 以管理员身份登录失败的 Compute 节点。
  2. 禁用 Compute 节点:

    (overcloud)[stack@director ~]$ openstack compute service set \
     <host> <service> --disable
    • <host > 替换为要从中撤离实例的 Compute 节点的名称。
    • <service > 替换为要禁用的服务的名称,如 nova-compute
  3. 撤离指定 Compute 节点上的所有实例:

    (overcloud)[stack@director ~]$ nova host-evacuate [--target_host <dest>] <host>
    • <dest > 替换为要撤离实例的目标 Compute 节点的名称。如果没有指定目的地,计算调度程序会为您选择一个。您可以使用以下命令查找可能的 Compute 节点:

      (overcloud)[stack@director ~]$ openstack hypervisor list
    • <host > 替换为要从中撤离实例的 Compute 节点的名称。

14.2.8. 迁移故障排除

实例迁移过程中可能会出现以下问题:

  • 迁移过程遇到错误。
  • 迁移过程永远不结束。
  • 迁移后实例的性能会降低。

14.2.8.1. 迁移过程中出错

以下问题可使迁移操作进入错误状态:

  • 使用不同版本的 Red Hat OpenStack Platform (RHOSP)运行集群。
  • 指定无法找到的实例 ID。
  • 您尝试迁移的实例 处于错误状态
  • Compute 服务正在关闭。
  • 发生争用情形。
  • 实时迁移进入失败状态。

当实时迁移进入失败状态时,通常会随之进入错误状态。以下常见问题可能导致失败状态:

  • 目标 Compute 主机不可用。
  • 发生调度程序异常。
  • 由于计算资源不足,重新构建过程失败。
  • 服务器组检查失败。
  • 源 Compute 节点上的实例在完成迁移到目标 Compute 节点之前被删除。

14.2.8.2. 永不结束的实时迁移

实时迁移可能无法完成,这会使迁移 持续运行。实时迁移永不完成时,对源 Compute 节点上运行的实例的客户端请求创建的速度比计算服务将其复制到目标 Compute 节点更快。

使用以下方法之一解决这种情况:

  • 中止实时迁移。
  • 强制实时迁移完成。

中止实时迁移

如果实例状态变化比迁移步骤将其复制到目标节点更快,并且您不想临时暂停实例操作,您可以中止实时迁移。

流程

  1. 检索实例的迁移列表:

    $ nova server-migration-list <instance>

    <instance > 替换为实例的名称或 ID。

  2. 中止实时迁移:

    $ nova live-migration-abort <instance> <migration_id>
    • <instance > 替换为实例的名称或 ID。
    • <migration_id > 替换为迁移 ID。

强制实时迁移完成

如果实例状态变化比迁移步骤将其复制到目标节点更快,并且您想要临时暂停实例操作来强制迁移完成,您可以强制完成实时迁移步骤。

重要

强制完成实时迁移可能导致明显的停机时间。

流程

  1. 检索实例的迁移列表:

    $ nova server-migration-list <instance>

    <instance > 替换为实例的名称或 ID。

  2. 强制实时迁移完成:

    $ nova live-migration-force-complete <instance> <migration_id>
    • <instance > 替换为实例的名称或 ID。
    • <migration_id > 替换为迁移 ID。

14.2.8.3. 迁移后实例性能下降

对于使用 NUMA 拓扑的实例,源和目标 Compute 节点必须具有相同的 NUMA 拓扑和配置。目标 Compute 节点的 NUMA 拓扑必须有足够的可用资源。如果源和目标 Compute 节点之间的 NUMA 配置不相同,则当实例性能降低时,实时迁移可能会成功。例如,如果源 Compute 节点将 NIC 1 映射到 NUMA 节点 0,但目标 Compute 节点会将 NIC 1 映射到 NUMA 节点 5,之后实例可能会将流量从总线路由到带有 NUMA 节点 5 的第二个 CPU,以将流量路由到 NIC 1。这可能导致预期的行为,但性能会降低。同样,如果源 Compute 节点上的 NUMA 节点 0 有足够的可用 CPU 和 RAM,但目的地 Compute 节点上的 NUMA 节点 0 已经具有使用了一些资源的实例,则实例可能会正确运行,但性能将下降。如需更多信息,请参阅 迁移限制