在网络之间迁移虚拟机

本页面介绍如何将虚拟机实例从一个网络迁移到另一个网络。如果虚拟机使用多个网络接口连接到多个网络,此过程将更新其中一个接口,其余接口保持不变。

支持以下迁移:

  • 从旧版网络到同一项目中的 VPC 网络
  • 从一个 VPC 网络连接到同一项目中的另一个 VPC 网络
  • 从一个 VPC 网络的子网到同一网络中的另一个子网
  • 从服务项目网络到共享 VPC 宿主项目的共享网络

在任何情况下,虚拟机都会保留在其之前所在的地区和区域中。只有连接的网络会发生变化。

准备工作

要求

移动虚拟机之前,必须满足以下要求:

  • 迁移是“冷”迁移。虚拟机必须先停止,然后才能迁移。
  • 虚拟机不得位于实例组或网络端点组 (NEG) 中。
    • 如果虚拟机位于非代管实例组或 NEG 中,则必须先将其从组中移除,然后才能迁移。
    • 代管实例组中的虚拟机无法迁移。您必须将实例模板复制到新网络,并用其重新构建代管实例组。
    • 您可以移动目标池中的实例,而无需先移除这些实例。目标池可以扩展以覆盖两个网络。

限制

  • 您无法将虚拟机接口迁移到旧版网络。
  • 分配给网络接口的 MAC 地址将在迁移过程中发生变化。这可能会对与 MAC 地址紧密相关的服务产生影响,例如第三方许可协议。
  • 如果要将虚拟机迁移到使用不同 IP 范围的网络或子网,则实例的内部 IP 地址必须更改。如果您要迁移到具有相同 IP 范围的子网,只要旧 IP 地址未在目标位置使用,您就可以保留旧 IP 地址,方法是在迁移过程中指定旧 IP 地址。
  • 如果目标子网与来源的 IP 范围不同,则该接口的 IP 地址会发生变化,以匹配新子网范围。
  • 您可以将虚拟机的现有外部 IP 地址保留在新位置中。为此,您必须具有目标网络的 compute.subnetworks.useExternalIp 权限,并且目标网络不能通过 constraints/compute.vmExternalIpAccess 限制条件来停用外部 IP 地址。

迁移虚拟机

在迁移虚拟机之前,请查看要求限制

Google 建议您在迁移虚拟机之前在新网络中创建所有必要的防火墙规则、路由、负载平衡器和其他网络基础架构资源。这样做可以缩短虚拟机离线的时间。

控制台

  1. 在 Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 点击虚拟机实例名称以打开详情页面。

  3. 点击停止

  4. 如果出现确认对话框,请点击停止

  5. 虚拟机停止后,点击修改

  6. 网络接口下,点击您要移动的接口。

  7. 在接口的网络字段中,为接口选择新网络。

  8. 在接口的子网字段中,为接口选择新子网。

  9. 内部 IP 地址字段中,指定自动(如果您想让系统从子网范围中分配 IP 地址)或自定义(如果您想自己指定未使用的 IP 地址)。

  10. 点击完成以关闭网络接口修改面板。

  11. 点击保存

  12. 虚拟机保存完后,点击启动

  13. 如果出现确认对话框,请点击启动

gcloud

  1. 停止虚拟机

    gcloud beta compute instances stop INSTANCE_NAME \
        --zone=ZONE_NAME

    其中

    • INSTANCE_NAME 是虚拟机实例的名称。
    • ZONE_NAME 是包含该实例的区域的名称。
  2. 迁移虚拟机

    gcloud beta compute instances network-interfaces update INSTANCE_NAME \
        --zone=ZONE_NAME \
        --network-interface=NIC \
        --network=NETWORK_NAME \
        --subnetwork=SUBNET_NAME

    其中

    • INSTANCE_NAME 是虚拟机实例的名称。
    • ZONE_NAME 是包含该实例的区域的名称。
    • NIC 是要更新的接口的名称。在单接口虚拟机中,NICnic0
    • NETWORK_NAME 是目标网络名称。如果要将虚拟机从服务项目网络迁移到宿主项目网络,您必须为目标网络使用完全限定名称:projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME
    • SUBNET_NAME 是目标子网名称。此子网必须与虚拟机位于同一地区。如果要将虚拟机从服务项目网络迁移到宿主项目网络,您必须为子网使用完全限定名称:projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
  3. 启动虚拟机

    迁移可能需要几分钟时间,因此请等待,然后再尝试在新位置启动虚拟机。

    gcloud beta compute instances start INSTANCE_NAME \
        --zone=ZONE_NAME

    其中

    • INSTANCE_NAME 是虚拟机实例的名称。
    • ZONE_NAME 是包含该实例的区域的名称。

API

  1. 停止虚拟机

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME/stop
    

    其中

    • PROJECT_ID 是您的项目 ID。
    • INSTANCE_NAME 是虚拟机实例的名称。
    • ZONE_NAME 是包含该实例的区域的名称。
  2. 获取接口的指纹。

    您需要指纹来更新网络接口。

    GET https://www.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME/updateNetworkInterface?networkInterface=NIC
    

    其中

    • PROJECT_ID 是您的项目 ID。
    • INSTANCE_NAME 是虚拟机实例的名称。
    • ZONE_NAME 是包含该实例的区域的名称。
    • NIC 是要更新的接口的名称。在单接口虚拟机中,NICnic0

    复制 fingerprint 字段中的字符串以供下一步使用。

  3. 迁移虚拟机

    PATCH https://www.googleapis.com/compute/beta/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 是要更新的接口的名称。在单接口虚拟机中,NICnic0
    • 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 是您在 GET 命令中复制的指纹。
  4. 启动虚拟机

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME/start
    

    其中

    • PROJECT_ID 是您的项目 ID。
    • INSTANCE_NAME 是虚拟机实例的名称。
    • ZONE_NAME 是包含该实例的区域的名称。

后续步骤