本文档介绍了如何在批量创建虚拟机 (VM) 时配置实例灵活性。借助实例灵活性,您可以指定多种机器类型,按偏好对其进行排名,并替换每个选择的最低 CPU 平台和磁盘设置,以便 Compute Engine 可以根据区域中的容量和配额可用性预配虚拟机。
如需详细了解批量创建的虚拟机的实例灵活性,请参阅批量创建的虚拟机的实例灵活性简介。
准备工作
- 对于您打算创建的虚拟机和任何相关资源,请确保您有足够的配额。
- 如果您想批量创建 Spot 虚拟机,请在创建虚拟机之前查看资源的可用性。检查资源可用性有助于降低您在创建虚拟机时遇到资源可用性错误的可能性。如需查看相关说明,请参阅查看 Spot 虚拟机的资源可用性。
-
如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Google Cloud 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:
选择标签页以了解您打算如何使用本页面上的示例:
gcloud
-
安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。 登录后,运行以下命令来初始化 Google Cloud CLI:
gcloud init
-
- 设置默认区域和可用区。
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭证。
安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。
如需了解详情,请参阅 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.subnetworks.use权限 -
为虚拟机指定静态 IP 地址:针对项目的
compute.addresses.use权限 -
在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的
compute.subnetworks.useExternalIp权限 -
为虚拟机分配旧版网络:针对项目的
compute.networks.use权限 -
使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的
compute.networks.useExternalIp权限 -
为虚拟机设置虚拟机实例元数据:针对项目的
compute.instances.setMetadata权限 -
为虚拟机设置标记:针对虚拟机的
compute.instances.setTags权限 -
为虚拟机设置标签:针对虚拟机的
compute.instances.setLabels权限 -
为虚拟机设置要使用的服务账号:针对虚拟机的
compute.instances.setServiceAccount权限 -
为虚拟机创建新磁盘:针对项目的
compute.disks.create权限 -
以只读或读写模式挂接现有磁盘:针对磁盘的
compute.disks.use权限 -
以只读模式挂接现有磁盘:针对磁盘的
compute.disks.useReadOnly权限
创建具有多个同等偏好机器类型的虚拟机
如果您的工作负载可以在多种不同的机器类型上运行,您可以在单个实例选择中指定所有兼容的机器类型的列表。以下示例展示了如何指定多个偏好程度相同的机器类型。
gcloud
如需批量创建具有单个实例选择的虚拟机,请将 gcloud compute instances bulk create 命令与 --instance-selection-machine-types 标志结合使用。
gcloud compute instances bulk create \
--name-pattern=NAME_PATTERN \
--region=REGION \
--count=COUNT \
--instance-selection-machine-types=MACHINE_TYPE_1,MACHINE_TYPE_2
替换以下内容:
COUNT:要创建的虚拟机数量NAME_PATTERN:虚拟机的名称模式MACHINE_TYPE_1、MACHINE_TYPE_2:要用于虚拟机的机器类型REGION:要在其中创建虚拟机的区域
示例
gcloud compute instances bulk create \
--name-pattern=test-bulk-# \
--region=us-central1 \
--count=10 \
--instance-selection-machine-types=c3-standard-8,n2-standard-8,c2-standard-8
REST
在 Compute Engine API 中,向 regionInstances.bulkInsert 方法发出 POST 请求。在请求正文中,添加 instanceFlexibilityPolicy 以及列出机器类型的一个 instanceSelections 条目。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert
{
"count": COUNT,
"namePattern": "NAME_PATTERN",
"instanceProperties": {
"disks": [
{
"boot": true,
"initializeParams": {
"sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
}
}
],
"networkInterfaces": [{}]
},
"instanceFlexibilityPolicy": {
"instanceSelections": {
"selection-1": {
"machineTypes": [
"MACHINE_TYPE_1",
"MACHINE_TYPE_2"
]
}
}
}
}
替换以下内容:
COUNT:要创建的虚拟机数量NAME_PATTERN:虚拟机的名称模式MACHINE_TYPE_1、MACHINE_TYPE_2:要用于虚拟机的机器类型IMAGE_PROJECT:包含映像的项目IMAGE:要使用的映像或映像系列的名称PROJECT_ID:您的项目 IDREGION:要在其中创建虚拟机的区域
示例
POST https://compute.googleapis.com/compute/v1/projects/my-project/regions/us-central1/instances/bulkInsert
{
"count": 10,
"namePattern": "test-bulk-#",
"instanceProperties": {
"disks": [
{
"boot": true,
"initializeParams": {
"sourceImage": "projects/debian-cloud/global/images/debian-12"
}
}
],
"networkInterfaces": [{}]
},
"instanceFlexibilityPolicy": {
"instanceSelections": {
"selection-1": {
"machineTypes": [
"c3-standard-8",
"n2-standard-8",
"c2-standard-8"
]
}
}
}
}
创建具有多个机器类型(按偏好程度排名)的虚拟机
如果您希望 Compute Engine 按特定顺序选择机器类型,可以配置多个实例选择。每个实例选择都包含一个机器类型列表和一个排名,排名是一个整数,用于定义机器类型的偏好级别。排名越低,偏好级别越高。Compute Engine 会尝试使用偏好级别更高的机器类型(排名较低)。如果这些机器类型不可用,Compute Engine 会使用偏好级别较低(排名较高)的机器类型。
以下示例展示了如何使用 rank 指定多个实例选择。
gcloud
如需批量创建具有多个实例选择的虚拟机,请使用 gcloud compute instances bulk create 命令并多次指定 --instance-selection 标志。
gcloud compute instances bulk create \
--name-pattern=NAME_PATTERN \
--region=REGION \
--count=COUNT \
--instance-selection "name=INSTANCE_SELECTION_1,rank=0,machine-type=MACHINE_TYPE_1,machine-type=MACHINE_TYPE_2" \
--instance-selection "name=INSTANCE_SELECTION_2,rank=1,machine-type=MACHINE_TYPE_3,machine-type=MACHINE_TYPE_4"
替换以下内容:
COUNT:要创建的虚拟机数量NAME_PATTERN:虚拟机的名称模式INSTANCE_SELECTION_1:第一个实例选择的名称INSTANCE_SELECTION_2:第二个实例选择的名称MACHINE_TYPE_1、MACHINE_TYPE_2:首次选择实例时所用的机器类型MACHINE_TYPE_3、MACHINE_TYPE_4:第二个实例选择的机器类型REGION:要在其中创建虚拟机的区域
示例
gcloud compute instances bulk create \
--name-pattern=test-bulk-# \
--region=us-central1 \
--count=10 \
--instance-selection "name=most-preferred,rank=0,machine-type=c3-standard-16,machine-type=n2-standard-16,machine-type=c2-standard-16" \
--instance-selection "name=least-preferred,rank=1,machine-type=c3-standard-8,machine-type=n2-standard-8,machine-type=c2-standard-8"
REST
在 Compute Engine API 中,向 regionInstances.bulkInsert 方法发出 POST 请求。在请求正文中,添加 instanceFlexibilityPolicy,并在 instanceSelections 中指定多个条目,每个条目都包含一个机器类型列表和一个 rank。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert
{
"count": COUNT,
"namePattern": "NAME_PATTERN",
"instanceProperties": {
"disks": [
{
"boot": true,
"initializeParams": {
"sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
}
}
],
"networkInterfaces": [{}]
},
"instanceFlexibilityPolicy": {
"instanceSelections": {
"INSTANCE_SELECTION_1": {
"machineTypes": [
"MACHINE_TYPE_1",
"MACHINE_TYPE_2"
],
"rank": 1
},
"INSTANCE_SELECTION_2": {
"machineTypes": [
"MACHINE_TYPE_3",
"MACHINE_TYPE_4"
],
"rank": 2
}
}
}
}
替换以下内容:
COUNT:要创建的虚拟机数量NAME_PATTERN:虚拟机的命名模式INSTANCE_SELECTION_1:第一个实例选择的名称INSTANCE_SELECTION_2:第二个实例选择的名称MACHINE_TYPE_1、MACHINE_TYPE_2:首次选择实例时所用的机器类型MACHINE_TYPE_3、MACHINE_TYPE_4:第二个实例选择的机器类型IMAGE_PROJECT:包含映像的项目IMAGE:要使用的映像或映像系列的名称PROJECT_ID:您的项目 IDREGION:要在其中创建虚拟机的区域
示例
POST https://compute.googleapis.com/compute/v1/projects/my-project/regions/us-central1/instances/bulkInsert
{
"count": 10,
"namePattern": "test-bulk-#",
"instanceProperties": {
"disks": [
{
"boot": true,
"initializeParams": {
"sourceImage": "projects/debian-cloud/global/images/debian-12"
}
}
],
"networkInterfaces": [{}]
},
"instanceFlexibilityPolicy": {
"instanceSelections": {
"most-preferred": {
"machineTypes": [
"c3-standard-16",
"c2-standard-16"
],
"rank": 1
},
"least-preferred": {
"machineTypes": [
"n2-standard-16",
"c3-standard-8",
"n2-standard-8",
"c2-standard-8"
],
"rank": 2
}
}
}
}
创建具有多种机器类型、满足最低要求的 CPU 平台和磁盘替换项的虚拟机
除了指定机器类型和等级之外,您还可以替换满足最低要求的 CPU 平台,并替换或添加到 instanceProperties 中每个实例选择的磁盘定义。例如,如果 instanceProperties 指定了 Persistent Disk,而您选择了 N4 机器系列,则必须使用受支持的 Google Cloud Hyperdisk 类型替换启动磁盘。
如需详细了解支持的磁盘类型以及 Compute Engine 如何应用替换,请参阅以下资源:
如需批量创建具有多种机器类型、满足最低要求的 CPU 平台和磁盘替换项的虚拟机,请选择以下选项之一:
gcloud
如需批量创建具有多种机器类型、最低要求 CPU 平台和磁盘替换设置的虚拟机,请将 gcloud compute instances bulk create 命令与 --instance-flexibility-policy 标志结合使用。如需替换默认启动磁盘 (instanceProperties),请同时添加 --boot-disk-device-name 标志,并在实例选择中指定相同的 deviceName:
gcloud compute instances bulk create \
--name-pattern=NAME_PATTERN \
--region=REGION \
--count=COUNT \
--boot-disk-device-name=BOOT_DISK_DEVICE_NAME \
--instance-flexibility-policy='{"instanceSelections":
{"INSTANCE_SELECTION_1":{"rank":RANK_1,"machineTypes":["MACHINE_TYPE_1","MACHINE_TYPE_2"],"minCpuPlatform":"MIN_CPU_PLATFORM_1","disks":[{"deviceName":"BOOT_DISK_DEVICE_NAME_1","boot":true,"initializeParams":{"diskType":"DISK_TYPE_1","diskSizeGb":DISK_SIZE_1,"sourceImage":"projects/IMAGE_PROJECT_1/global/images/IMAGE_1"}}]},
"INSTANCE_SELECTION_2":{"rank":RANK_2,"machineTypes":["MACHINE_TYPE_3"],"minCpuPlatform":"MIN_CPU_PLATFORM_2","disks":[{"deviceName":"BOOT_DISK_DEVICE_NAME_2","boot":true,"initializeParams":{"diskType":"DISK_TYPE_2","diskSizeGb":DISK_SIZE_2,"sourceImage":"projects/IMAGE_PROJECT_2/global/images/IMAGE_2"}}]}}}'
或者,如需使用 YAML 或 JSON 文件配置实例灵活性政策,请使用 --flags-file 标志,而不是 --instance-flexibility-policy 标志:
gcloud compute instances bulk create \
--name-pattern=NAME_PATTERN \
--region=REGION \
--count=COUNT \
--boot-disk-device-name=BOOT_DISK_DEVICE_NAME \
--flags-file=FILE_NAME.yaml
替换以下内容:
COUNT:要创建的虚拟机数量NAME_PATTERN:虚拟机的名称模式REGION:要在其中创建虚拟机的区域BOOT_DISK_DEVICE_NAME:instanceProperties中默认启动磁盘的设备名称INSTANCE_SELECTION_1、INSTANCE_SELECTION_2:实例选择的名称RANK_1、RANK_2:可选数字,表示您在选择每个实例时的偏好顺序;值越低表示偏好程度越高MACHINE_TYPE_1、MACHINE_TYPE_2:首次选择实例时所用的机器类型MACHINE_TYPE_3:第二个实例选择的机器类型MIN_CPU_PLATFORM_1、MIN_CPU_PLATFORM_2:每个实例选择中虚拟机的可选满足最低要求的 CPU 平台BOOT_DISK_DEVICE_NAME_1、BOOT_DISK_DEVICE_NAME_2:每个实例选择中的启动磁盘的设备名称;如需替换默认启动磁盘,请指定与BOOT_DISK_DEVICE_NAME相同的名称DISK_TYPE_1、DISK_TYPE_2:磁盘替换的磁盘类型,例如pd-ssd或hyperdisk-balancedDISK_SIZE_1、DISK_SIZE_2:磁盘替换的磁盘大小IMAGE_PROJECT_1、IMAGE_PROJECT_2:包含磁盘替换项的映像的项目IMAGE_1、IMAGE_2:用于磁盘替换的映像或映像系列的名称FILE_NAME.yaml:包含--instance-flexibility-policy配置的 YAML 或 JSON 文件的名称
示例
以下示例使用两个指定了最低 CPU 平台的实例选择创建 10 个虚拟机,并替换默认启动磁盘和挂接其他磁盘:
gcloud compute instances bulk create \
--name-pattern=test-bulk-# \
--region=us-central1 \
--count=10 \
--boot-disk-device-name=boot-disk \
--instance-flexibility-policy='{"instanceSelections":
{"selection-1":{"machineTypes":["n2-standard-8","c2-standard-8"],"minCpuPlatform":"Intel Cascade Lake","disks":[{"type":"PERSISTENT","deviceName":"boot-disk","boot":true,"initializeParams":{"diskType":"pd-ssd","diskSizeGb":50,"sourceImage":"projects/debian-cloud/global/images/family/debian-12"}},{"type":"SCRATCH","initializeParams":{"diskType":"local-ssd"}}]},
"selection-2":{"machineTypes":["c4a-standard-8"],"disks":[{"type":"PERSISTENT","deviceName":"boot-disk","boot":true,"initializeParams":{"diskType":"hyperdisk-balanced","diskSizeGb":50,"sourceImage":"projects/debian-cloud/global/images/family/debian-12-arm64"}},{"type":"PERSISTENT","deviceName":"data-disk","initializeParams":{"diskType":"hyperdisk-balanced","diskSizeGb":128}}]}}}'
或者,如果您使用 --flags-file 标志,则可以在 YAML 文件中指定相同的实例灵活性政策:
--instance-flexibility-policy:
instanceSelections:
selection-1:
machineTypes:
- n2-standard-8
- c2-standard-8
minCpuPlatform: Intel Cascade Lake
disks:
- type: PERSISTENT
deviceName: boot-disk
boot: true
initializeParams:
diskType: pd-ssd
diskSizeGb: 50
sourceImage: projects/debian-cloud/global/images/family/debian-12
- type: SCRATCH
initializeParams:
diskType: local-ssd
selection-2:
machineTypes:
- c4a-standard-8
disks:
- type: PERSISTENT
deviceName: boot-disk
boot: true
initializeParams:
diskType: hyperdisk-balanced
diskSizeGb: 50
sourceImage: projects/debian-cloud/global/images/family/debian-12-arm64
- type: PERSISTENT
deviceName: data-disk
initializeParams:
diskType: hyperdisk-balanced
diskSizeGb: 128
REST
在 Compute Engine API 中,向 regionInstances.bulkInsert 方法发出 POST 请求。在 instanceFlexibilityPolicy 的每个 instanceSelections 条目中,添加 minCpuPlatform 字段以替换 instanceProperties.minCpuPlatform,并添加 disks 字段以替换或添加到 instanceProperties.disks:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert
{
"count": COUNT,
"namePattern": "NAME_PATTERN",
"instanceProperties": {
"disks": [
{
"boot": true,
"deviceName": "boot-disk",
"initializeParams": {
"sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
}
}
],
"networkInterfaces": [{}]
},
"instanceFlexibilityPolicy": {
"instanceSelections": {
"INSTANCE_SELECTION_1": {
"machineTypes": [
"MACHINE_TYPE_1",
"MACHINE_TYPE_2"
],
"minCpuPlatform": "MIN_CPU_PLATFORM_1",
"disks": [
{
"type": "PERSISTENT",
"deviceName": "boot-disk",
"initializeParams": {
"diskType": "pd-ssd",
"diskSizeGb": 50,
"sourceImage": "projects/IMAGE_PROJECT_1/global/images/IMAGE_1"
},
"boot": true
},
{
"type": "SCRATCH",
"initializeParams": {
"diskType": "local-ssd"
}
}
]
},
"INSTANCE_SELECTION_2": {
"machineTypes": [
"MACHINE_TYPE_3"
],
"minCpuPlatform": "MIN_CPU_PLATFORM_2",
"disks": [
{
"type": "PERSISTENT",
"deviceName": "boot-disk",
"initializeParams": {
"diskType": "hyperdisk-balanced",
"diskSizeGb": 50,
"sourceImage": "projects/IMAGE_PROJECT_2/global/images/IMAGE_2"
},
"boot": true
},
{
"type": "PERSISTENT",
"deviceName": "data-disk",
"initializeParams": {
"diskType": "hyperdisk-balanced",
"diskSizeGb": 128,
"sourceImage": "projects/IMAGE_PROJECT_3/global/images/IMAGE_3"
}
}
]
}
}
}
}
替换以下内容:
COUNT:要创建的虚拟机数量NAME_PATTERN:虚拟机的命名格式INSTANCE_SELECTION_1:第一个实例选择的名称INSTANCE_SELECTION_2:第二个实例选择的名称MACHINE_TYPE_1、MACHINE_TYPE_2:首次选择实例时所用的机器类型MACHINE_TYPE_3:第二个实例选择的机器类型MIN_CPU_PLATFORM_1、MIN_CPU_PLATFORM_2:每个实例选择中虚拟机的可选满足最低要求的 CPU 平台IMAGE_PROJECT:包含instanceProperties中默认启动映像的项目IMAGE:instanceProperties中的默认启动映像或映像系列的名称IMAGE_PROJECT_1、IMAGE_PROJECT_2、IMAGE_PROJECT_3:包含磁盘替换项的映像的项目IMAGE_1、IMAGE_2、IMAGE_3:磁盘替换所用映像的名称PROJECT_ID:您的项目 IDREGION:要在其中创建虚拟机的区域
示例
以下示例使用两个指定了最低 CPU 平台的实例选择创建 10 个虚拟机,并替换默认启动磁盘和挂接其他磁盘:
POST https://compute.googleapis.com/compute/v1/projects/my-project/regions/us-central1/instances/bulkInsert
{
"count": 10,
"namePattern": "test-bulk-#",
"instanceProperties": {
"disks": [
{
"boot": true,
"deviceName": "boot-disk",
"initializeParams": {
"sourceImage": "projects/debian-cloud/global/images/family/debian-12"
}
}
],
"networkInterfaces": [{}]
},
"instanceFlexibilityPolicy": {
"instanceSelections": {
"selection-1": {
"machineTypes": [
"n2-standard-8",
"c2-standard-8"
],
"minCpuPlatform": "Intel Cascade Lake",
"disks": [
{
"type": "PERSISTENT",
"deviceName": "boot-disk",
"initializeParams": {
"diskType": "pd-ssd",
"diskSizeGb": 50,
"sourceImage": "projects/debian-cloud/global/images/family/debian-12"
},
"boot": true
},
{
"type": "SCRATCH",
"initializeParams": {
"diskType": "local-ssd"
}
}
]
},
"selection-2": {
"machineTypes": [
"c4a-standard-8"
],
"disks": [
{
"type": "PERSISTENT",
"deviceName": "boot-disk",
"initializeParams": {
"diskType": "hyperdisk-balanced",
"diskSizeGb": 50,
"sourceImage": "projects/debian-cloud/global/images/family/debian-12-arm64"
},
"boot": true
},
{
"type": "PERSISTENT",
"deviceName": "data-disk",
"initializeParams": {
"diskType": "hyperdisk-balanced",
"diskSizeGb": 128
}
}
]
}
}
}
}