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

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

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

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

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

准备工作

通过机器映像创建虚拟机(无替换)

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

控制台

  1. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  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='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 的机器映像与服务帐号电子邮件地址 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_ID \
        --zone ZONE \
        --source-machine-image projects/MACHINE_PROJECT_ID/global/machineImages/MACHINE_IMAGE_NAME \
        --service-account SERVICE_ACCOUNT_EMAIL
    

    请替换以下内容:

    • VM_PROJECT_ID:要在其中创建虚拟机的项目的 ID。
    • VM_NAME:要创建的虚拟机的名称。
    • ZONE:虚拟机的可用区
    • MACHINE_PROJECT_ID:机器映像所在项目的 ID。
    • MACHINE_IMAGE_NAME:要从中创建虚拟机的机器映像。
    • SERVICE_ACCOUNT_EMAIL:正在创建虚拟机的 serviceAccount 的电子邮件地址。

      示例

      例如,通过位于项目 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. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  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 类型,也会被视为重复字段。

后续步骤