通过机器映像创建虚拟机实例


创建机器映像后,您可以使用它来创建源虚拟机实例的副本。如需详细了解机器映像的用途,请参阅何时使用机器映像

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

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

您可以使用 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. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

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

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

        安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

        gcloud init

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

限制

通过机器映像创建虚拟机时,存在以下限制:

  • 在 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. 选择您的机器映像,然后点击继续

  4. 可选:自定义虚拟机详情。

  5. 点击创建

gcloud

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

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

请替换以下内容:

  • VM_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": "VM_NAME",
  "sourceMachineImage": "SOURCE_MACHINE_IMAGE_URL"
}

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • ZONE:虚拟机的可用区
  • VM_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() API 并在请求正文中提供您要替换的所有字段。

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

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

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

请替换以下内容:

  • PROJECT_ID项目 ID
  • ZONE:虚拟机的可用区
  • VM_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

替换行为

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

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

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

POST /compute/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 命令:

    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 VM_NAME \
        --project=VM_PROJECT_ID \
        --zone=ZONE \
        --source-machine-image=projects/MACHINE_IMAGE_PROJECT/global/machineImages/MACHINE_IMAGE_NAME \
        --service-account=SERVICE_ACCOUNT_EMAIL
        --subnet=SUBNET
    

    请替换以下内容:

    • VM_PROJECT_ID:要在其中创建虚拟机的项目的 ID
    • VM_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
      

后续步骤