如何批量创建虚拟机
适用场景:
适用于需要创建大量相同且彼此独立的虚拟机实例的情况,本文中描述了使用 Google Cloud CLI 或 Compute Engine API 批量创建虚拟机的方法。可以跨一个区域中的所有可用区创建这 些虚拟机,也可以将这些虚拟机分布在特定可用区中。
准备工作:
- 确保需求地区有足够的配额,如果配额不足,可以在IAM内发起申请
- 具有项目项目的操作权限
- 安装/更新到Google Cloud CLI 的最新版本
具体操作:
在一个区域中批量创建虚拟机
要在某个区域中批量创建虚拟机,请使用gcloudCLI或ComputeEngineAPI。
如果指定机器类型或支持其他硬件(如GPU或本地SSD),则ComputeEngine会将虚拟机 放置在支持机器类型和其他硬件的区域的可用区中。
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-shape=TARGET_SHAPE ]
REST
要在某个区域中批量创建虚拟机,请使用以下 instances.bulkInsert 方法:
POST https://www.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_SHAPE"
...
替换以下内容:
- PROJECT_ID:项目ID。
- REGION:要在其中创建虚拟机的区域。
- NAME_PATTERN:虚拟机的名称模式。指定此值或perInstanceProperties。请 使用哈希值(#)字符序列让ComputeEngine将其替换为数字序列。例如,使用名称模 式的vm-#可以生成名为vm-1、vm-2等的虚拟机,最多为--count指定的虚拟机 数量,必须小于或等于名称模式允许的虚拟机数量。 使用名称模式时,ComputeEngine会尝试通过检查根据先前请求创建的现有虚拟机 的名称来避免名称冲突。
- PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...:待创建虚拟机的预定义名 称列表。指定此值或namePattern。如果使用此标志并指定COUNT,则COUNT必须 等于提供的名称数量。
- COUNT:要创建的虚拟机数量。此值必须小于或等于NAME_PATTERN允许的虚拟机 数量。或者,如果使用perInstanceProperties,则无需指定COUNT,但一旦使用 ,则必须等于提供的名称的数量。
- MIN_COUNT: 要创建的虚拟机数下限。下表根据您设置此标志的方式介绍了请求的行为:
值 说明 未设置 默认值为COUNT。如果ComputeEngine无法创建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_SHAPE:虚拟机在指定可用区中的分布。使用locationPolicy字段指
定可用区。下表显示了此字段的有效值
值 说明 ANY_SINGLE_ZONE 强制在单个可用区中部署虚拟机,并优先利用未使用的预留。使用此值可避 免跨可用区网络出站流量或缩短网络延迟时间。此设置为默认值。 BALANCED 尝试在该区域的所有可用区中均匀分布虚拟机 ANY 允许在一个区域中的多个可用区分布虚拟机。选择具有可用资源并最大化利 用未使用的可用区级预留的可用区。
在一个可用区中批量创建虚拟机
要在某个可用区中批量创建虚拟机,请使用gcloudCLI或ComputeEngineAPI。
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 ]
REST
要在某个可用区中批量创建虚拟机,请使用以下instances.bulkInsert方法:
POST https://www.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。请 使用哈希值(#)字符序列让ComputeEngine将其替换为数字序列。例如,使用名称模 式的vm-#可以生成名为vm-1、vm-2等的虚拟机,最多为--count指定的虚拟机 数量,必须小于或等于名称模式允许的虚拟机数量。 使用名称模式时,ComputeEngine会尝试通过检查根据先前请求创建的现有虚拟机 的名称来避免名称冲突。
- PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...:待创建虚拟机的预定义名 称列表。指定此值或namePattern。如果使用此标志并指定COUNT,则COUNT必须 等于提供的名称数量。
- COUNT:要创建的虚拟机数量。此值必须小于或等于NAME_PATTERN允许的虚拟机 数量。或者,如果使用perInstanceProperties,则无需指定COUNT,但一旦使用 ,则必须等于提供的名称的数量。
- MIN_COUNT: 要创建的虚拟机数下限。下表根据您设置此标志的方式介绍了请求的行为:
值 说明 未设置 默认值为COUNT。如果ComputeEngine无法创建COUNT指定的虚拟机数 量,则请求失败并且不会创建任何虚拟机。 1 Compute Engine 会创建尽可能多的虚拟机,最多 COUNT 个。 大于 1 且小于COUNT Compute Engine 会创建至少 MIN_COUNT 个虚拟机,最多 COUNT 个虚拟机。如果无法创建 MIN_COUNT 个虚拟机,则请求失败并且不会创建任何虚拟机。
批量创建使用自定义主机名的虚拟机
您可以使用gcloudCLI或ComputeEngineAPI在区域中或可用区批量创建使用自定义主机 名的虚拟机。
您必须手动配置自定义主机名的DNS记录。如需了解详情,请参阅限制。
如果您未指定主机名,ComputeEngine会将虚拟机的主机名设置为以下项之一:
- VM_NAME.c.PROJECT_ID.internal(如果启用全局DNS
- VM_NAME.ZONE.c.PROJECT_ID.internal(如果您启用可用区级DNS)
要在特定区域中批量创建使用自定义主机名的虚拟机,请使用以下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=ZONE \
--count=COUNT \
[--min-count=MIN_COUNT ]
[--location-policy=LOCATION_POLICY \ ]
[--target-shape=TARGET_SHAPE ]
REST
如需在特定区域中批量创建具有自定义主机名的虚拟机,请使用以下 instances.bulkInsert方法:
POST https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert
{
...
"namePattern": "NAME_PATTERN",
"perInstanceProperties": {
"PREDEFINED_NAME_1": {"hostname": HOSTNAME1},
"PREDEFINED_NAME_2": {"hostname": HOSTNAME2},
...
},
"count":COUNT,
"minCount": MIN_COUNT,
"locationPolicy": {
"LOCATION_POLICY"
},
"targetShape": "TARGET_SHAPE"
{...
}
"targetShape": "TARGET_SHAPE"
...
}
替换以下内容:
- PROJECT_ID:项目ID。
- REGION:要在其中创建虚拟机的区域。
- NAME_PATTERN:虚拟机的名称模式。指定此值或perInstanceProperties。请 使用哈希值(#)字符序列让ComputeEngine将其替换为数字序列。例如,使用名称模 式的vm-#可以生成名为vm-1、vm-2等的虚拟机,最多为--count指定的虚拟机 数量,必须小于或等于名称模式允许的虚拟机数量。 使用名称模式时,ComputeEngine会尝试通过检查根据先前请求创建的现有虚拟机 的名称来避免名称冲突。
- PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...:待创建虚拟机的预定义名 称列表。指定此值或namePattern。如果使用此标志并指定COUNT,则COUNT必须 等于提供的名称数量。
- HOSTNAME_1, HOSTNAME_2, ...::您要为虚拟机分配的完全限定网域主机名。自定义主机名必须
符合RFC1035要求才是有效主机名。
例如,如需分别创建两个具有自定义主机名my-host1234.example.com和
test.example.com 的虚拟机 vm-1 和 vm-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。如果ComputeEngine无法创建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_SHAPE:虚拟机在指定可用区中的分布。使用locationPolicy字段指
定可用区。下表显示了此字段的有效值
值 说明 ANY_SINGLE_ZONE 强制在单个可用区中部署虚拟机,并优先利用未使用的预留。使用此值可避 免跨可用区网络出站流量或缩短网络延迟时间。此设置为默认值。 BALANCED 尝试在该区域的所有可用区中均匀分布虚拟机 ANY 允许在一个区域中的多个可用区分布虚拟机。选择具有可用资源并最大化利 用未使用的可用区级预留的可用区。
检查批量创建虚拟机的请求的状态
当您创建变更请求时,Compute Engine 会返回一个operation 资源,您可以轮询该资源以 获取操作的状态。如需了解详情,请参阅处理API 响应。
如需获取批量插入请求的状态,请向operation 资源发送HTTP GET 请求:
GET compute/v1/projects/PROJECT_ID/zones/ZONE/operations/OPERATION_ID
如需获取区域级批量插入请求的状态,请发送以下请求:
GET 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://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://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"
}
检查单个虚拟机的状态
如需检查通过批量创建虚拟机的请求创建的单个虚拟机的状态,请使用gcloud CLI 或 Compute Engine API。
gcloud- 从请求返回的Operation 中获取operationGroupId 属性的值。
- 将operationGroupId 属性用作gcloud compute operations list 命令中
的过滤条件,以在项目中的所有操作和所有可用区中搜索与区域或可用区级请求关联
的虚拟机:
gcloud compute operations list \ --filter=(operationGroupId=OPERATION_GROUP_ID )
- 执行以下任一操作,以获取虚拟机的其余属性:
- 在操作列表中,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)
- 在操作列表中,targetLink 表示虚拟机的路径。在gcloud compute
instances describe 命令中,以此路径作为虚拟机的名称来获取虚拟机的
属性:
后续步骤
批量创建虚拟机后,请执行以下一项或两项操作,以简化这些虚拟机的管理:
将虚拟机添加到非代管式实例组。将虚拟机添加到非代管式实例组可让您使用Cloud Monitoring。非代管式实例组不提供负载均衡或虚拟机生命周期管理。
使用标签。通过标签,您可以使用键值对组织资源。