在项目之间复制虚拟机


本文档介绍如何将虚拟机复制到其他项目。

准备工作

  • 查看永久性磁盘快照的最佳做法并准备用于快照的启动磁盘。
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。
    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. Set a default region and zone.

所需的角色

如需获得在项目之间复制虚拟机所需的权限,请让您的管理员为您授予项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色可提供在项目之间复制虚拟机所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

在项目之间复制虚拟机需要以下权限:

  • 针对项目的 compute.instances.create 权限
  • 使用自定义映像创建虚拟机:针对映像的 compute.images.useReadOnly 权限
  • 使用快照创建虚拟机:针对快照的 compute.snapshots.useReadOnly 权限
  • 使用实例模板创建虚拟机:针对实例模板的 compute.instanceTemplates.useReadOnly 权限
  • 为虚拟机分配旧版网络:针对项目的 compute.networks.use 权限
  • 为虚拟机指定静态 IP 地址:针对项目的 compute.addresses.use 权限
  • 使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的 compute.networks.useExternalIp 权限
  • 为虚拟机指定子网:针对项目或所选子网的 compute.subnetworks.use 权限
  • 在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的 compute.subnetworks.useExternalIp 权限
  • 为虚拟机设置虚拟机实例元数据:针对项目的 compute.instances.setMetadata 权限
  • 为虚拟机设置标记:针对虚拟机的 compute.instances.setTags 权限
  • 为虚拟机设置标签:针对虚拟机的 compute.instances.setLabels 权限
  • 为虚拟机设置要使用的服务账号:针对虚拟机的 compute.instances.setServiceAccount 权限
  • 为虚拟机创建新磁盘:针对项目的 compute.disks.create 权限
  • 以只读或读写模式挂接现有磁盘:针对磁盘的 compute.disks.use 权限
  • 以只读模式挂接现有磁盘:针对磁盘的 compute.disks.useReadOnly 权限

您也可以使用自定义角色或其他预定义角色来获取这些权限。

将虚拟机复制到其他项目

  1. 在源项目中,使用以下命令之一创建虚拟机启动磁盘的快照:

    可用区启动磁盘

    如果您的虚拟机具有可用区启动磁盘,请使用以下命令创建快照:

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk SOURCE_DISK \
        --snapshot-type SNAPSHOT_TYPE \
        --source-disk-zone SOURCE_DISK_ZONE
    

    替换以下内容:

    • SNAPSHOT_NAME:快照的名称。
    • SOURCE_DISK:可用区级永久性磁盘卷的名称,您将根据它创建快照。
    • SNAPSHOT_TYPE:快照类型:STANDARDARCHIVE。如果未指定快照类型,系统会创建 STANDARD 快照。 选择归档,实现更经济高效的数据保留。
    • SOURCE_DISK_ZONE:可用区级永久性磁盘卷的可用区,您将根据该卷创建快照。

    区域启动磁盘

    如果您的虚拟机具有区域启动磁盘,请使用以下命令创建快照:

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk SOURCE_DISK \
        --source-disk-region=SOURCE_DISK_REGION \
        --snapshot-type=SNAPSHOT_TYPE
    

    替换以下内容:

    • SNAPSHOT_NAME:快照的名称。
    • SOURCE_DISK:您要根据其创建快照的区域级永久性磁盘卷的名称。
    • SOURCE_DISK_REGION:您要根据其创建快照的区域级永久性磁盘卷的区域。
    • SNAPSHOT_TYPE:快照类型:STANDARDARCHIVE。如果未指定快照类型,系统会创建 STANDARD 快照。

  2. 使用以下命令通过快照创建自定义映像:

    gcloud compute images create IMAGE_NAME \
        --source-snapshot=SOURCE_SNAPSHOT \
        [--storage-location=LOCATION]
    

    替换以下内容:

    • IMAGE_NAME:新映像的名称
    • SOURCE_SNAPSHOT:要根据其创建映像的快照
    • LOCATION:可选:用于指定在其中存储此映像的单区域或多区域的标志。例如,指定 us 可将映像存储在 us 多区域中,或指定 us-central1 可将其存储在 us-central1 区域中。如果您未选择位置,Compute Engine 会将映像存储在最接近映像来源位置的多区域中。
  3. 可选:与在目标项目中创建虚拟机的用户共享自定义映像。如需详细了解如何共享自定义映像,请参阅在组织内共享自定义映像

  4. 在目标项目中,使用以下命令通过自定义映像创建虚拟机:

    gcloud compute instances create VM_NAME \
        --image-project IMAGE_PROJECT \
        [--image IMAGE | --image-family IMAGE_FAMILY]
        --subnet SUBNET
    

    替换以下内容:

    • VM_NAME:虚拟机的名称
    • IMAGE_PROJECT:包含映像的项目的名称
    • IMAGEIMAGE_FAMILY:指定以下其中一项:
      • IMAGE:您的自定义映像的名称

        例如 --image=my-debian-image-v2

      • IMAGE_FAMILY:如果您在自定义映像系列中创建了自定义映像,请指定该自定义映像系列。

        此项表示通过自定义映像系列中最新的未弃用的操作系统映像操作系统版本创建虚拟机。例如,如果您指定 --image-family=my-debian-family,则 Compute Engine 会通过自定义 my-debian-family 映像系列中最新的操作系统映像创建虚拟机。

    • SUBNET:如果子网和实例位于同一项目中,请将 SUBNET 替换为与该实例位于同一区域的子网的名称。

      如需在共享 VPC 网络中指定子网,请将 SUBNET 替换为以下格式的字符串:

              projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
             

      替换以下内容:

      • HOST_PROJECT_ID 是共享 VPC 宿主项目的项目 ID
      • REGION 是子网的区域
      • SUBNET_NAME 是子网的名称

      共享 VPC 网络的子网区域还必须与包含实例的区域相匹配。

后续步骤