创建机器映像后,您就可以使用此机器映像创建新的虚拟机实例。如需详细了解机器映像的用途,请参阅何时使用机器映像。
机器映像包含创建实例所需的大部分信息和数据。
机器映像不可更改。不过,在通过机器映像创建实例时,您可以替换几乎所有机器映像属性。
您可以使用 Google Cloud Console、gcloud
命令行工具或 Compute Engine API 来通过机器映像创建实例。
准备工作
- 如果您要使用本指南中的命令行示例,请执行以下操作:
- 安装或更新到 gcloud 命令行工具的最新版本。
- 设置默认区域和可用区。
- 如果您要使用本指南中的 API 示例,请设置 API 访问权限。
通过机器映像创建虚拟机(无替换)
如果您要创建完全基于机器映像的虚拟机,且不更改属性,请使用此方法。
控制台
在 Google Cloud Console 中,转到虚拟机实例页面。
点击创建实例。
点击通过机器映像新建虚拟机实例。
选择您的机器映像,然后点击继续。
为您的实例指定名称。
点击创建。
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
命令行工具通过位于其他项目的机器映像创建虚拟机。
-
可以授予对源项目或机器映像的权限。如需使用
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
:正在创建虚拟机的serviceAccount
或user
的电子邮件地址。确保电子邮件的格式设置为包含所需的前缀,且前缀必须为以下其中一项: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'
使用
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 地址。
- 如果在创建新实例时来源虚拟机实例仍存在,则新实例无法使用与来源实例相同的名称和可用区。
如果用于生成机器映像的来源虚拟机和新虚拟机属于同一项目但不同区域,则以下规则适用:
- 您必须替换新虚拟机的所有可以可用区和区域资源。例如,如果您通过来源实例属于其他区域的机器映像创建虚拟机实例,则需要替换子网和区域防火墙规则等区域资源。但是,您不需要替换负载平衡器和服务帐号等全球资源,除非您想要修改这些资源。
控制台
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 所述。总的来说,以下规则适用:
- 如果您替换原初字段,则机器映像中的相应原初字段会替换为请求中的原初字段值。原初字段包含
machineType
和name
等参数。 - 如果您替换重复字段,则对应属性的所有重复值都会替换为请求中提供的相应值。重复字段通常是
list
类型的属性。例如,disks
和networkInterfaces
是重复字段。 - 如果您替换
nested object
,则机器映像中的对象会与请求中的相应对象规范合并。请注意,如果嵌套对象位于重复字段中,则将按照重复字段的规则处理该字段。标签是此规则的一个例外,即使它是object
类型,也会被视为重复字段。