如何在服务器之间移动现有的 Incus 实例

要将实例从一个 Incus 服务器移动到另一个服务器,请使用 incus move 命令

incus move [<source_remote>:]<source_instance_name> <target_remote>:[<target_instance_name>]

注意

移动容器时,必须先停止它。有关更多信息,请参阅 容器的实时迁移

移动虚拟机时,必须启用 虚拟机的实时迁移 或先停止它。

或者,如果您想复制实例,可以使用 incus copy 命令

incus copy [<source_remote>:]<source_instance_name> <target_remote>:[<target_instance_name>]

在这两种情况下,如果它是您的默认远程,则无需指定源远程,并且如果要使用相同的实例名称,则可以省略目标实例名称。如果要将实例移动到特定的集群成员,请使用 --target 标志指定它。在这种情况下,不要指定源和目标远程。

您可以添加 --mode 标志来选择传输模式,具体取决于您的网络设置

pull (默认)

指示目标服务器连接到源服务器并拉取相应的实例。

push

指示源服务器连接到目标服务器并推送实例。

relay

指示客户端连接到源服务器和目标服务器,并通过客户端传输数据。

如果需要调整实例在目标服务器上运行的配置,您可以直接指定新配置(使用 --config--device--storage--target-project)或通过配置文件(使用 --no-profiles--profile)。有关所有可用标志,请参阅 incus move --help

实时迁移

实时迁移是指在实例正在运行时迁移它。此方法适用于虚拟机。对于容器,支持有限。

虚拟机的实时迁移

虚拟机可以在运行时移动到另一台服务器,因此无需任何停机时间。

要允许实时迁移,必须启用有状态迁移的支持。为此,请确保以下配置

容器的实时迁移

对于容器,使用 CRIU 对实时迁移的支持有限。但是,由于存在大量的内核依赖项,因此只有非常基本的容器(非 systemd 容器,没有网络设备)才能可靠地迁移。在大多数现实场景中,您应该停止容器,将其移动,然后重新启动它。

如果要对容器使用实时迁移,则必须首先确保在两个系统上都安装了 CRIU。

为了优化容器的内存传输,请将 migration.incremental.memory 属性设置为 true 以利用 CRIU 中的预复制功能。通过此配置,Incus 指示 CRIU 对容器执行一系列内存转储。在每次转储之后,Incus 将内存转储发送到指定的远程。在理想情况下,每次内存转储都会减少与先前内存转储的差异,从而增加已同步内存的百分比。当已同步内存的百分比等于或大于通过 migration.incremental.memory.goal 指定的阈值,或通过 migration.incremental.memory.iterations 指定的最大允许迭代次数达到时,Incus 指示 CRIU 执行最终内存转储并将其传输。