批量创建虚拟机


如果您要创建大量相同且彼此独立的虚拟机实例,请使用 Google Cloud CLI 或 Compute Engine API 批量创建虚拟机。您可以跨一个区域中的所有可用区创建这些虚拟机,也可以将这些虚拟机分布在特定可用区中。

如需了解详情和相关限制,请参阅虚拟机批量创建简介

准备工作

  • 对于您打算创建的虚拟机和任何相关资源,请确保您有足够的配额所需权限
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以选择以下任一选项向 Compute Engine 进行身份验证:

    Select the tab for how you plan to use the samples on this page:

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

所需的角色

如需获得批量创建虚拟机所需的权限,请让您的管理员为您授予项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色包含批量创建虚拟机所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

批量创建虚拟机需要以下权限:

  • 针对项目的 compute.instances.create 权限
  • 使用自定义映像创建虚拟机:针对映像的 compute.images.useReadOnly 权限
  • 使用快照创建虚拟机:针对快照的 compute.snapshots.useReadOnly 权限
  • 使用实例模板创建虚拟机:针对实例模板的 compute.instanceTemplates.useReadOnly 权限
  • 为虚拟机分配旧版网络:针对项目的 compute.networks.use 权限
  • 为虚拟机指定静态 IP 地址:针对项目的 compute.addresses.use 权限
  • 使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的 compute.networks.useExternalIp 权限
  • 为虚拟机指定子网:针对项目或所选子网的 compute.subnetworks.use 权限
  • 在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的 compute.subnetworks.useExternalIp 权限
  • 为虚拟机设置虚拟机实例元数据:针对项目的 compute.instances.setMetadata 权限
  • 为虚拟机设置标记:针对虚拟机的 compute.instances.setTags 权限
  • 为虚拟机设置标签:针对虚拟机的 compute.instances.setLabels 权限
  • 为虚拟机设置要使用的服务账号:针对虚拟机的 compute.instances.setServiceAccount 权限
  • 为虚拟机创建新磁盘:针对项目的 compute.disks.create 权限
  • 以只读或读写模式挂接现有磁盘:针对磁盘的 compute.disks.use 权限
  • 以只读模式挂接现有磁盘:针对磁盘的 compute.disks.useReadOnly 权限

您也可以使用自定义角色或其他预定义角色来获取这些权限。

在一个区域中批量创建虚拟机

要在某个区域中批量创建虚拟机,请使用 gcloud CLI 或 Compute Engine API。

如果指定机器类型或支持其他硬件(如 GPU 或本地 SSD),则 Compute Engine 会将虚拟机放置在支持机器类型和其他硬件的区域的可用区中。

gcloud

要在某个区域中批量创建虚拟机,请使用以下 gcloud compute instances bulk create 命令

gcloud compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --region=REGION \
    --count=COUNT \
    [ --min-count=MIN_COUNT \ ]
    [--location-policy=LOCATION_POLICY \ ]
    [--target-distribution-shape=TARGET_DISTRIBUTION_SHAPE ]

替换以下内容:

  • NAME_PATTERN:虚拟机的名称模式。请使用哈希值 (#) 字符序列让 Compute Engine 将其替换为数字序列。例如,使用名称模式的 vm-# 可以生成名为 vm-1vm-2 等的虚拟机,最多为 --count 指定的虚拟机数量,必须小于或等于名称模式允许的虚拟机数量。

    使用名称模式时,Compute Engine 会尝试通过检查根据先前请求创建的现有虚拟机的名称来避免名称冲突。

  • PREDEFINED_NAMES:待创建虚拟机的预定义名称列表。如果使用此标志并指定 COUNT,则 COUNT 必须等于提供的名称数量。

  • REGION:要在其中创建虚拟机的区域。

  • COUNT:要创建的虚拟机数量。此值必须小于或等于 NAME_PATTERN 允许的虚拟机数量。或者,如果使用 --predefined-names,则无需指定 COUNT,但一旦使用,则必须等于提供的名称的数量。

  • MIN_COUNT:要创建的虚拟机数下限。下表根据您设置此标志的方式介绍了请求的行为:

    说明
    未设置 默认值为 COUNT。如果 Compute Engine 无法创建 COUNT 指定的虚拟机数量,则请求失败并且不会创建任何虚拟机。
    1 Compute Engine 会创建尽可能多的虚拟机,最多 COUNT 个。
    大于 1 且小于 COUNT Compute Engine 会创建至少 MIN_COUNT 个虚拟机,最多 COUNT 个虚拟机。如果无法创建 MIN_COUNT 个虚拟机,则请求失败并且不会创建任何虚拟机。
  • LOCATION_POLICY:要包含或排除的区域内可用区。使用键值对列表,将可用区作为键,政策作为值。政策的有效值为 allow(默认值)和 deny。以下是此标志的示例值:

    --location-policy=us-east1-b=allow,us-east1-c=deny
    
  • TARGET_DISTRIBUTION_SHAPE:虚拟机在指定可用区中的分布。使用 --location-policy 标志指定可用区。下表显示了此标志的有效值:

    说明
    ANY_SINGLE_ZONE 强制在单个可用区中部署虚拟机,并优先利用未使用的预留。使用此值可避免跨可用区网络出站流量或缩短网络延迟时间。此设置为默认值。
    BALANCED 尝试在该区域的所有可用区中均匀分布虚拟机。
    ANY 允许在一个区域中的多个可用区分布虚拟机。选择具有可用资源并最大化利用未使用的可用区级预留的可用区。

REST

要在某个区域中批量创建虚拟机,请使用以下 instances.bulkInsert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {},
    "PREDEFINED_NAME_2": {},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  "locationPolicy": {
    "LOCATION_POLICY"
    },
    "targetShape": "TARGET_DISTRIBUTION_SHAPE"
  ...
}

替换以下内容:

  • PROJECT_ID:项目 ID。

  • REGION:要在其中创建虚拟机的区域。

  • NAME_PATTERN:虚拟机的名称模式。指定此值或 perInstanceProperties。请使用哈希值 (#) 字符序列让 Compute Engine 将其替换为数字序列。例如,使用名称模式的 vm-# 可以生成名为 vm-1vm-2 等的虚拟机,最多为 --count 指定的虚拟机数量,必须小于或等于名称模式允许的虚拟机数量。

    使用名称模式时,Compute Engine 会尝试通过检查根据先前请求创建的现有虚拟机的名称来避免名称冲突。

  • PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...:待创建虚拟机的预定义名称列表。指定此值或 namePattern。如果使用此标志并指定 COUNT,则 COUNT 必须等于提供的名称数量。

  • COUNT:要创建的虚拟机数量。此值必须小于或等于 NAME_PATTERN 允许的虚拟机数量。或者,如果使用 perInstanceProperties,则无需指定 COUNT,但一旦使用,则必须等于提供的名称的数量。

  • MIN_COUNT:要创建的虚拟机数下限。下表根据您设置此标志的方式介绍了请求的行为:

    说明
    未设置 默认值为 COUNT。如果 Compute Engine 无法创建 COUNT 指定的虚拟机数量,则请求失败并且不会创建任何虚拟机。
    1 Compute Engine 会创建尽可能多的虚拟机,最多 COUNT 个。
    大于 1 且小于 COUNT Compute Engine 会创建至少 MIN_COUNT 个虚拟机,最多 COUNT 个虚拟机。如果无法创建 MIN_COUNT 个虚拟机,则请求失败并且不会创建任何虚拟机。
  • LOCATION_POLICY:要包含或排除的区域内可用区。使用键值对列表,将可用区作为键,政策作为值。政策的有效值为 ALLOW(默认值)和 DENY。以下是此字段的示例值:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • TARGET_DISTRIBUTION_SHAPE:虚拟机在指定可用区中的分布。使用 locationPolicy 字段指定可用区。下表显示了此字段的有效值:

    说明
    ANY_SINGLE_ZONE 强制在单个可用区中部署虚拟机,并优先利用未使用的预留。使用此值可避免跨可用区网络出站流量或缩短网络延迟时间。此设置为默认值。
    BALANCED 尝试在该区域的所有可用区中均匀分布虚拟机。
    ANY 允许在一个区域中的多个可用区分布虚拟机。选择具有可用资源并最大化利用未使用的可用区级预留的可用区。

在一个可用区中批量创建虚拟机

要在某个可用区中批量创建虚拟机,请使用 gcloud CLI 或 Compute Engine API。

gcloud

要在某个特定可用区中批量创建虚拟机,请使用以下 gcloud compute instances bulk create 命令

gcloud compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --zone=ZONE \
    --count=COUNT \
    [ --min-count=MIN_COUNT ]

替换以下内容:

  • NAME_PATTERN:虚拟机的名称模式。请使用哈希值 (#) 字符序列让 Compute Engine 将其替换为数字序列。例如,使用名称模式的 vm-# 可以生成名为 vm-1vm-2 等的虚拟机,最多为 --count 指定的虚拟机数量,必须小于或等于名称模式允许的虚拟机数量。

    使用名称模式时,Compute Engine 会尝试通过检查根据先前请求创建的现有虚拟机的名称来避免名称冲突。

  • PREDEFINED_NAMES:待创建虚拟机的预定义名称列表。如果使用此标志并指定 COUNT,则 COUNT 必须等于提供的名称数量。

  • ZONE:要在其中创建虚拟机的可用区。

  • COUNT:要创建的虚拟机数量。此值必须小于或等于 NAME_PATTERN 允许的虚拟机数量。或者,如果使用 --predefined-names,则无需指定 COUNT,但一旦使用,则必须等于提供的名称的数量。

  • MIN_COUNT:要创建的虚拟机数下限。下表根据您设置此标志的方式介绍了请求的行为:

    说明
    未设置 默认值为 COUNT。如果 Compute Engine 无法创建 COUNT 指定的虚拟机数量,则请求失败并且不会创建任何虚拟机。
    1 Compute Engine 会创建尽可能多的虚拟机,最多 COUNT 个。
    大于 1 且小于 COUNT Compute Engine 会创建至少 MIN_COUNT 个虚拟机,最多 COUNT 个虚拟机。如果无法创建 MIN_COUNT 个虚拟机,则请求失败并且不会创建任何虚拟机。

REST

要在某个可用区中批量创建虚拟机,请使用以下 instances.bulkInsert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {},
    "PREDEFINED_NAME_2": {},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  ...
}

替换以下内容:

  • PROJECT_ID:项目 ID。

  • ZONE:要在其中创建虚拟机的可用区。

  • NAME_PATTERN:虚拟机的名称模式。指定此值或 perInstanceProperties。请使用哈希值 (#) 字符序列让 Compute Engine 将其替换为数字序列。例如,使用名称模式的 vm-# 可以生成名为 vm-1vm-2 等的虚拟机,最多为 --count 指定的虚拟机数量,必须小于或等于名称模式允许的虚拟机数量。

    使用名称模式时,Compute Engine 会尝试通过检查根据先前请求创建的现有虚拟机的名称来避免名称冲突。

  • PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...:待创建虚拟机的预定义名称列表。指定此值或 namePattern。如果使用此标志并指定 COUNT,则 COUNT 必须等于提供的名称数量。

  • COUNT:要创建的虚拟机数量。此值必须小于或等于 NAME_PATTERN 允许的虚拟机数量。或者,如果使用 perInstanceProperties,则无需指定 COUNT,但一旦使用,则必须等于提供的名称的数量。

  • MIN_COUNT:要创建的虚拟机数下限。下表根据您设置此标志的方式介绍了请求的行为:

    说明
    未设置 默认值为 COUNT。如果 Compute Engine 无法创建 COUNT 指定的虚拟机数量,则请求失败并且不会创建任何虚拟机。
    1 Compute Engine 会创建尽可能多的虚拟机,最多 COUNT 个。
    大于 1 且小于 COUNT Compute Engine 会创建至少 MIN_COUNT 个虚拟机,最多 COUNT 个虚拟机。如果无法创建 MIN_COUNT 个虚拟机,则请求失败并且不会创建任何虚拟机。

批量创建使用自定义主机名的虚拟机

您可以使用 gcloud CLI 或 Compute Engine API 在一个区域或可用区中批量创建具有自定义主机名的虚拟机。

您必须手动配置自定义主机名的 DNS 记录。如需了解详情,请参阅限制

如果您没有指定主机名,Compute Engine 会将虚拟机的主机名设置为以下其中一项:

  • VM_NAME.c.PROJECT_ID.internal(如果启用全球 DNS)
  • VM_NAME.ZONE.c.PROJECT_ID.internal(如果启用可用区级 DNS)

如需了解详情,请参阅内部 DNS 名称

gcloud

如需在特定区域中批量创建具有自定义主机名的虚拟机,请使用以下 gcloud beta compute instances bulk create 命令

gcloud beta compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --per-instance-hostnames=[VM_NAME=HOSTNAME,...] \
    --zone=REGION \
    --count=COUNT \
    [ --min-count=MIN_COUNT ]
    [--location-policy=LOCATION_POLICY \ ]
    [--target-distribution-shape=TARGET_DISTRIBUTION_SHAPE ]

请替换以下内容:

  • NAME_PATTERN:虚拟机的名称模式。请使用哈希值 (#) 字符序列让 Compute Engine 将其替换为数字序列。例如,使用名称模式的 vm-# 可以生成名为 vm-1vm-2 等的虚拟机,最多为 --count 指定的虚拟机数量,必须小于或等于名称模式允许的虚拟机数量。

    使用名称模式时,Compute Engine 会尝试通过检查根据先前请求创建的现有虚拟机的名称来避免名称冲突。

  • PREDEFINED_NAMES:待创建虚拟机的预定义名称列表。如果使用此标志并指定 COUNT,则 COUNT 必须等于提供的名称数量。

  • [VM_NAME=HOSTNAME, …]:虚拟机的预定义名称以及您要为虚拟机分配的完全限定网域主机名的键值对列表。自定义主机名必须符合 RFC 1035 要求才是有效主机名。

  • REGION:要在其中创建虚拟机的可用区。

  • COUNT:要创建的虚拟机数量。此值必须小于或等于 NAME_PATTERN 允许的虚拟机数量。或者,如果使用 --predefined-names,则无需指定 COUNT,但一旦使用,则必须等于提供的名称的数量。

  • MIN_COUNT:要创建的虚拟机数下限。下表根据您设置此标志的方式介绍了请求的行为:

    说明
    未设置 默认值为 COUNT。如果 Compute Engine 无法创建 COUNT 指定的虚拟机数量,则请求失败并且不会创建任何虚拟机。
    1 Compute Engine 会创建尽可能多的虚拟机,最多 COUNT 个。
    大于 1 且小于 COUNT Compute Engine 会创建至少 MIN_COUNT 个虚拟机,最多 COUNT 个虚拟机。如果无法创建 MIN_COUNT 个虚拟机,则请求失败并且不会创建任何虚拟机。
  • LOCATION_POLICY:要包含或排除的区域内可用区。使用键值对列表,将可用区作为键,政策作为值。政策的有效值为 ALLOW(默认值)和 DENY。以下是此字段的示例值:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • TARGET_DISTRIBUTION_SHAPE:虚拟机在指定可用区中的分布。使用 locationPolicy 字段指定可用区。下表显示了此字段的有效值:

    说明
    ANY_SINGLE_ZONE 强制在单个可用区中部署虚拟机,并优先利用未使用的预留。使用此值可避免跨可用区网络出站流量或缩短网络延迟时间。此设置为默认值。
    BALANCED 尝试在该区域的所有可用区中均匀分布虚拟机。
    ANY 允许在一个区域中的多个可用区分布虚拟机。选择具有可用资源并最大化利用未使用的可用区级预留的可用区。

REST

如需在特定区域中批量创建具有自定义主机名的虚拟机,请使用以下 instances.bulkInsert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {"hostname": HOSTNAME_1},
    "PREDEFINED_NAME_2": {"hostname": HOSTNAME_2},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  "locationPolicy": {
    "LOCATION_POLICY"
    },
    "targetShape": "TARGET_DISTRIBUTION_SHAPE"
  ...
}

请替换以下内容:

  • PROJECT_ID:项目 ID。

  • REGION:要在其中创建虚拟机的区域。

  • NAME_PATTERN:虚拟机的名称模式。指定此值或 perInstanceProperties。请使用哈希值 (#) 字符序列让 Compute Engine 将其替换为数字序列。例如,使用名称模式的 vm-# 可以生成名为 vm-1vm-2 等的虚拟机,最多为 --count 指定的虚拟机数量,必须小于或等于名称模式允许的虚拟机数量。

    使用名称模式时,Compute Engine 会尝试通过检查根据先前请求创建的现有虚拟机的名称来避免名称冲突。

  • PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...:待创建虚拟机的预定义名称列表。指定此值或 namePattern。如果使用此标志并指定 COUNT,则 COUNT 必须等于提供的名称数量。

  • HOSTNAME_1HOSTNAME_2、…:您要为虚拟机分配的完全限定网域主机名。自定义主机名必须符合 RFC 1035 要求才是有效主机名。

    例如,如需分别创建两个具有自定义主机名 my-host1234.example.comtest.example.com 的虚拟机 vm-1vm-2,请在 perInstanceProperties 中指定 hostname 属性,如下所示:

    {
    ...
    "perInstanceProperties": {
    "vm-1": { "hostname": "my-host1234.example.com" },
    "vm-2": { "hostname": "test.example.com" },
    ...
    },
    
  • COUNT:要创建的虚拟机数量。此值必须小于或等于 NAME_PATTERN 允许的虚拟机数量。或者,如果使用 perInstanceProperties,则无需指定 COUNT,但一旦使用,则必须等于提供的名称的数量。

  • MIN_COUNT:要创建的虚拟机数下限。下表根据您设置此标志的方式介绍了请求的行为:

    说明
    未设置 默认值为 COUNT。如果 Compute Engine 无法创建 COUNT 指定的虚拟机数量,则请求失败并且不会创建任何虚拟机。
    1 Compute Engine 会创建尽可能多的虚拟机,最多 COUNT 个。
    大于 1 且小于 COUNT Compute Engine 会创建至少 MIN_COUNT 个虚拟机,最多 COUNT 个虚拟机。如果无法创建 MIN_COUNT 个虚拟机,则请求失败并且不会创建任何虚拟机。
  • LOCATION_POLICY:要包含或排除的区域内可用区。使用键值对列表,将可用区作为键,政策作为值。政策的有效值为 ALLOW(默认值)和 DENY。以下是此字段的示例值:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • TARGET_DISTRIBUTION_SHAPE:虚拟机在指定可用区中的分布。使用 locationPolicy 字段指定可用区。下表显示了此字段的有效值:

    说明
    ANY_SINGLE_ZONE 强制在单个可用区中部署虚拟机,并优先利用未使用的预留。使用此值可避免跨可用区网络出站流量或缩短网络延迟时间。此设置为默认值。
    BALANCED 尝试在该区域的所有可用区中均匀分布虚拟机。
    ANY 允许在一个区域中的多个可用区分布虚拟机。选择具有可用资源并最大化利用未使用的可用区级预留的可用区。

检查批量创建虚拟机的请求的状态

当您创建变更请求时,Compute Engine 会返回一个 operation 资源,您可以轮询该资源以获取操作的状态。如需了解详情,请参阅处理 API 响应

如需获取批量插入请求的状态,请向 operation 资源发送 HTTP GET 请求

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/OPERATION_ID

如需获取区域级批量插入请求的状态,请发送以下请求:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/operations/OPERATION_ID

替换以下内容:

  • PROJECT_ID:您要在其中创建虚拟机的项目的 ID
  • REGION:您要在其中创建虚拟机的区域
  • ZONE:您要在其中创建虚拟机的可用区
  • OPERATION_ID:批量插入操作 ID

响应中的 instancesBulkInsertOperationMetadata 对象包含操作的以下详细信息:

  • status:状态是以下项之一:
    • CREATING:虚拟机创建正在进行
    • ROLLING_BACK:请求失败并且正在回滚
    • DONE:虚拟机创建或回滚已成功完成
  • targetVmCount:要在指定可用区中创建的虚拟机的数量
  • createdVmCount:已在指定可用区中创建的虚拟机的数量
  • failedToCreateVmCount:未能在指定可用区中创建的虚拟机的数量
  • deletedVmCount:在回滚失败操作的过程中删除的虚拟机的数量

响应中的 progress 字段表示操作的完成百分比。

在 Compute Engine 至少成功创建最少数量的虚拟机并且不再发生虚拟机创建或请求回滚之前,批量插入操作的状态为 RUNNING

当批量插入操作正在进行时,您应该会看到如下所示的响应:

{
  "kind" : "compute#operation",
  "id": "4653028658507445766",
  "name": "operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationType": "bulkInsert",
  "targetLink":  "https://www.googleapis.com/compute/v1/projects/my-project"
  "targetId": 4653028658507445766,
  "status": "RUNNING",
  "progress": 2,
  "user": "example@google.com",
  "insertTime": "2023-04-23T09:57:13.474-07:00",
  "startTime": "2023-04-23T09:57:13.474-07:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/operations/operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationGroupId": "4653028658507445766",
  "metadata":
    "instances_bulk_insert_operation_metadata": {
      "per_location_status": {
         "zones/us-central1-a": {
           "status": "CREATING",
           "targetVmCount": 50,
           "createdVmCount": 1
         }
      }
    }
}

在此示例中,已成功创建一个实例,并且操作已完成 2%。

当 Compute Engine 至少成功创建由 minCount 指定的最少数量的虚拟机或者 Compute Engine 完成请求回滚时,操作会返回 DONE 状态。成功创建请求数量的虚拟机后,您会收到如下所示的响应:

{
  "endTime": "2023-04-23T09:58:13.474-07:00",
  "id": "5053101474378293244",
  "insertTime": "2023-04-23T09:57:13.474-07:00",
  "instancesBulkInsertOperationMetadata": {
    "perLocationStatus": {
      "zones/us-central1-a": {
        "status": "DONE",
        "createdVmCount": 50,
        "targetVmCount": 50
      }
    }
  },
  "kind": "compute#operation",
  "name": "operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationGroupId": "4653028658507445766",
  "operationType": "bulkInsert",
  "progress": 100,
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/operations/operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "startTime": "2023-09-11T16:21:55.629-07:00",
  "status": "DONE",
  "targetId": "625521788110",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/my-project",
  "user": "example@google.com",
  "zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a"
}

如需了解详情,请参阅 instancesBulkInsertOperationMetadata 对象的文档。

检查单个虚拟机的状态

如需检查通过批量创建虚拟机的请求创建的单个虚拟机的状态,请使用 gcloud CLI 或 Compute Engine API。

gcloud

  1. 从请求返回的 Operation 中获取 operationGroupId 属性的值。

  2. operationGroupId 属性用作 gcloud compute operations list 命令中的过滤条件,以在项目中的所有操作和所有可用区中搜索与区域或可用区级请求关联的虚拟机:

    gcloud compute operations list \
       --filter=(operationGroupId=OPERATION_GROUP_ID)
    
  3. 执行以下任一操作,以获取虚拟机的其余属性:

    • 在操作列表中,targetLink 表示虚拟机的路径。在 gcloud compute instances describe 命令中,以此路径作为虚拟机的名称来获取虚拟机的属性:

      gcloud compute instances describe VM_NAME
      
    • gcloud compute instances list 方法中,使用包含操作列表中虚拟机名称的过滤条件:

      gcloud compute instances list VM_NAME \
         --filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      
    • 使用 gcloud compute instances list 命令获取所有可用区和区域中的虚拟机属性,并按实例独有的标签进行过滤,或者他们的姓名:

      gcloud compute instances list \
         --filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      

REST

  1. 从请求返回的 Operation 中获取 operationGroupId 属性的值。

  2. 使用 operationGroupId 属性获取与区域级或可用区级请求关联的虚拟机操作列表:

    • 如果您发送了区域级请求,则如需在项目中的所有操作和所有可用区中进行搜索,请使用 globalOperations.aggregatedList 方法并添加 operationGroupId 属性作为过滤条件:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/aggregated/operations?filter=(operationGroupId=OPERATION_GROUP_ID)
      
    • 如果您发送了可用区级请求,则如需列出该可用区中的操作,请使用 zoneOperations.get 方法并将 operationGroupId 属性添加到请求正文中:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances/bulkInsert
      
      {
      ...
      "operationGroupId":"OPERATION_GROUP_ID"
      ...
      }
      
  3. 执行以下任一操作,以获取虚拟机的其余属性:

    • 在操作列表中,targetLink 表示虚拟机的路径。在 instances.get 方法中,以此路径作为虚拟机的名称来获取虚拟机的所有属性:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances/VM_NAME
      
    • instances.get 方法与包含操作列表中虚拟机名称的过滤条件结合使用:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances?filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      
    • 使用 instances.aggregatedList 方法可从所有可用区和区域获取虚拟机属性,并按实例独有的标签进行过滤,或者他们的姓名:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/aggregated/instances?filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      

伪代码示例

以下伪代码示例展示了如何对批量创建虚拟机的请求进行自定义。

在一组区域中的一个区域内批量创建虚拟机

以下伪代码介绍了如何在一组区域中的一个区域内创建 1000 个虚拟机。尝试在一组区域中的一个区域内批量创建虚拟机时,请求会首先检查容量。如果容量不足,则请求会立即失败,并使用该组区域中的下一个区域再次尝试。

  1. 指定要在可用区内创建的虚拟机数量。

    nTarget = 1000
    
  2. 指定要在其中创建虚拟机的区域。

    acceptableRegions = ["us-central1", "us-east1", "us-west1"]
    
  3. 迭代这些区域,并尝试在每个区域中创建虚拟机,直到成功。

    for region in acceptableRegions:
      call bulk API: region=region, location-policy=location-policy, count=nTarget
      if request succeeds and the operation succeeds:
        break
    

在一个可用区中批量创建一个机器类型上的虚拟机

以下伪代码介绍了如何在一个可用区中创建指定机器类型上的多个虚拟机。尝试在同一机器类型上批量创建虚拟机时,请求会首先检查这些机器类型的可用性。如果该机器类型没有足够的可用机器,则请求将立即失败,然后使用下一个机器类型再次尝试。

  1. 指定要创建的虚拟机数量以及创建它们的区域。

    nTarget = 1000
    region = "us-central1"
    
  2. 指定要在其上创建虚拟机的机器系列。

    acceptableMachineFamilies = ["n2","c2","e2","n1"]
    
  3. 迭代该组机器类型,并尝试在机器类型上创建虚拟机,直到成功为止。

    for family in acceptableMachineFamilies:
      call bulk APIs: region=region, count=nTarget, machineFamily=family
      if request succeeds and the operation succeeds:
        break
    

在一个可用区中创建超过 5,000 个虚拟机

批量创建虚拟机时,每个请求只能创建 5,000 个虚拟机。以下伪代码介绍了如何通过发出多个请求在一个可用区中创建超过 5,000 个虚拟机。

  1. 指定要创建的虚拟机的数量,用于跟踪已创建的虚拟机总数的计数器、要在其中创建虚拟机的区域以及用于存储 Compute Engine 在其中创建虚拟机的可用区的变量。

    nTarget = 10000
    nCreated = 0
    region = "us-central1"
    targetZone = ""
    
  2. 发出创建 5,000 个虚拟机的初始请求,保存请求返回的可用区,并更新所创建虚拟机数量的计数器。

    call bulk API: region=region, count=5000
    targetZone = zone chosen by bulk API
    nCreated += # of VMs created
    
  3. 继续发出在该可用区中一次最多创建 5,000 个虚拟机的请求,直到 Compute Engine 创建指定数量的虚拟机。

    while(nTarget - nCreated > 0):
      call bulk API: zone=targetZone, count=5000
      nCreated += # of VMs created
    

批量创建虚拟机并查看其状态

以下过程展示了如何创建一组具有预定义名称的虚拟机,然后查看它们的状态:

  1. 指定要创建的虚拟机数量、要在其中创建虚拟机的可用区,以及用于存储名称的数据结构。

    nTarget = 1000
    targetZone = "us-central-1a"
    names = []
    
  2. 为虚拟机生成带模式的名称,并将名称添加到数据结构。

    for n in range(0, 1000):
      names.push("instance-%d".format(n))
    
  3. 创建虚拟机,并使用 perInstanceProperties 指定名称。

    call bulk API(zone=targetZone, count=nTarget, names=perInstanceProperties)
    
  4. 使用 instances.list 方法和用于返回其详细信息的虚拟机名称的过滤条件来获取虚拟机的详细信息。

    instances.list(filter=(name = "instance-1") OR (name = "instance-2") ...)
    

后续步骤

批量创建虚拟机后,请执行以下一项或两项操作,以简化这些虚拟机的管理: