通过实例模板创建虚拟机实例

本页介绍如何使用实例模板创建虚拟机实例。实例模板是定义虚拟机实例属性的 API 资源。您可以在实例模板中定义机器类型、操作系统映像、永久性磁盘配置、元数据、启动脚本等属性,然后使用实例模板创建单个虚拟机实例或托管实例组

从实例模板创建虚拟机实例时,默认行为是创建与模板中指定的属性相同的虚拟机实例,但虚拟机实例名称和实例所在的地区除外。或者,如果要更改实例模板的特定属性以供特定用途,还可以选择在实例创建期间替换某些字段。

本文档假定您具有现成可使用的实例模板。如果您没有实例模板,请按照说明创建新的实例模板

准备工作

通过实例模板创建虚拟机实例

要完全按照实例模板中的描述创建实例,请按照以下说明操作。

Console

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

    转到“虚拟机实例”页面

  2. 点击创建实例
  3. 点击使用模板新建虚拟机实例
  4. 选择模板,然后点击继续
  5. 为实例指定一个名称,并根据需要进行进一步自定义。
  6. 点击创建。请参阅创建实例,了解其他设置详情。

gcloud

使用 gcloud compute 时,请使用您用来创建普通实例的同一 instances create 命令,不过要添加 --source-instance-template 标志:

gcloud compute instances create [INSTANCE_NAME] --source-instance-template [INSTANCE_TEMPLATE_NAME]

其中:

  • [INSTANCE_NAME] 是实例的名称。
  • [INSTANCE_TEMPLATE_NAME] 是要使用的实例模板的名称。

    例如:

    gcloud compute instances create example-instance --source-instance-template my-instance-template

API

在 API 中,构造一个用于创建实例的普通请求,但包含 sourceInstanceTemplate 查询参数,后跟实例模板的限定路径。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances?sourceInstanceTemplate=[INSTANCE_TEMPLATE_NAME]

在请求正文中,提供虚拟机实例的 name

{ "name": "example-instance" }

例如,以下代码段包含模板的完全限定路径:https://www.googleapis.com/compute/v1/projects/myproject/global/instanceTemplates/example-instance-template

POST https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances?sourceInstanceTemplate=https://www.googleapis.com/compute/v1/projects/myproject/global/instanceTemplates/example-instance-template

{ "name": "example-instance" }

使用替换从实例模板创建虚拟机实例

使用实例模板启动虚拟机实例时,默认行为是完全按照实例模板中的描述创建虚拟机实例,但实例名称和地区除外。

如果您希望主要根据实例模板创建实例,但伴随一些更改,则可以使用替换行为。要使用替换行为,请在创建实例时传入要为现有实例模板替换的属性。

gcloud

使用 gcloud 工具发出请求,以创建带有 --source-instance-template 标志的实例,并使用适当的 gcloud 标志替换任何属性。要查看适用标志列表,请参阅 gcloud 参考

例如,要替换机器类型、元数据、操作系统、根永久性磁盘和实例模板的辅助磁盘,请提供以下标志:

gcloud compute instances create example-instance --source-instance-template example-instance \
    --machine-type n1-standard-2 --image-family debian-8 --image-project debian-cloud \
    --metadata bread=butter --disk=boot=no,name=my-override-disk

API

在 API 中,使用 sourceInstanceTemplate 查询参数,并在构造用于创建实例的普通请求时在请求正文中提供要替换的任何字段。

API 中的替换行为遵循 JSON 合并补丁规则,如 RFC 7396 所述。

具体而言:

  • 如果替换原始字段,则实例模板中的相应原始字段将替换为请求中的原始字段值。原始字段包括 machineTypesourceImagename 等等。
  • 如果替换重复字段,则该属性的所有重复值将替换为请求中提供的相应值。重复字段通常是 list 类型的属性。例如,disksnetworkInterfaces 是重复字段。
  • 如果替换 nested object,则实例模板中的对象将与请求中的相应对象规范合并。请注意,如果嵌套对象位于重复字段中,则将按照重复字段的规则处理该字段。标签是此规则的一个例外,即使它是 object 类型,也会被视为重复字段。

例如,假设您有一个带有两个非引导磁盘的实例模板,但您想要替换其中一个磁盘。那么必须在请求中提供整个 disks 规范,包括要保留的任何磁盘。

此请求的网址:

POST https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances?sourceInstanceTemplate=https://www.googleapis.com/compute/v1/projects/myproject/global/instanceTemplates/example-instance-template

请求正文:

{
  "disks": [
    {
      # Since you are overriding the repeated disk property, you must
      # specify a boot disk in the request, even if it is already
      # specified in the instance template
      "autoDelete": true,
      "boot": true,
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/family/debian-8"
      },
      "mode": "READ_WRITE",
      "type": "PERSISTENT"
    },
    {
      # New disk you want to use
      "autoDelete": false,
      "boot": false,
      "mode": "READ_WRITE",
      "source": "zones/us-central1-f/disks/my-override-disk",
      "type": "PERSISTENT"
    },
    {
       # Assume this disk is already specified in instance template, but
       # you must specify it again since you are overriding the disks
       # property
      "autoDelete": false,
      "boot": false,
      "mode": "READ_WRITE",

      "source": "zones/us-central1-f/disks/my-other-disk-to-keep",
      "type": "PERSISTENT"
    }
  ],
  "machineType": "zones/us-central1-f/machineTypes/n1-standard-2",
  "name": "example-instance"
}

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档