使用執行個體彈性大量建立 VM

本文說明如何在大量建立虛擬機器 (VM) 時,設定執行個體彈性。執行個體彈性可讓您指定多個機型、依偏好排序,並覆寫每個選項的最低 CPU 平台和磁碟設定,讓 Compute Engine 根據區域中的容量和配額可用性佈建 VM。

如要進一步瞭解大量建立的 VM 執行個體彈性,請參閱「大量建立的 VM 執行個體彈性簡介」。

事前準備

  • 如要建立 VM 和任何相關資源,請確認您有足夠的配額。
  • 如要大量建立 Spot VM,請先查看資源可用性,再建立 VM。檢查資源可用性有助於降低建立 VM 時發生資源可用性錯誤的機率。如需操作說明,請參閱「查看 Spot VM 的資源可用性」。
  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,您可以選取下列其中一個選項,向 Compute Engine 進行驗證:

    選取這個頁面上範例的預計用途分頁:

    gcloud

    1. 安裝 Google Cloud CLI。 安裝完成後,請執行下列指令,初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  • 設定預設區域和可用區。
  • REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。

必要的角色

如要取得大量建立 VM 所需的權限,請要求管理員授予您專案的 Compute 執行個體管理員 (v1) (roles/compute.instanceAdmin.v1) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這個預先定義的角色具備大量建立 VM 所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要大量建立 VM,必須具備下列權限:

  • compute.instances.create 專案
  • 如要使用自訂映像檔建立 VM,請按照下列步驟操作: compute.images.useReadOnly 在映像檔上
  • 如要使用快照建立 VM,請按照下列步驟操作: compute.snapshots.useReadOnly 在快照上
  • 如要使用執行個體範本建立 VM: compute.instanceTemplates.useReadOnly 在執行個體範本上
  • 如要為 VM 指定子網路: compute.subnetworks.use 在專案或所選子網路上
  • 如要為 VM 指定靜態 IP 位址: compute.addresses.use 在專案中
  • 使用虛擬私有雲網路時,如要將外部 IP 位址指派給 VM,請在專案或所選子網路上執行下列步驟: compute.subnetworks.useExternalIp
  • 如要將舊版網路指派給 VM,請按照下列步驟操作: compute.networks.use 在專案中
  • 使用舊版網路時,如要為 VM 指派外部 IP 位址,請執行下列步驟: compute.networks.useExternalIp 專案
  • 如要為 VM 設定 VM 執行個體中繼資料: compute.instances.setMetadata 在專案上
  • 如要設定 VM 的標記: compute.instances.setTags VM
  • 如要為 VM 設定標籤,請按照下列步驟操作: compute.instances.setLabels 在 VM 上
  • 如要設定 VM 使用的服務帳戶: compute.instances.setServiceAccount 在 VM 上
  • 為 VM 建立新磁碟: compute.disks.create 專案
  • 如要以唯讀或讀寫模式連結現有磁碟: compute.disks.use 在磁碟上
  • 如要以唯讀模式連接現有磁碟: compute.disks.useReadOnly 磁碟

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

建立偏好程度相同的多個機型 VM

如果工作負載可使用多種機型,您可以在單一執行個體選取作業中,指定所有相容機型的清單。以下範例說明如何指定多個偏好程度相同的機型。

gcloud

如要使用單一執行個體選項大量建立 VM,請使用 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:要建立的 VM 數量
  • NAME_PATTERN:VM 的名稱模式
  • MACHINE_TYPE_1、MACHINE_TYPE_2:用於 VM 的機型
  • REGION:要建立 VM 的區域

範例

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:要建立的 VM 數量
  • NAME_PATTERN:VM 的名稱模式
  • MACHINE_TYPE_1、MACHINE_TYPE_2:用於 VM 的機型
  • IMAGE_PROJECT:映像檔所在的專案
  • IMAGE:要使用的映像檔或映像檔系列名稱
  • PROJECT_ID:專案 ID
  • REGION:要建立 VM 的區域

範例

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"
        ]
      }
    }
  }
}

建立 VM,並按照偏好順序排列多個機型

如要讓 Compute Engine 依特定順序選擇機器類型,您可以設定多個執行個體選項。每個執行個體選取項目都包含機型清單和等級,等級是定義機型偏好的整數。排名越低,表示偏好程度越高。Compute Engine 會嘗試使用偏好順位較高 (等級較低) 的機器類型建立 VM。如果這些機型無法使用,Compute Engine 會使用偏好設定較低 (排名較高) 的機型。

以下範例說明如何使用等級指定多個執行個體選取項目。

gcloud

如要使用多個執行個體選項大量建立 VM,請使用 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:要建立的 VM 數量
  • NAME_PATTERN:VM 的名稱模式
  • INSTANCE_SELECTION_1:第一個執行個體選取的名稱
  • INSTANCE_SELECTION_2:第二個執行個體選取項的名稱
  • MACHINE_TYPE_1、MACHINE_TYPE_2:第一個執行個體選項的機型
  • MACHINE_TYPE_3、MACHINE_TYPE_4:第二個執行個體選取的機型
  • REGION:要建立 VM 的區域

範例

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:要建立的 VM 數量
  • NAME_PATTERN:VM 的命名模式
  • INSTANCE_SELECTION_1:第一個執行個體選取的名稱
  • INSTANCE_SELECTION_2:第二個執行個體選取項的名稱
  • MACHINE_TYPE_1、MACHINE_TYPE_2:第一個執行個體選項的機型
  • MACHINE_TYPE_3、MACHINE_TYPE_4:第二個執行個體選取的機型
  • IMAGE_PROJECT:包含圖片的專案
  • IMAGE:要使用的映像檔或映像檔系列名稱
  • PROJECT_ID:專案 ID
  • REGION:要建立 VM 的區域

範例

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 平台和磁碟覆寫的 VM

除了指定機器類型和等級,您也可以覆寫最低 CPU 平台,以及覆寫或新增每個執行個體選取項目的 instanceProperties 磁碟定義。舉例來說,如果 instanceProperties 指定了 Persistent Disk,而您選取了 N4 機器系列,則必須使用支援的 Google Cloud Hyperdisk 類型覆寫開機磁碟。

如要進一步瞭解支援的磁碟類型,以及 Compute Engine 如何套用覆寫,請參閱下列資源:

如要大量建立 VM,並指定多種機型、最低 CPU 平台和磁碟覆寫設定,請選取下列其中一個選項:

gcloud

如要使用多種機型、最低 CPU 平台和磁碟覆寫大量建立 VM,請使用 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:要建立的 VM 數量
  • NAME_PATTERN:VM 的名稱模式
  • REGION:要建立 VM 的區域
  • 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:每個執行個體選項的 VM 最低 CPU 平台 (選用)
  • BOOT_DISK_DEVICE_NAME_1、BOOT_DISK_DEVICE_NAME_2:各個執行個體選項中開機磁碟的裝置名稱;如要覆寫預設開機磁碟,請指定與 BOOT_DISK_DEVICE_NAME 相同的名稱
  • DISK_TYPE_1、DISK_TYPE_2:磁碟覆寫的磁碟類型,例如 pd-ssd 或 hyperdisk-balanced
  • DISK_SIZE_1、DISK_SIZE_2:磁碟覆寫的磁碟大小
  • IMAGE_PROJECT_1、IMAGE_PROJECT_2:包含磁碟覆寫圖片的專案
  • IMAGE_1、IMAGE_2:磁碟覆寫的映像檔或映像檔系列名稱
  • FILE_NAME.yaml:包含 --instance-flexibility-policy 設定的 YAML 或 JSON 檔案名稱

範例

下列範例會使用兩個執行個體選項建立 10 個 VM,這些選項會指定最低 CPU 平台、覆寫預設開機磁碟,並連接額外磁碟:

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:要建立的 VM 數量
  • NAME_PATTERN:VM 的命名模式
  • INSTANCE_SELECTION_1:第一個執行個體選項的名稱
  • INSTANCE_SELECTION_2:第二個執行個體選取項的名稱
  • MACHINE_TYPE_1、MACHINE_TYPE_2:第一個執行個體選取的機型
  • MACHINE_TYPE_3:第二個執行個體選項的機型
  • MIN_CPU_PLATFORM_1、MIN_CPU_PLATFORM_2:每個執行個體選項的 VM 最低 CPU 平台 (選用)
  • IMAGE_PROJECT:包含 instanceProperties 中預設開機映像檔的專案
  • IMAGE:instanceProperties 中的預設開機映像檔或映像檔系列名稱
  • IMAGE_PROJECT_1、IMAGE_PROJECT_2、IMAGE_PROJECT_3:包含磁碟覆寫圖片的專案
  • IMAGE_1、IMAGE_2、IMAGE_3:磁碟覆寫的映像檔名稱
  • PROJECT_ID:專案 ID
  • REGION:要建立 VM 的區域

範例

以下範例會使用兩個執行個體選取項目建立 10 個 VM,這些選取項目會指定最低 CPU 平台、覆寫預設開機磁碟,並附加額外磁碟:

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
            }
          }
        ]
      }
    }
  }
}