SeamlessMigrate
新GPU 工作负载与网络切换,0.4.0-rc.1 中的技术预览

开源虚拟机迁移:从 VMware 和 OpenStack 到 RHOSO 18.0 或社区版 OpenStack。 让虚拟机保持运行。
几分钟内完成切换。

Seamless Migrate 将虚拟机从 RHOSP 17.1、OpenStack 和 VMware vSphere 迁移到 RHOSO 18.0 或社区版 OpenStack。 虚拟机照常提供服务的同时复制磁盘,仅在同步最终增量时停机。

停机时间

同一台虚拟机,三种迁移方式。

一个 200 GiB 的卷,已用 120 GiB,客户机写入速率 2 MiB/s,通过 125 MiB/s 链路传输。控制平面的规划模型对各策略的停机时间估算如下:

  • 冷迁移 cold

    20分53秒 停机时间

    复制全部已用数据期间,虚拟机始终处于停机状态。

  • 温迁移 warm

    11分20秒 停机时间

    虚拟机照常提供服务期间执行 3 轮复制(31分32秒),仅在同步最终增量时停机。

  • 存储移交 storage_handover

    4分20秒 停机时间

    无需复制数据:在共享的 Ceph 或 NetApp ONTAP 上,由 Cinder 将每个卷移交给目标云。

支持平台

不同来源,目标由您定。

所有来源共用同一套计划、批次与审批模型。Seamless 通过各云平台的公共 API 与其交互,底层由 os-migrate Ansible 集合负责搬运数据。

  • Red Hat OpenStack Platform 17.1

    最后一个基于 TripleO 的版本。不适合就地采用时,可在新旧环境并行的情况下迁移。

    • cold
    • warm
    • storage_handover
  • 社区版 OpenStack 和 Kolla-Ansible

    支持 Keystone v3、Nova 2.60 或更高版本、Cinder v3 和 Neutron v2 的任意版本。

    • cold
    • warm
    • storage_handover
  • VMware vSphere 7.0U3 和 8.x

    由 vCenter 管理。借助 Changed Block Tracking 进行温迁移,由 virt-v2v 完成转换。

    • vmware_cold
    • vmware_warm

目标平台

  • RHOSO 18.0

    Red Hat OpenStack Services on OpenShift,目标平台,发布版本的实验室验证尚未完成。Seamless 只使用其公共 OpenStack API,从不触碰 OpenShift 资源。

  • 社区版 OpenStack

    从 2023.1 Antelope 到 2026.2 Hibiscus 的每个版本系列,无论是用 Kolla-Ansible、OpenStack-Ansible 还是其他工具部署,都走同一条代码路径。提供者检查会报告其版本系列、支持层级和策略配置。

  • 重建网络、子网、路由器和安全组
  • 迁移实例类型、镜像、密钥对、项目和用户
  • 按目标云的网络校验 MTU,包括 ML2/OVN 上的 Geneve
  • 默认对每个端点校验 TLS

所有常见客户机操作系统

从 OpenStack 迁移时,KVM 客户机迁移到 KVM,因此能在源端启动的系统也能在目标云上启动:RHEL、CentOS、Rocky、AlmaLinux、Oracle Linux、Ubuntu、Debian、SLES 和 Windows。从 VMware 迁移时,由 RHEL 9 转换主机上的 virt-v2v 转换客户机。旧版本会收到附带修复方法的警告,绝不会被静默阻止。

迁移策略

五种策略,每台虚拟机各选其一。

Seamless 为每台虚拟机估算所有可用策略,并选择停机时间最短的一种;若两种策略持平,则选择更简单的那种。您也可以手动更改这一选择。

从 OpenStack 迁移

  • cold

    冷迁移

    停止虚拟机,通过 SSH 复制已用数据,然后在目标云上启动。

  • warm

    温迁移

    虚拟机运行期间进行多轮快照复制,停止后只同步最终增量。

  • storage_handover

    存储移交

    在源端执行 Cinder unmanage,在目标端执行 manage。无需复制数据。

    前提条件: 两个云使用同一个 Ceph 集群或 NetApp ONTAP SVM。

从 VMware 迁移

  • vmware_cold

    VMware 冷迁移

    全量复制,然后由 virt-v2v 进行转换。

  • vmware_warm

    VMware 温迁移

    多轮 Changed Block Tracking 复制,然后同步最终增量并进行就地转换。

    前提条件: 虚拟机已启用 Changed Block Tracking。

技术预览

带 GPU 的虚拟机也能迁移,地址也可以随行。

这是候选发布版本,并非生产认证。尚未记录发布版本的实验室测试。 0.4.0-rc.1 新增,均可按计划选择启用,并已在模拟环境中验证:两者都能在演示中运行,但在 GPU 主机和真实云上的实验室测试尚未进行。测试通过后才会去掉这个标签。

  • GPU 工作负载

    技术预览,已在模拟环境中验证

    配有 NVIDIA vGPU(时间切片或基于 MIG)或整块直通 GPU 的虚拟机,现在可以迁移,不再被阻止。磁盘像其他虚拟机一样迁移;GPU 状态不会迁移,虚拟机在目标端的启动方式与关机后重新启动相同。

    • 从 OpenStack 规格或 vCenter 读取 GPU,并在清单中显示
    • 计划将每块 GPU 映射到目标端的 GPU 规格,绝不按大小或名称自动匹配;未映射的 GPU 虚拟机保持阻止状态
    • 验证时以及源虚拟机停止之前,都会从 Placement 读取空闲容量;资源池已满时,源虚拟机继续运行
    • 验证会检查 GPU 规格及其 Placement 分配,检查结果会指出客户机所需的驱动和许可证服务器
  • 网络切换

    技术预览,已在模拟环境中验证

    迁移可以带上虚拟机的网络身份。每一项都按计划选择启用,未启用的计划照常迁移。

    • 钩子:由管理员注册的 Ansible playbook 和 HTTPS webhook,在 pre_stop、post_create、post_verify、on_rollback 和 on_finalize 时运行,各有超时和可选的撤销操作
    • 在每种 OpenStack 策略下浮动 IP 均可保留地址:源虚拟机停止后迁移,回滚时归还
    • 通过 Designate 或 RFC 2136 服务器以 compare-and-swap 方式切换 DNS 记录,回滚时切回
    • 可达性等待计入停机时间;Octavia 助手会排空源端成员,并将迁移后的虚拟机加入资源池

预检会指出仍由运维人员负责的部分,并提供操作手册:Heat 堆栈和自动伸缩组、会被批次拆分的 Octavia 资源池、带地址对的端口,以及目标端无法发布的 DNS 名称。

下一版本:0.5.0

计划内容:通过邮件、Slack 和签名 webhook 发送通知;数据路径上的 SSH 主机密钥固定;以及作为技术预览的高可用控制平面、按租户划分的凭据和变更区段跟踪,后者可在 Ceph RBD 卷的温迁移中免去最后一轮的磁盘扫描。

0.4.0-rc.1 的发布说明 (在新标签页中打开)

工作原理

一条路径,每一步尽在掌控。

所有来源共用同一个工作流。每次迁移都按明确的状态机推进,控制平面重启后可从检查点继续,每个操作都会留下审计记录。

  1. 01

    连接源云与目标云

    添加 RHOSP 17.1、社区版 OpenStack、Kolla-Ansible 或 vCenter 作为源端,添加 RHOSO 18.0 或社区版 OpenStack 云作为目标端,每种平台都有对应的预设。凭证只写不读:它们存入平台的密钥存储,绝不会写入数据库,也不会出现在 API 响应中。一键即可检查每个连接及其可执行的操作,并报告目标端的版本系列、支持层级和策略配置。

  2. 02

    规划批次,先行试点

    发现资源清单,包括磁盘、网卡、客户机操作系统和就绪标记。选择虚拟机,映射网络、实例类型、卷类型和项目,由规划器按风险对批次排序,并先安排小规模试点。只有前一批次完成后,下一批次才会开始。

  3. 03

    迁移之前,先做验证

    预检会报告阻断项、警告和提示信息,并逐项给出修复方法。每台虚拟机都会得到每种可用策略的估算结果,以及一个可手动更改的自动选择。

  4. 04

    在虚拟机运行期间复制

    采用温迁移的虚拟机在照常提供服务的同时,以多轮快照的方式进行复制。第一轮之后,只有 BLAKE2b 摘要发生变化的数据块才会通过网络传输,每一轮都以校验通过的清单摘要收尾。已收敛的虚拟机等待其变更窗口,期间由 keep-warm 同步保持数据最新。

  5. 05

    在变更窗口内切换

    只有获得第二位审批人的批准、处于变更窗口内且有空闲的切换槽位时,切换才会开始。虚拟机停止,同步最终增量,然后在目标云上启动。停机时间从虚拟机停止开始计算,到启动并通过验证为止。

  6. 06

    先验证,再最终确认

    Seamless 会检查实例是否处于 ACTIVE 状态,以及端口、TCP 探测和控制台输出匹配情况。检查失败时会自动回滚:删除目标端实例并保留其卷,然后重新启动源虚拟机。最终确认是唯一无法撤销的步骤,需要审批人批准,并完整输入虚拟机名称。

仪表板

每一次迁移,一目了然。

仪表板随控制平面一起交付:计划与波次、每个停机时钟与其 SLO 的对比、审批和审计日志,通过 server-sent events 实时更新。以下是它的真实界面,截取自使用模拟云的演示。

seamless.internal/

查看原图 (在新标签页中打开)
Overview 页面:KPI 磁贴、三台停机中的虚拟机及其相对于 15 分钟 SLO 的停机时钟,以及四项待处理审批。

整个迁移进程一览无余

按状态统计的迁移、平均停机时间和 SLO 达标率、当前停机的每台虚拟机及其时钟,以及等待人工处理的审批:切换审批和顾问决策,每一项都链接到做出决定的页面。

实时推送,而非轮询
阶段变更、同步轮次、审批和事件通过 server-sent events 送达。连接中断后,仪表板从它看到的最后一个事件继续。
说明原因,而不只是拒绝
从 viewer 到 admin 四种角色。您暂时无法执行的操作仍留在页面上,并说明它在等待什么:角色、审批、变更窗口或阶段。
WCAG 2.2 AA
键盘优先,进度和结果向屏幕阅读器播报,44 px 的点击目标,遵循减少动态效果的设置,状态从不仅靠颜色表示。
不从其他主机加载任何内容
字体和脚本随控制平面一起交付,不从第三方加载任何内容,因此离线隔离环境中的显示完全相同。

安全保障

在您最终确认之前,一切均可回滚

审批、变更窗口和回滚是控制平面中的规则,而不是运维手册里的约定。在审批人最终确认之前,源虚拟机始终保留在原处。

由控制平面强制执行的门禁
只有审批、变更窗口和空闲的切换槽位三项条件同时满足,切换才会开始。
双人复核
发起或强制执行切换的人不能自行审批,必须由另一位审批人批准。
最终确认前均可回滚
回滚会删除目标端实例、保留其卷,归还切换时迁移的浮动 IP 地址或 DNS 记录,并重新启动源虚拟机。验证失败时会自动执行回滚。
不可逆步骤需输入确认
最终确认之前,任何操作都不会删除源数据;最终确认需要审批人批准,并完整输入虚拟机名称。
重启后继续执行
控制平面恢复后,进行中的迁移会从各自的检查点继续执行。计划内的停止可以先排空:各计划暂停,等进行中的切换完成后才会真正停止。
源虚拟机不会搁浅
每个步骤都有运行时长上限,因此卡住的 playbook 不会让已停止的虚拟机一直处于停机状态。
每项操作都有据可查
每个变更类调用都会被审计。您可以导出审计记录,或按保留策略进行清理。

部署

融入您的基础设施。

一个容器镜像加 PostgreSQL。可部署在 RHOSO 旁边的 OpenShift 集群上、任意 Kubernetes 上,或部署在单台主机上:Linux 服务器自身的 Docker Engine、Mac 上的 Colima,或 Podman。

  • Linux

    Docker Engine 20.10+ 搭配 Compose v2.20+:Ubuntu、Debian、RHEL、Rocky Linux、AlmaLinux、Fedora

    $ scripts/compose-init.sh$ make seamless-up$ curl -fsS http://127.0.0.1:8080/api/v1/health$ ssh -L 8080:127.0.0.1:8080 you@your-server

    使用服务器自身的 Docker Engine,无需 Colima,也无需 Node.js:镜像会自行构建仪表板。控制平面仅监听 127.0.0.1:8080,因此不会开放任何防火墙端口,仪表板通过 SSH 隧道访问;重启后容器会自动恢复运行,SELinux 可保持 enforcing 模式。

  • macOS

    Colima,或 Docker Desktop(需指定上下文)

    $ make seamless-colima-up$ scripts/compose-init.sh$ make seamless-up$ make seamless-logs

    运行在专用的 Colima profile(4 CPU、6 GiB、40 GiB)上,不会更改您当前的 Docker 上下文。使用 Docker Desktop 或其他任何上下文时,请为每条 make 命令添加 SEAMLESS_DOCKER_CONTEXT=desktop-linux。

  • Podman

    4.7 或更高版本

    $ scripts/compose-init.sh$ make seamless-up SEAMLESS_ENGINE=podman$ make seamless-logs SEAMLESS_ENGINE=podman

    podman compose 运行同一套服务栈;如已安装 docker-compose,则以其作为提供程序。启用 SELinux 的主机会自动重新标记令牌挂载。

  • Kubernetes

    1.28 或更高版本:EKS、AKS、GKE、RKE2、k3s、kubeadm

    $ kubectl apply -k deploy/kubernetes$ kubectl -n seamless-migrate rollout status deploy/seamless$ kubectl -n seamless-migrate get ingress seamless

    基于 OpenShift 清单的 Kustomize overlay,并附带 Ingress。请先根据 secret-example.yaml 创建 Secrets,并创建 TLS Secret seamless-tls。

  • OpenShift

    4.16 或更高版本

    $ oc apply -k deploy/openshift$ oc -n seamless-migrate rollout status deploy/seamless$ oc -n seamless-migrate get route seamless

    PostgreSQL 16、经过加固的单副本 Deployment、edge-TLS Route,以及默认拒绝的 NetworkPolicies。Secrets 保留在 kustomization 之外。

常见问题

答疑解惑。

团队在迁移第一台虚拟机之前会问的问题。

Seamless Migrate 是什么?

Seamless Migrate 是一个采用 Apache License 2.0 的开源控制平面,用于将虚拟机从 Red Hat OpenStack Platform 17.1、社区版 OpenStack(包括 Kolla-Ansible)和 VMware vSphere 迁移到 Red Hat OpenStack Services on OpenShift(RHOSO)18.0 或社区版 OpenStack 云(从 2023.1 Antelope 到 2026.2 Hibiscus)。它负责规划迁移批次,估算每台虚拟机的停机时间,在虚拟机持续运行时复制磁盘,让每次切换都必须经过审批并在变更窗口内进行,在目标云上验证每台虚拟机,并在检查失败时自动回滚。

如何将虚拟机从 VMware vSphere 迁移到 OpenStack?

将 vCenter(vSphere 7.0U3 或 8.x)添加为源端,将 RHOSO 18.0 或社区版 OpenStack 云添加为目标端,然后规划并验证迁移批次。启用了 Changed Block Tracking(CBT,变更块跟踪)的虚拟机采用温迁移:在虚拟机运行期间通过多轮 CBT 复制磁盘,切换时只传输最终增量,随后由 virt-v2v 进行就地转换。未启用 CBT 的虚拟机采用冷迁移:先全量复制,再进行转换。数据通过 os-migrate vmware-migration-kit 和目标云中带有 VDDK 的转换主机传输。

可以不进行就地采用,而将工作负载从 RHOSP 17.1 迁移到 RHOSO 18.0 吗?

可以。Red Hat 的采用(adoption)流程会就地转换 17.1 部署。如果这种方式不适用,例如需要换用新硬件或新的存储后端、重新设计网络(如从 ML2/OVS 改为 ML2/OVN),或需要整合多个云,Seamless Migrate 可以在新旧环境并行的情况下迁移工作负载:先在 RHOSO 上重建网络、安全组、实例类型、镜像、密钥对、项目和用户,再以冷迁移、温迁移或存储移交的方式迁移每台虚拟机。

可以不迁移到 RHOSO,而迁移到社区版 OpenStack 云吗?

可以。除 RHOSO 18.0 之外,从 2023.1 Antelope 到 2026.2 Hibiscus 的每个社区版 OpenStack 版本系列都可以作为目标平台,无论它是用 Kolla-Ansible、OpenStack-Ansible 还是其他工具部署的:使用 OpenStack Community 或 Kolla-Ansible 预设注册该云,同样的冷迁移、温迁移和存储移交策略即可在其上运行。提供者检查会报告每个目标平台的版本系列、支持层级和策略配置;若缺少所需能力,预检验证会在迁移任何数据之前阻断计划。目前 RHOSO 18.0 是目标平台,发布版本的实验室验证尚未完成;对每个由上游维护的社区版本系列的实验室验证尚未进行,将在正式版本发布之前完成。

迁移需要多长的停机时间?

这取决于迁移策略和虚拟机本身。以一个 200 GiB 的卷为例,已用 120 GiB,客户机写入速率 2 MiB/s,通过 125 MiB/s 链路传输,规划模型估算的停机时间分别为:冷迁移 20分53秒,温迁移 11分20秒,存储移交 4分20秒。温迁移的停机时间取决于最终增量和一次磁盘扫描,而不是全量复制。

冷迁移、温迁移和存储移交有什么区别?

冷迁移会停止虚拟机并复制其已用数据,因此停机时间随磁盘大小增长。温迁移在虚拟机持续运行时以多轮快照复制磁盘,只在同步最终增量时停机。存储移交完全不复制数据:当两个云共享同一个 Ceph 集群或 NetApp ONTAP SVM 时,Cinder 在源端对每个卷执行 unmanage,在目标端执行 manage,因此无论卷有多大,停机时间都是几分钟。

带 GPU 的虚拟机可以迁移吗?

可以,这是一项已在模拟环境中验证的技术预览。配有 NVIDIA vGPU(时间切片或基于 MIG)或整块直通 GPU 的虚拟机,只要计划将每块 GPU 映射到目标端的 GPU 规格即可迁移;未映射的 GPU 虚拟机保持阻止状态。验证会将计划所需的 GPU 与目标端在 Placement 中的空闲容量进行比对,切换门控会在源虚拟机停止之前再次读取:若没有空间,迁移会等待,源虚拟机继续运行。带直通 GPU 的 VMware 虚拟机只能在关机状态下冷迁移。在 GPU 主机上的实验室测试尚未进行。

迁移后的虚拟机能保留 IP 地址和 DNS 名称吗?

固定 IP 和 MAC 地址默认保留。作为已在模拟环境中验证的技术预览,计划还可以保留每个浮动 IP 的地址:在源虚拟机停止后迁移,回滚时归还;地址变化时,还可以在 Designate 或 RFC 2136 服务器中切换 DNS 记录。验证会等待每个迁移后的地址响应,并将等待时间计入停机时间;Seamless 本身不运行 BGP。其余部分可由管理员注册的钩子(Ansible playbook 或 HTTPS webhook)处理,预检会指出仍由运维人员负责的部分,例如 Heat 堆栈、自动伸缩组和 Octavia 资源池。

迁移可以回滚吗?

可以,在最终确认之前均可回滚。回滚会删除目标端实例、保留其卷,并重新启动源虚拟机;验证失败时也会自动触发回滚。最终确认之前,任何操作都不会删除源数据,而最终确认需要审批人批准,并完整输入虚拟机名称。

哪些客户机操作系统可以迁移?

从 OpenStack 迁移时,KVM 客户机迁移到 KVM,因此能在源端启动的系统也能在目标云上启动:RHEL 5 至 10、CentOS、Rocky、AlmaLinux、Oracle Linux、Ubuntu、Debian、SLES、openSUSE、Windows Server 2003 至 2025 以及 Windows 7 至 11。从 VMware 迁移时,由 virt-v2v 转换客户机:RHEL 7 至 10 和 Windows Server 2016 至 2025 受 Red Hat 支持;其他客户机经测试复制验证后可用,或需要先安装 virtio 驱动程序。

Seamless Migrate 在哪里运行?

它由一个容器镜像加 PostgreSQL 16 组成。可以部署在 RHOSO 旁边的 OpenShift 4.16 或更高版本上,也可以部署在 Kubernetes 1.28 或更高版本(EKS、AKS、GKE、RKE2、k3s、kubeadm)上,或者部署在单台主机上:Linux 服务器自身的 Docker Engine 20.10 或更高版本搭配 Compose v2.20(Ubuntu、Debian、RHEL、Rocky Linux、AlmaLinux、Fedora;无需 Colima,也无需 Node.js)、装有 Colima 的 Mac,或 Podman 4.7 或更高版本。一个运维脚本 seamless-ctl.sh 就能在每个平台上都以同样的方式完成部署的启动、停止、重启和扩缩容,并在计划内停止之前先排空运行中的计划。带有模拟云的演示可在笔记本电脑上运行,无需任何云凭证。

Seamless Migrate 免费吗?

是的。它采用 Apache License 2.0 开源,源代码托管在 GitHub 上。

Seamless Migrate 是 Red Hat 的产品吗?

不是。它是一个独立的开源项目,与 Red Hat、OpenInfra Foundation 或 Broadcom 均无关联,也未获得其赞助或认可,且不在任何 Red Hat 订阅的覆盖范围内。它基于上游的 os-migrate Ansible 集合构建,数据搬运仍由该集合负责。

Seamless Migrate 与 os-migrate 有何不同?

os-migrate 负责导出和导入租户资源,并以冷迁移方式复制工作负载,整个复制期间虚拟机处于停机状态。Seamless Migrate 在其基础上,增加了 OpenStack 源端的温迁移路径、存储移交、VMware 温迁移编排,以及一个控制平面,提供迁移计划、批次、停机时间估算、审批、验证、回滚、仪表板、REST API 和 CLI。

开始使用

大有可为。
先从小规模试点开始。

演示会在您笔记本电脑上的模拟云中运行每个阶段,从预复制到切换、验证和回滚。无需 OpenStack 即可试用。

Linux 服务器上的 Docker,或 Mac 上的 Colima

$ git clone https://github.com/imransetiadi/seamless-vms-migration$ cd seamless-vms-migration# 仅限 macOS:Linux 无需此步$ make seamless-colima-up$ scripts/compose-init.sh# 模拟云,运行所有阶段$ make seamless-demo

试用本地演示 (在新标签页中打开)使用 compose-init.sh 输出的管理员令牌在 /login 登录。也可以使用 Podman: SEAMLESS_ENGINE=podman。