本页面介绍如何将虚拟机实例从一个网络迁移到另一个网络。如果虚拟机使用多个网络接口连接到多个网络,此过程将更新其中一个接口,其余接口保持不变。
支持以下迁移:
- 从旧版网络到同一项目中的 VPC 网络
- 从一个 VPC 网络连接到同一项目中的另一个 VPC 网络
- 从一个 VPC 网络的子网到同一网络中的另一个子网
- 从服务项目网络到共享 VPC 宿主项目的共享网络
在任何情况下,虚拟机都会保留在其之前所在的地区和区域中。只有连接的网络会发生变化。
准备工作
- 阅读虚拟私有云文档。
-
如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
- 迁移是“冷”迁移。虚拟机必须先停止,然后才能迁移。
- 虚拟机不得位于实例组或网络端点组 (NEG) 中。
- 如果虚拟机位于非代管实例组或 NEG 中,则必须先将其从组中移除,然后才能迁移。
- 代管实例组中的虚拟机无法迁移。您必须将实例模板复制到新网络,并用其重新构建托管式实例组。
- 您可以移动目标池中的实例,而无需先移除这些实例。目标池可以扩展以覆盖两个网络。
- 您无法将虚拟机接口迁移到旧版网络。
- 分配给网络接口的 MAC 地址将在迁移过程中发生变化。这可能会对与 MAC 地址紧密相关的服务产生影响,例如第三方许可协议。
- 如果要将虚拟机迁移到使用不同 IP 范围的网络或子网,则实例的内部 IP 地址必须更改。如果您要迁移到具有相同 IP 范围的子网,只要旧 IP 地址未在目标位置使用,您就可以保留旧 IP 地址,方法是在迁移过程中指定旧 IP 地址。
- 如果目标子网与来源的 IP 范围不同,则该接口的 IP 地址会发生变化,以匹配新子网范围。
- 您可以将虚拟机的现有外部 IP 地址保留在新位置中。为此,您必须具有目标网络的
compute.subnetworks.useExternalIp
权限,并且目标网络不能通过 constraints/compute.vmExternalIpAccess 限制条件来停用外部 IP 地址。 在 Google Cloud 控制台中,转到虚拟机实例页面。
点击虚拟机实例名称以打开详情页面。
点击停止
。如果出现确认对话框,请点击停止。
虚拟机停止后,点击修改
。在网络接口下,点击您要移动的接口。
在接口的网络字段中,为接口选择新网络。
在接口的子网字段中,为接口选择新子网。
在内部 IP 地址字段中,指定自动(如果您想让系统从子网范围中分配 IP 地址)或自定义(如果您想自己指定未使用的 IP 地址)。
点击完成以关闭网络接口修改面板。
点击保存。
虚拟机保存完后,点击启动
。如果出现确认对话框,请点击启动。
停止虚拟机
gcloud compute instances stop INSTANCE_NAME \ --zone=ZONE_NAME
其中
- INSTANCE_NAME 是虚拟机实例的名称。
- ZONE_NAME 是包含该实例的区域的名称。
迁移虚拟机
gcloud compute instances network-interfaces update INSTANCE_NAME \ --zone=ZONE_NAME \ --network-interface=NIC \ --network=NETWORK_NAME \ --subnetwork=SUBNET_NAME
其中
- INSTANCE_NAME 是虚拟机实例的名称。
- ZONE_NAME 是包含该实例的区域的名称。
- NIC 是要更新的接口的名称。在单接口虚拟机中,NIC 为
nic0
。 - NETWORK_NAME 是目标网络名称。如果要将虚拟机从服务项目网络迁移到宿主项目网络,您必须为目标网络使用完全限定名称:
projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME
- SUBNET_NAME 是目标子网名称。此子网必须与虚拟机位于同一地区。如果要将虚拟机从服务项目网络迁移到宿主项目网络,您必须为子网使用完全限定名称:
projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
启动虚拟机
迁移可能需要几分钟时间,因此请等待,然后再尝试在新位置启动虚拟机。
gcloud compute instances start INSTANCE_NAME \ --zone=ZONE_NAME
其中
- INSTANCE_NAME 是虚拟机实例的名称。
- ZONE_NAME 是包含该实例的区域的名称。
停止虚拟机
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME/stop
其中
- PROJECT_ID 是您的项目 ID。
- INSTANCE_NAME 是虚拟机实例的名称。
- ZONE_NAME 是包含该实例的区域的名称。
查看实例的详细信息。
GET https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME
其中
- PROJECT_ID 是您的项目 ID。
- ZONE_NAME 是包含该实例的区域的名称。
- INSTANCE_NAME 是虚拟机实例的名称。
找到接口的指纹。
您需要指纹来更新网络接口。
检查命令的输出并找到
networkInterfaces
字段内容。找到具有要更新的接口名称的项(在单接口虚拟机中,名称为nic0
)。复制此项中fingerprint
字段的字符串,供下一步使用。迁移虚拟机
PATCH https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME/updateNetworkInterface?networkInterface=NIC { "network": NETWORK_NAME, "subnetwork": SUBNET_NAME, "networkIP": IP_ADDRESS, "name": NIC, "fingerprint": FINGERPRINT }
- PROJECT_ID 是您的项目 ID。
- ZONE_NAME 是包含该实例的区域的名称。
- INSTANCE_NAME 是虚拟机实例的名称。
- NIC 是要更新的接口的名称。在单接口虚拟机中,NIC 为
nic0
。 - NETWORK_NAME 是目标网络名称。如果要将虚拟机从服务项目网络迁移到宿主项目网络,您必须为目标网络使用完全限定名称:
projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME
- SUBNET_NAME 是目标子网名称。此子网必须与虚拟机位于同一地区。如果要将虚拟机从服务项目网络迁移到宿主项目网络,您必须为子网使用完全限定名称:
projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
- IP_ADDRESS 是您希望实例在新位置包含的内部 IP 地址。如果您省略此字段,系统会自动为其分配接口。
- FINGERPRINT 是您在上一步获得的指纹。
启动虚拟机
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME/start
其中
- PROJECT_ID 是您的项目 ID。
- INSTANCE_NAME 是虚拟机实例的名称。
- ZONE_NAME 是包含该实例的区域的名称。
- 了解如何将实例迁移到其他区域。
- 了解实时迁移。
- 检查虚拟机的状态。
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
要求
移动虚拟机之前,必须满足以下要求:
限制
迁移虚拟机
Google 建议您在迁移虚拟机之前在新网络中创建所有必要的防火墙规则、路由、负载均衡器和其他网络基础架构资源。这样做可以缩短虚拟机离线的时间。
控制台
gcloud
REST
后续步骤
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2024-12-03。
-