通过机器映像创建 Compute Engine 实例


创建机器映像后,您可以使用它复制源计算实例。如需详细了解机器映像的用途,请参阅何时使用机器映像

机器映像包含克隆实例所需的大部分信息和数据。

机器映像不可更改。不过,在通过机器映像创建实例时,您可以替换几乎所有机器映像属性。

您可以使用Google Cloud 控制台Google Cloud CLIREST 通过机器映像创建实例。

准备工作

  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 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

    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.
    3. REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

所需的角色

如需获得通过机器映像创建 Compute Engine 实例所需的权限,请让您的管理员为您授予计算实例或项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

限制

通过机器映像创建实例时适用以下限制:

  • 您在 60 分钟内最多可以通过一个源机器映像创建 6 个实例。如果超出此限制,则实例创建操作将失败并返回如下所示的错误:

    Operation rate exceeded for resource 'projects/test/global/machineImages/machine-image-1'.
    Too frequent operations from the source resource.
    

    如需创建超过定义限制(60 分钟内 6 个实例)的更多实例,请通过源实例创建额外的机器映像,或通过新实例创建短期有效的机器映像。然后,您可以通过这些新机器映像创建所需数量的实例。

  • 您无法使用 Google Cloud 控制台通过机器映像创建挂接区域磁盘的实例。请使用 Google Cloud CLI 或 REST,并为每个挂接的区域级磁盘指定 replicaZonesdeviceName 参数。如需了解详情,请参阅通过机器映像创建实例(使用属性替换)

通过机器映像创建实例(不替换任何属性)

如果您要创建完全基于机器映像的实例,且不更改属性,请使用此方法。

控制台

  1. 在 Google Cloud 控制台中,前往创建实例页面。

    转到“创建实例”

  2. 虚拟机创建自… 菜单中,选择机器映像

  3. 在随即显示的基于机器映像创建虚拟机窗口中,执行以下操作:

    1. 选择机器映像。

    2. 要创建并启动该实例,请点击创建

gcloud

使用 gcloud compute instances create 命令可以通过机器映像创建实例。

gcloud compute instances create INSTANCE_NAME \
    --zone=ZONE \
    --source-machine-image=SOURCE_MACHINE_IMAGE_NAME

替换以下内容:

  • INSTANCE_NAME:实例的名称
  • ZONE:实例所在的可用区
  • SOURCE_MACHINE_IMAGE_NAME:用于创建实例的机器映像

示例

例如,您可以使用以下 gcloud 命令通过名为 my-machine-image 的机器映像在 us-east1-b 区域中创建一个名为 my-instance 的实例。

gcloud compute instances create my-instance \
    --zone=us-east1-b \
    --source-machine-image=my-machine-image

实例创建完成后,输出内容类似如下:

Created [https://www.googleapis.com/compute/v1/projects/project-12345/zones/us-east1-b/instances/my-instance].
NAME               ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
my-instance        us-east1-b  e2-standard-2               192.0.2.1   203.224.0.113  RUNNING

REST

在 API 中,构建对 instances.insert 方法的 POST 请求。在请求正文中,添加以下参数:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "INSTANCE_NAME",
  "sourceMachineImage": "SOURCE_MACHINE_IMAGE_URL"
}

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • ZONE:实例所在的可用区
  • INSTANCE_NAME:实例的名称。
  • SOURCE_MACHINE_IMAGE_URL:您要用于创建实例的机器映像的完整或部分网址。例如,如果您在名为 myProject 的项目中有一个名为 my-machine-image 的机器映像。以下网址有效:

    • https://www.googleapis.com/compute/v1/projects/myProject/global/machineImages/my-machine-image
    • projects/myProject/global/machineImages/my-machine-image
    • global/machineImages/my-machine-image

通过机器映像创建实例并替换属性

如果您希望主要基于机器映像创建实例,但稍作一些更改,则可以使用替换行为。如需使用替换行为,请在创建实例时传入特性以替换现有机器映像属性。

使用替换功能时,请注意以下说明:

  • 通过机器映像创建实例时,除磁盘名称外,您无法覆盖挂接磁盘的任何属性。
  • 您必须为每个挂接的区域级磁盘指定 replicaZones 参数,并提供该磁盘在机器映像中的 deviceName 参数。

  • 如果用于生成机器映像的来源实例和新实例属于同一项目和同一区域,则以下规则适用:

    • 来源实例和新实例的大多数属性都相同。不同的属性是自动分配的属性,例如临时 IP 地址。
    • 如果创建新实例时源实例仍存在,则新实例无法使用与源实例相同的名称和可用区。
  • 如果用于生成机器映像的来源实例和新实例属于同一项目但不同区域,则以下规则适用:

    • 您必须替换新实例的所有地区和区域资源。例如,如果您使用源实例位于其他区域的机器映像创建实例,则需要替换子网、区域防火墙规则等区域资源。但是,您不需要替换负载均衡器和服务账号等全球资源,除非您想要修改这些资源。

控制台

  1. 在 Google Cloud 控制台中,前往创建实例页面。

    转到“创建实例”

  2. 虚拟机创建自… 菜单中,选择机器映像

  3. 在随即显示的通过机器映像创建虚拟机窗口中,选择模板后点击 自定义

  4. 可选:指定其他配置选项。如需了解详情,请参阅实例创建期间的配置选项

  5. 要创建并启动该实例,请点击创建

gcloud

使用 gcloud compute instances create 命令可以通过机器映像创建实例并添加要替换的属性。

例如,您可以使用以下 gcloud 命令通过名为 my-machine-image 的机器映像在 us-east1-b 可用区中创建一个名为 my-instance 的虚拟机。在此示例中,系统会应用替换以更改机器类型、停止主机维护政策,以及配置名为 regional-disk-0 的区域级永久性磁盘。

gcloud compute instances create my-instance \
    --zone=us-east1-b \
    --source-machine-image=my-machine-image \
    --machine-type=e2-standard-2 \
    --maintenance-policy=TERMINATE \
    --create-disk=device-name=boot-device-0,boot=true,auto-delete=true \
    --create-disk=device-name=regional-disk-0,\
      replica-zones=^:^us-east1-b:us-east1-c,boot=false

REST

如需在实例创建期间替换机器映像属性,请构建 POST 请求并调用 instances.insert 方法。在请求正文中,添加 sourceMachineImage 参数以及您需要的所有替换值。您可以添加通常在实例创建过程中设置的任何属性。例如,如需替换机器类型,您的 API 调用将包含 machineType 参数。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "INSTANCE_NAME",
  "machineType": "zones/ZONE/machineTypes/NEW_MACHINE_TYPE",
  "sourceMachineImage": "SOURCE_MACHINE_IMAGE_URL"
}

替换以下内容:

  • PROJECT_ID项目 ID
  • ZONE:实例所在的可用区
  • INSTANCE_NAME:实例的名称。
  • NEW_MACHINE_TYPE:您要用于实例的机器类型
  • SOURCE_MACHINE_IMAGE_URL:您要用于创建实例的机器映像的完整或部分网址。例如,如果您在名为 myProject 的项目中有一个名为 my-machine-image 的机器映像。以下网址有效:

    • https://www.googleapis.com/compute/v1/projects/myProject/global/machineImages/my-machine-image
    • projects/myProject/global/machineImages/my-machine-image
    • global/machineImages/my-machine-image

替换行为

Compute Engine API 中的替换行为遵循 JSON 合并补丁规则,如 RFC 7396 所述。总的来说,以下规则适用:

  • 如果您替换了某个基本字段,则机器映像中的对应基本字段将替换为请求中的基本字段值。基本字段包含 machineTypename 等参数。
  • 如果您替换重复字段,则对应属性的所有重复值都会替换为请求中提供的相应值。重复字段通常是 list 类型的属性。例如,disksnetworkInterfaces 是重复字段。
  • 如果您替换 nested object,则机器映像中的对象会与请求中的相应对象规范合并。请注意,如果嵌套对象位于重复字段中,则将按照重复字段的规则处理该字段。标签是此规则的一个例外,即使它是 object 类型,也会被视为重复字段。

例如,如果您要通过机器映像创建虚拟机并使用虚拟机创建区域级磁盘,则可以对磁盘使用替换,以便指定 replicaZones 选项。由于 disks 字段是重复字段,因此您必须为所有挂接的磁盘和启动磁盘指定磁盘配置,而不仅仅是区域级磁盘。

POST https://compute.googleapis.com/compute/v1/projects/my-proj/zones/us-west1-a/instances
{
  "name": "vm-from-image",
  "sourceMachineImage": "global/machineImages/my-machine-image",
  "disks": [
    {
      "kind": "compute#attachedDisks",
      "boot": true,
      "autoDelete": true,
      "deviceName": "boot-device",
      "initializeParams": {
        "sourceImage": "projects/my-proj/global/images/my-image",
        "diskType": "projects/my-proj/zones/us-west1-a/diskTypes/pd-standard",
      }
    },
    {
      "kind": "compute#attachedDisk",
      "boot": false,
      "autoDelete": true,
      "deviceName": "regional-device-0",
      "initializeParams": {
         "diskType": "projects/my-proj/zones/us-west1-a/diskTypes/pd-standard",
         "replicaZones": [
            "projects/my-proj/zones/us-west1-a",
            "projects/my-proj/zones/us-west1-c"
         ]
      }
    }
  ]
}

使用来自其他项目的机器映像创建实例

在您通过其他项目的机器映像创建实例时,您可能无法访问与该源项目关联的服务账号。如果要通过位于其他项目中的机器映像创建实例,您需要确保可以访问该机器映像,并能够替换新实例上的服务账号属性。

如果您在使用共享 VPC 网络的项目之间共享机器映像,则必须在通过该机器映像创建实例时明确指定共享 VPC 详细信息。例如,在非宿主项目中创建实例时,请使用 --network--subnet--network-interface 标记提供宿主项目的共享 VPC 详细信息。

以下部分概述了如何使用 Google Cloud CLI 通过位于其他项目中的机器映像创建实例。

  1. 授予对其他项目中存储的机器映像的访问权限

    可以授予对源项目或机器映像的权限。使用 gcloud compute machine-images add-iam-policy-binding 命令授予对机器映像的权限。

    gcloud compute machine-images add-iam-policy-binding MACHINE_IMAGE_NAME \
        --project=MACHINE_IMAGE_PROJECT \
        --member='ACCOUNT_EMAIL' \
        --role='roles/compute.admin'
    

    替换以下内容:

    • MACHINE_IMAGE_PROJECT:包含来源机器映像的项目的 ID。
    • MACHINE_IMAGE_NAME:要向其中添加权限绑定的机器映像的名称。
    • ACCOUNT_EMAIL:正在创建实例的 serviceAccountuser 的邮箱。请确保邮箱格式包含所需前缀。前缀必须为以下项之一:

      • user: 如果邮箱与用户账号关联,请指定此前缀。例如 user:user@example.com
      • serviceAccount: 如果邮箱与服务账号关联,请指定此前缀。例如 serviceAccount:123456789000-compute@developer.gserviceaccount.com

    示例

    比方说,如果要将名为 my-machine-image 的机器映像的 compute.admin 绑定添加到服务账号邮箱 123456789000-compute@developer.gserviceaccount.com,请使用以下 gcloud CLI 命令:

    gcloud compute machine-images add-iam-policy-binding my-machine-image \
        --project=machine-image-project \
        --member='serviceAccount:123456789000-compute@developer.gserviceaccount.com' \
        --role='roles/compute.admin'
    
  2. 为运行 gcloud compute instances create 命令的用户授予与机器映像关联的服务账号的 Service Account User 角色 (roles/iam.serviceAccountUser)。

  3. 使用 gcloud compute instances create 命令可以通过机器映像创建实例。

    gcloud compute instances create INSTANCE_NAME \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE \
        --source-machine-image=projects/MACHINE_IMAGE_PROJECT/global/machineImages/MACHINE_IMAGE_NAME \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --subnet=SUBNET
    

    替换以下内容:

    • INSTANCE_PROJECT_ID:您希望创建实例的项目的 ID
    • INSTANCE_NAME:实例的名称
    • ZONE:实例所在的可用区
    • MACHINE_IMAGE_PROJECT:机器映像所在项目的 ID
    • MACHINE_IMAGE_NAME:用于创建实例的机器映像
    • SERVICE_ACCOUNT_EMAIL:要关联到实例的服务账号的邮箱
    • SUBNET:如果子网和实例位于同一项目中,请将 SUBNET 替换为与该实例位于同一区域的子网的名称

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

      projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
      

      请替换以下内容:

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

      示例

      例如,以下命令会使用名为 my-machine-image 的机器映像,在 us-east1-b 可用区的 vm-project 中创建一个名为 my-instance 的虚拟机。

      --service-account 标志指定要关联到新创建的虚拟机的服务账号。如果您未提供此标志,则无法在两个项目之间共享源服务账号,并且操作将失败。

      gcloud compute instances create my-instance \
       --project=vm-project \
       --zone=us-east1-b \
       --source-machine-image=projects/machine-image-project/global/machineImages/my-machine-image \
       --service-account=000123456789-compute@developer.gserviceaccount.com
      

      创建虚拟机后,会输出如下内容:

      Created [https://www.googleapis.com/compute/v1/projects/project-12345/zones/us-east1-b/instances/my-instance].
      NAME               ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
      my-instance        us-east1-b  e2-standard-2               192.0.2.1   203.224.0.113  RUNNING
      

后续步骤