创建实例模板

本页面介绍如何创建和管理实例模板。通过实例模板,您可以指定在创建虚拟机 (VM) 实例时要使用的机器类型、启动磁盘映像、网络和其他虚拟机属性。

您可以使用实例模板在代管式实例组 (MIG) 中创建实例,或创建单个虚拟机

准备工作

限制

gcloud 工具和 API 支持实例模板中位于 nic0 以外的接口的共享 VPC,但 Cloud Console 不支持。

创建新的实例模板

您在创建单个虚拟机实例的请求中指定的大多数虚拟机属性也可以为实例模板指定,包括任何虚拟机元数据、启动脚本、永久性磁盘、服务帐号等等。您必须指定机器类型、启动磁盘和网络。

通过 Google Cloud Consolegcloud 命令行工具API 创建实例模板。

控制台

  1. 在 Cloud Console 中,转到实例模板页面。

    转到“实例模板”

  2. 点击创建实例模板

  3. 为以下字段输入值,或接受默认值。默认值会根据您所选的机器系列而变化。

    • 机器类型
    • 图片
    • 启动磁盘
    • VPC 网络
    • IP 地址
  4. 可选:如果您选择了支持安全强化型虚拟机的映像,请更改虚拟机的安全强化型虚拟机设置:

    1. 管理、安全、磁盘、网络、单独租用下,点击安全标签页。
    2. 如果您要停用安全启动,请清除开启安全启动复选框。安全启动功能可帮助保护您的虚拟机实例免受启动级和内核级恶意软件和 rootkit 的攻击。如需了解详情,请参阅安全启动
    3. 如果您要停用虚拟可信平台模块 (vTPM),请清除开启 vTPM 复选框。vTPM 将启用测量启动,该功能可验证虚拟机预启动和启动完整性。如需了解详情,请参阅虚拟可信平台模块 (vTPM)

    4. 如果您要停用完整性监控,请取消选中开启完整性监控复选框。借助完整性监控功能,您可以使用 Cloud Monitoring 监控安全强化型虚拟机实例的启动完整性。如需了解详情,请参阅完整性监控

  5. 可选:在管理、安全、磁盘、网络、单独租用下,点击相应标签页以进一步自定义模板。例如,您最多可以添加 15 个辅助非启动磁盘。

  6. 可选:点击等效 REST 以查看 REST 请求正文,其中包括您的实例模板的 JSON 表示法

  7. 点击创建以创建模板。

gcloud

gcloud compute 中,使用 instance-templates create 命令创建实例模板。

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME

INSTANCE_TEMPLATE_NAME 替换为实例模板的名称。

如果您未提供明确的模板设置,gcloud compute 将使用以下默认值:

  • 机器类型:机器类型,例如 n1-standard-1
  • 映像:最新的 Debian 映像
  • 启动磁盘:以虚拟机命名的新标准启动磁盘
  • 网络:默认 VPC 网络
  • IP 地址:临时外部 IP 地址

您也可以明确提供这些配置设置。例如:

gcloud compute instance-templates create example-template-custom \
    --machine-type=e2-standard-4 \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --boot-disk-size=250GB

您最多可以添加 15 个辅助非启动磁盘。为您创建的每个辅助磁盘指定 --create-disk 标志。如需通过公共映像或库存映像创建辅助磁盘,请在 --create-disk 标志中指定 imageimage-project 属性。如需创建空白磁盘,请勿包含这些属性。另外,您可以根据需要添加磁盘 sizetype 属性。

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --create-disk= \
        {--image=DISK_IMAGE | --image-family=DISK_IMAGE_FAMILY}, \
        image-project=DISK_IMAGE_PROJECT, \
        size=SIZE_GB

请替换以下内容:

  • INSTANCE_TEMPLATE_NAME:新模板的名称

  • DISK_IMAGEDISK_IMAGE_FAMILY:指定以下其中一项:
    • DISK_IMAGE:您要用作非启动磁盘的映像的名称
    • DISK_IMAGE_FAMILY:要用作非启动磁盘的映像系列

      如需详细了解映像系列,请参阅在 Compute Engine 上使用映像系列时的最佳做法

  • 对于空白磁盘,请勿指定 image 属性。

  • DISK_IMAGE_PROJECT:映像所属的映像项目

    对于空白磁盘,请勿指定 image-project 属性。如需详细了解公共映像,请参阅公共映像

  • SIZE_GB:辅助磁盘的大小

如果选择支持受防护的虚拟机的映像,则可以选择使用以下标志之一更改实例的受防护的虚拟机设置:

  • --no-shielded-secure-boot:关闭安全启动

    安全启动功能可帮助保护您的虚拟机实例免受启动级和内核级恶意软件和 rootkit 的攻击。如需了解详情,请参阅安全启动

  • --no-shielded-vtpm:关闭虚拟可信平台模块 (vTPM)

    vTPM 将启用测量启动,该功能可验证虚拟机预启动和启动完整性。如需了解详情,请参阅虚拟可信平台模块 (vTPM)

  • --no-shielded-integrity-monitoring:关闭完整性监控

    借助完整性监控功能,您可以使用 Cloud Monitoring 监控安全强化型虚拟机实例的启动完整性。如需了解详情,请参阅完整性监控

如需查看所有可用子命令和标志的列表,请参阅 instance-templates 参考文档

采用了默认配置设置的模板可能如下所示:

gcloud compute instance-templates describe example-template
creationTimestamp: '2019-09-10T16:18:32.042-07:00'
description: ''
id: '6057583701980539406'
kind: compute#instanceTemplate
name: example-template
properties:
  canIpForward: false
  disks:
  - autoDelete: true
    boot: true
    initializeParams:
      sourceImage: https://compute.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-10
    kind: compute#attachedDisk
    mode: READ_WRITE
    type: PERSISTENT
  machineType: e2-standard-2
  networkInterfaces:
  - accessConfigs:
    - kind: compute#accessConfig
      name: external-nat
      type: ONE_TO_ONE_NAT
    network: https://compute.googleapis.com/compute/v1/projects/myproject/global/networks/default
  scheduling:
    automaticRestart: true
    onHostMaintenance: MIGRATE
  serviceAccounts:
  - email: default
    scopes:
    - https://www.googleapis.com/auth/devstorage.read_only
selfLink: https://compute.googleapis.com/compute/v1/projects/myproject/global/instanceTemplates/example-template

API

如需创建实例模板,请向 instanceTemplates.insert 方法发出 POST 请求:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates

PROJECT_ID 替换为项目 ID。

在请求正文中,提供模板属性:

{
  "name": "INSTANCE_TEMPLATE_NAME"
  "properties": {
    "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
    "networkInterfaces": [
      {
        "network": "global/networks/default",
        "accessConfigs":
        [
          {
            "name": "external-IP",
            "type": "ONE_TO_ONE_NAT"
          }
        ]
      }
    ],
    "disks":
    [
      {
        "type": "PERSISTENT",
        "boot": true,
        "mode": "READ_WRITE",
        "initializeParams":
        {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ]
  }
}

请替换以下内容:

  • INSTANCE_TEMPLATE_NAME:实例模板的名称
  • ZONE:虚拟机所在的可用区
  • MACHINE_TYPE:虚拟机的机器类型

  • IMAGE_PROJECT:映像所属的映像项目

    如需详细了解公共映像,请参阅公共映像

  • IMAGEIMAGE_FAMILY:指定以下其中一项:
    • IMAGE:映像的特定版本

      例如 "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309"

    • IMAGE_FAMILY映像系列

      此项表示通过最新的未弃用的操作系统映像创建虚拟机。 例如,如果您指定 "sourceImage": "projects/debian-cloud/global/images/family/debian-10",则 Compute Engine 会通过 Debian 10 映像系列中最新版本的操作系统映像创建虚拟机。

      如需详细了解映像系列,请参阅在 Compute Engine 上使用映像系列时的最佳做法

您可以为 disks 属性指定以下选项之一:

  • 指定 initializeParams 可为每个实例创建永久性启动磁盘。通过对每个额外磁盘使用 initializeParams 属性,最多可以添加 15 个辅助非启动磁盘。您可以使用 sourceImage 中的公共映像或自定义映像(或映像系列)创建磁盘,如上述示例所示。如需添加空白磁盘,请勿指定 sourceImage

  • 指定 source 可挂接现有的永久性启动磁盘。如果挂接现有启动磁盘,则只能通过模板创建一个实例。

另外,您也可以视需要为 initializeParams 指定 diskSizeGbdiskTypelabels 属性,为 source 指定 diskSizeGb 属性。

如果选择支持安全强化型虚拟机的映像,则可以视需要使用以下布尔值请求正文项更改虚拟机的安全强化型虚拟机设置:

  • enableSecureBoot:开启或关闭安全启动

    安全启动功能可帮助保护您的虚拟机实例免受启动级和内核级恶意软件和 rootkit 的攻击。如需了解详情,请参阅安全启动

  • enableVtpm:开启或关闭虚拟可信平台模块 (vTPM)

    vTPM 将启用测量启动,该功能可验证虚拟机预启动和启动完整性。如需了解详情,请参阅虚拟可信平台模块 (vTPM)

  • enableIntegrityMonitoring:开启或关闭完整性监控

    借助完整性监控功能,您可以使用 Cloud Monitoring 报告监控和验证安全强化型虚拟机实例的运行时启动完整性。如需了解详情,请参阅完整性监控

如需详细了解请求参数,请参阅 instanceTemplates.insert 方法

根据现有实例创建实例模板

您可以使用 Compute Engine API 或 gcloud 工具将现有虚拟机实例的配置另存为实例模板。 (可选)您可以覆盖模板中定义实例的来源磁盘的方式。

如果您需要覆盖其他属性,请先根据现有实例创建一个实例模板,然后借助其他覆盖创建一个类似模板

gcloud

使用带有 --source-instance--source-instance-zone 标志的 gcloud instance-templates create 命令

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --source-instance=SOURCE_INSTANCE \
    --source-instance-zone=SOURCE_INSTANCE_ZONE \

如需替换如何定义源实例的磁盘,请添加一个或多个 --configure-disk 标志:

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --source-instance=SOURCE_INSTANCE \
    --source-instance-zone=SOURCE_INSTANCE_ZONE \
    --configure-disk= \
        device-name=SOURCE_DISK, \
        instantiate-from=INSTANTIATE_FROM, \
        auto-delete=AUTO_DELETE

请替换以下内容:

  • INSTANCE_TEMPLATE_NAME 是要创建的模板的名称。
  • SOURCE_INSTANCE 是要用作新模板的模型的实例名称。
  • SOURCE_INSTANCE_ZONE 是包含来源实例的地区。
  • SOURCE_DISK 是您要在模板中替换的来源实例磁盘的名称。
  • INSTANTIATE_FROM 指定是否添加磁盘以及要使用的映像。有效值取决于磁盘类型,具体如下:

    • source-imagesource-image-family(仅对启动磁盘和其他永久性读写磁盘有效)。
    • custom-image(仅对启动磁盘和其他永久性读写磁盘有效)。如果已指定,还必须指定自定义映像的路径或网址,如以下示例所示。 或者,您还可以使用以下格式指定映像系列:

      projects/exampleproject/global/images/family/IMAGE_FAMILY_NAME

      IMAGE_FAMILY_NAME 替换为映像系列的名称。

    • attach-read-only(仅对只读磁盘有效)。

    • blank(仅对非启动永久性磁盘和本地 SSD 有效)。如果已指定,则在使用模板创建新实例时,将创建未格式化的该磁盘。您必须先在启动脚本中格式化并装载该磁盘,然后才能在可扩缩的设置中使用。

    • do-not-include(仅对非启动永久性磁盘和只读磁盘有效)。

    • blank(仅对非启动永久性磁盘和只读磁盘有效)。

  • AUTO_DELETE 指定删除实例时是否自动删除磁盘。有效值为 falsenotrueyes

例如,以下命令会根据 my-source-instance 创建一个实例模板,同时可以选择使用 data-disk-a 的原始映像,但将 auto-delete 设置为 true,并将 data-disk-b 替换为自定义映像。

gcloud compute instance-templates create my-instance-template  \
    --source-instance=my-source-instance \
    --configure-disk=device-name=data-disk-a,instantiate-from=source-image, \
      auto-delete=true
    --configure-disk=device-name=data-disk-b,instantiate-from=custom-image, \
      custom-image=projects/cps-cloud/global/images/cos-89-16108-403-15

API

调用 instanceTemplates.insert 方法并指定 sourceInstance 字段。如需替换如何定义源实例的磁盘,请添加一个或多个 diskConfigs 字段。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "sourceInstance": "zones/SOURCE_INSTANCE_ZONE/instances/SOURCE_INSTANCE",
  "sourceInstanceParams": {
    "diskConfigs": [
      {
        "deviceName": "SOURCE_DISK",
        "instantiateFrom": "INSTANTIATE_FROM",
        "autoDelete": false
      }
    ]
  }
}

请替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • INSTANCE_TEMPLATE_NAME:新模板的名称
  • SOURCE_INSTANCE_ZONE:来源实例所在的可用区
  • SOURCE_INSTANCE:要用作此实例模板模型的来源实例的名称
  • SOURCE_DISK:您要在模板中替换的来源实例磁盘的名称
  • INSTANTIATE_FROM 指定是否添加磁盘以及要使用的映像

    有效值取决于磁盘类型,具体如下:

    • source-imagesource-image-family(仅对启动磁盘和其他永久性读写磁盘有效)。
    • custom-image(仅对启动磁盘和其他永久性读写磁盘有效)。如果已指定,还必须指定自定义映像的路径或网址,如以下示例所示。 或者,您还可以使用以下格式指定映像系列:

      projects/exampleproject/global/images/family/IMAGE_FAMILY_NAME

      IMAGE_FAMILY_NAME 替换为映像系列的名称。

    • attach-read-only(仅对只读磁盘有效)。

    • blank(仅对非启动永久性磁盘和本地 SSD 有效)。如果已指定,则在使用模板创建新实例时,将创建未格式化的该磁盘。您必须先在启动脚本中格式化并装载该磁盘,然后才能在可扩缩的设置中使用。

    • do-not-include(仅对非启动永久性磁盘和只读磁盘有效)。

以下示例将根据 my-source-instance 创建新的实例模板。在实例模板中,data-disk-a 的映像被替换为 projects/cos-cloud/global/images/cos-89-16108-403-15

POST https://compute.googleapis.com/compute/v1/projects/my_project/global/instanceTemplates

{
  "name": "my-instance-template",
  "sourceInstance": "zones/us-central1-a/instances/my-source-instance",
  "sourceInstanceParams":
  {
    "diskConfigs":
    [
      {
        "deviceName": "data-disk-a",
        "instantiateFrom": "custom-image",
        "customImage": "projects/cos-cloud/global/images/cos-89-16108-403-15"
      }
    ]
  }
}

下表显示了一些选项,用于覆盖在模板中定义磁盘的方式。

磁盘类型 选项
启动磁盘
  • [默认] 使用用于在来源实例中创建启动磁盘的相同来源映像或映像系列。
  • 使用前面示例中所述的任何映像(自定义或公共)的网址,或使用以下格式指定映像系列:

    projects/exampleproject/global/images/family/IMAGE_FAMILY_NAME

其他读写永久性磁盘
  • [默认] 使用用于在来源实例中创建磁盘的来源映像/来源映像系列。注意:如果来源实例的磁盘没有来源映像/来源映像系列属性,则系统会将其作为空白磁盘添加到模板中。
  • 使用前面示例中所述的任何映像(自定义或公共)的网址,或使用以下格式指定映像系列:

    projects/exampleproject/global/images/family/IMAGE_FAMILY_NAME

  • 在模板中使用空白磁盘。使用模板创建新实例时,将创建未格式化的此磁盘。 您必须先在启动脚本中格式化并装载该磁盘,然后才能在可扩缩的设置中使用。
  • 不添加此磁盘。
只读磁盘
  • [默认] 添加处于只读模式的磁盘。
  • 不添加此磁盘。
本地 SSD
  • [默认] 添加空白本地 SSD。使用模板创建新实例时,将创建未格式化的此磁盘。您必须先在启动脚本中格式化并装载该磁盘,然后才能在可扩缩的设置中使用。

对于每个磁盘,您还可以替换 auto-delete 特性 (Attribute),以指定在删除关联实例时是否应删除该磁盘。

默认情况下,如果未指定覆盖选项,则模板中的磁盘配置与来源实例一致。

根据现有模板创建实例模板

您无法更新现有实例模板。但是,如果实例模板过期或您需要做出更改,则可以使用控制台,创建另一个具有类似属性的实例模板。

  1. 转到实例模板页面。

    转到“实例模板”

  2. 点击您要复制和更新的实例模板。

  3. 点击创建类似模板

  4. 在新模板中更新配置。

  5. 点击创建

使用容器映像创建实例模板

您可以在实例模板中指定容器映像。默认情况下,Compute Engine 还会在模板中添加安装了 Docker 的 Container-Optimized OS 映像。当您使用模板创建新实例时,容器会在实例启动时自动启动。

控制台

  1. 转到实例模板页面。

    转到“实例模板”

  2. 点击创建实例模板

  3. 容器部分中,选中将一个容器映像部署到此虚拟机实例 (Deploy a container image to this VM instance) 复选框。

  4. 指定要使用的容器映像

    • 您可以指定 Container Registry 或 Artifact Registry 中的映像。例如:
      • gcr.io/cloud-marketplace/google/nginx1:1.12 用于从 Google Cloud Marketplace 中选择 NGINX 1.12 容器映像。
      • us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 用于选择 Artifact Registry 中存储的示例 hello-app 映像。
    • 如果您使用 Docker Hub 中的容器映像,请始终指定完整的 Docker 映像名称。例如,指定以下映像名称以部署一个 Apache 容器映像:docker.io/httpd:2.4
  5. (可选)点击高级容器选项。如需了解详情,请参阅配置选项以便运行容器

  6. 点击创建

gcloud

使用 gcloud compute instance-templates create-with-container 命令

gcloud compute instance-templates create-with-container INSTANCE_TEMPLATE_NAME \
     --container-image=CONTAINER_IMAGE

替换以下内容:

  • INSTANCE_TEMPLATE_NAME:要创建的模板的名称。
  • CONTAINER_IMAGE:要使用的容器映像的全名。

例如,以下命令会创建一个名为 nginx-vm 的新实例模板。当虚拟机启动时,使用此模板创建的虚拟机实例将启动并运行容器映像 gcr.io/cloud-marketplace/google/nginx1:1.12

gcloud compute instance-templates create-with-container nginx-vm \
     --container-image=gcr.io/cloud-marketplace/google/nginx1:1.12

此外,您还可以配置选项以便运行容器

创建可指定子网的实例模板

使用 --subnet 标志可将通过模板创建的实例置入您选择的子网中。--subnet 标志需要与 --region 标志搭配使用。

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --region=REGION \
    --subnet=SUBNET_NAME_OR_URL

请替换以下内容:

  • INSTANCE_TEMPLATE_NAME:实例模板的名称
  • REGION:子网的区域
  • SUBNET_NAME_OR_URL:子网的名称或网址

以下示例会创建一个名为 template-qa 的模板,该模板仅在 subnet-us-qa 子网中创建实例。

gcloud compute instance-templates create template-qa \
    --region=us-central1 \
    --subnet=subnet-us-qa

Created [https://compute.googleapis.com/compute/latest/projects/PROJECT_ID/global/instanceTemplates/template-qa].
NAME        MACHINE_TYPE  PREEMPTIBLE CREATION_TIMESTAMP
template-qa e2-standard-2             2019-12-23T20:34:00.791-07:00

如果使用此模板为 MIG(无论是否启用自动扩缩功能)创建实例,则系统会自动在指定的区域和子网中创建实例。这样一来,您就可以控制为了进行负载平衡而创建的新实例的子网。

在实例模板中使用自定义或公共映像

您可以为实例模板使用自定义映像或公共映像:

  • 自定义映像由于 MIG 用于频繁地添加和移除实例,因此创建自定义映像并在实例模板中指定该映像会很有用。您可以在映像中做好准备,使其配备您的实例需要的应用和设置,这样您就不必在 MIG 中的各个虚拟机上手动配置这几项内容。

  • 公共映像。您可以创建一个实例模板,该模板使用公共映像启动脚本,可在实例开始运行后为其做好准备。

与使用启动脚本的虚拟机相比,自定义映像的确定性更高,且启动速度更快。但是,启动脚本更加灵活,可让您更轻松地更新实例中的应用和设置。

如果您要使用映像系列管理映像,则可以在实例模板中指定自定义或公共映像系列的名称。如需详细了解映像系列,请参阅在 Compute Engine 上使用映像系列时的最佳做法

更新实例模板

您无法更新现有实例模板,也无法在创建实例模板后对其进行更改。如果实例模板过期,或者您需要更改配置,请创建一个新的实例模板。

后续步骤