通过机器映像创建 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. Install the Google Cloud CLI, then initialize it by running the following command:

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

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

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 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

如需在实例创建期间替换机器映像属性,请构建对 instances.insert 方法POST 请求。在请求正文中,添加 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
      

后续步骤