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

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

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

事前準備

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

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

    gcloud

    1. 安裝 Google Cloud CLI,然後 使用聯合身分登入 gcloud CLI。登入後,執行下列指令來初始化 Google Cloud CLI:

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

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

      安裝 Google Cloud CLI,然後 使用聯合身分登入 gcloud CLI。

    詳情請參閱 Cloud de Confiance 驗證說明文件中的「使用 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
            }
          }
        ]
      }
    }
  }
}