通过机器映像创建实例

创建机器映像后,您就可以使用此机器映像创建新的虚拟机实例。如需详细了解机器映像的用途,请参阅何时使用机器映像

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

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

您可以使用 Google Cloud Consolegcloud 命令行工具Compute Engine API 来通过机器映像创建实例。

准备工作

通过机器映像创建实例(不使用替换)

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

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例
  3. 点击通过机器映像新建虚拟机实例
  4. 选择您的机器映像,然后点击继续
  5. 为您的实例指定名称。
  6. 点击创建

gcloud

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

gcloud beta 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 beta compute instances create my-instance \
    --zone us-east1-b \
    --source-machine-image my-machine-image

创建新实例后,您将获得类似于以下内容的输出:

Created [https://www.googleapis.com/compute/beta/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

API

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

POST https://compute.googleapis.com/compute/beta/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

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

如果要通过位于其他项目中的机器映像创建实例,您需要确保可以访问该机器映像并能够替换新实例上的服务帐号属性。以下部分概述了如何使用 gcloud 命令行工具通过位于其他项目中的机器映像创建实例。

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

    可以授予对源项目或机器映像的权限。如需使用 gcloud 命令行工具授予对机器映像的权限,请运行以下命令:

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

    替换以下内容:

    • MACHINE_IMAGE_PROJECT:包含源机器映像的项目的 ID。
    • MACHINE_IMAGE_NAME:要向其中添加权限绑定的机器映像的名称。
    • EMAIL:正在创建虚拟机的 serviceAccountuser 的电子邮件地址。确保电子邮件的格式设置为包含所需的前缀,且前缀必须为以下其中一项:

      • user: 如果电子邮件地址与用户帐号关联,请指定此前缀。
      • serviceAccount: 如果电子邮件地址与服务帐号关联,请指定此前缀。例如 serviceAccount:123456789000-compute@developer.gserviceaccount.com

    示例

    例如,要在名为 my-machine-image 的机器映像与服务帐号电子邮件地址 123456789000-compute@developer.gserviceaccount.com 之间添加 compute.admin 绑定。

    gcloud beta 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 beta compute instances create 命令可以通过机器映像创建实例。

    gcloud beta compute instances create VM_NAME \
        --project=VM_PROJECT \
        --zone ZONE \
        --source-machine-image projects/PROJECT_ID/global/machineImages/MACHINE_IMAGE_NAME \
        --service-account service-account-email
    

    替换以下内容:

    • VM_PROJECT:您要创建新虚拟机的项目的 ID。
    • VM_NAME:新虚拟机的名称。
    • ZONE:您要用于新虚拟机的区域
    • PROJECT_ID:机器映像所在项目的 ID。
    • MACHINE_IMAGE_NAME:要用于创建虚拟机的机器映像。
    • SERVICE_ACCOUNT:与虚拟机项目关联的服务帐号电子邮件地址。

      示例

      例如,通过位于项目 vm-project 且名为 my-machine-image 的机器映像,在 us-east1-b 区域中创建名为 my-instance 的实例。

      service-account 标记指定虚拟机项目的服务帐号。如果您未提供此标记,则无法在两个项目之间共享源服务帐号,并且操作将失败。

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

      创建新实例后,您将获得类似于以下内容的输出:

      Created [https://www.googleapis.com/compute/beta/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
      

通过机器映像创建实例(使用属性替换)

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

您可以替换机器映像中的大多数实例属性。使用替换功能时,请注意以下说明:

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

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

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

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例
  3. 点击通过机器映像新建虚拟机实例
  4. 选择您的机器映像,然后点击继续
  5. 为您的实例指定名称。
  6. 更新您要更改的属性。
  7. 点击创建。请参阅创建实例,了解其他设置详情。

gcloud

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

例如,您可以使用以下 gcloud 命令通过名为 my-machine-image 的机器映像在 us-east1-b 地区中创建一个名为 my-instance 的实例。 在此示例中,将应用替换以更改机器类型并停止维护政策。

gcloud beta compute instances create my-instance \
    --zone us-east1-b \
    --source-machine-image my-machine-image \
    --machine-type e2-standard-2 \
    --maintenance-policy TERMINATE

API

如需在实例创建期间替换机器映像属性,请使用 instances.insert() API 并在请求正文中提供您要替换的所有字段。

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

POST https://compute.googleapis.com/compute/beta/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 类型,也会被视为重复字段。

后续步骤