Criar VMs em massa com flexibilidade de instância

Neste documento, descrevemos como configurar a flexibilidade de instâncias ao criar máquinas virtuais (VMs) em massa. A flexibilidade de instâncias permite especificar vários tipos de máquina, classificá-los por preferência e substituir as configurações de plataforma de CPU mínima e disco para cada seleção, de modo que o Compute Engine possa provisionar VMs com base na capacidade e na disponibilidade de cotas em uma região.

Para mais informações sobre a flexibilidade de instâncias para VMs criadas em massa, consulte Sobre a flexibilidade de instâncias para VMs criadas em massa.

Antes de começar

Funções exigidas

Para receber as permissões necessárias para criar VMs em massa, peça ao administrador para conceder a você o papel do IAM de Administrador da instância do Compute (v1) (roles/compute.instanceAdmin.v1) no projeto. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esse papel predefinido contém as permissões necessárias para criar VMs em massa. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As seguintes permissões são necessárias para criar VMs em massa:

  • compute.instances.create no projeto
  • Usar uma imagem personalizada para criar a VM: compute.images.useReadOnly na imagem
  • Usar um snapshot para criar a VM: compute.snapshots.useReadOnly no snapshot
  • Usar um modelo de instância para criar a VM: compute.instanceTemplates.useReadOnly no modelo de instância
  • Especificar uma sub-rede para a VM: compute.subnetworks.use no projeto ou na sub-rede escolhida
  • Especificar um endereço IP estático para a VM: compute.addresses.use no projeto
  • Atribuir um endereço IP externo à VM ao usar uma rede VPC: compute.subnetworks.useExternalIp no projeto ou na sub-rede escolhida
  • Atribuir uma rede legada à VM: compute.networks.use no projeto
  • Atribuir um endereço IP externo à VM usando uma rede legada: compute.networks.useExternalIp no projeto
  • Definir os metadados da instância de VM para a VM: compute.instances.setMetadata no projeto
  • Definir tags para a VM: compute.instances.setTags na VM
  • Definir rótulos para a VM: compute.instances.setLabels na VM
  • Definir uma conta de serviço a ser usada pela VM: compute.instances.setServiceAccount na VM
  • Criar um disco para a VM: compute.disks.create no projeto
  • Anexar um disco atual no modo somente leitura ou de leitura e gravação: compute.disks.use no disco
  • Anexar um disco atual no modo somente leitura: compute.disks.useReadOnly no disco

Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.

Criar VMs com vários tipos de máquina de igual preferência

Se a carga de trabalho puder operar em vários tipos de máquinas diferentes, especifique uma lista de todos os tipos de máquinas compatíveis em uma única seleção de instância. Os exemplos a seguir mostram como especificar vários tipos de máquina com a mesma preferência.

gcloud

Para criar VMs em massa com uma única seleção de instância, use o comando gcloud compute instances bulk create com a flag --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

Substitua:

  • COUNT: o número de VMs a serem criadas
  • NAME_PATTERN: o padrão de nome das VMs.
  • MACHINE_TYPE_1, MACHINE_TYPE_2: os tipos de máquina a serem usados para as VMs
  • REGION: a região em que as VMs serão criadas.

Exemplo

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

Na API Compute Engine, faça uma solicitação POST para o método regionInstances.bulkInsert. No corpo da solicitação, inclua instanceFlexibilityPolicy com uma entrada instanceSelections que liste os tipos de máquina.

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

Substitua:

  • COUNT: o número de VMs a serem criadas
  • NAME_PATTERN: o padrão de nome das VMs
  • MACHINE_TYPE_1, MACHINE_TYPE_2: os tipos de máquina a serem usados para as VMs
  • IMAGE_PROJECT: o projeto que contém a imagem.
  • IMAGE: o nome da imagem ou família de imagens a ser usada
  • PROJECT_ID: ID do projeto;
  • REGION: a região em que as VMs serão criadas.

Exemplo

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

Criar VMs com vários tipos de máquina classificados por preferência

Se você quiser que o Compute Engine escolha os tipos de máquina em uma ordem específica, configure várias seleções de instâncias. Cada seleção de instância inclui uma lista de tipos de máquinas e uma classificação, que é um número inteiro que define a preferência para os tipos de máquinas. Uma classificação mais baixa indica uma preferência maior. O Compute Engine tenta criar VMs usando tipos de máquinas com uma preferência maior (classificação mais baixa). Se esses tipos de máquina não estiverem disponíveis, o Compute Engine usará tipos com uma preferência menor (classificação mais alta).

Os exemplos a seguir mostram como especificar várias seleções de instâncias com classificações.

gcloud

Para criar VMs em massa com várias seleções de instâncias, use o comando gcloud compute instances bulk create e especifique a flag --instance-selection várias vezes.

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"

Substitua:

  • COUNT: o número de VMs a serem criadas.
  • NAME_PATTERN: o padrão de nome das VMs.
  • INSTANCE_SELECTION_1: o nome da primeira seleção de instância
  • INSTANCE_SELECTION_2: o nome da segunda seleção de instância
  • MACHINE_TYPE_1, MACHINE_TYPE_2: os tipos de máquina para a primeira seleção de instância
  • MACHINE_TYPE_3, MACHINE_TYPE_4: os tipos de máquina para a segunda seleção de instâncias.
  • REGION: a região em que as VMs serão criadas.

Exemplo

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

Na API Compute Engine, faça uma solicitação POST para o método regionInstances.bulkInsert. No corpo da solicitação, inclua instanceFlexibilityPolicy e especifique várias entradas em instanceSelections, cada uma com uma lista de tipos de máquinas e um 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
      }
    }
  }
}

Substitua:

  • COUNT: o número de VMs a serem criadas
  • NAME_PATTERN: o padrão de nomenclatura das VMs
  • INSTANCE_SELECTION_1: o nome da primeira seleção de instâncias.
  • INSTANCE_SELECTION_2: o nome da segunda seleção de instância
  • MACHINE_TYPE_1, MACHINE_TYPE_2: os tipos de máquina para a primeira seleção de instância
  • MACHINE_TYPE_3, MACHINE_TYPE_4: os tipos de máquina para a segunda seleção de instâncias
  • IMAGE_PROJECT: o projeto que contém a imagem.
  • IMAGE: o nome da imagem ou família de imagens a ser usada
  • PROJECT_ID: ID do projeto;
  • REGION: a região em que as VMs serão criadas.

Exemplo

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

Criar VMs com vários tipos de máquina, plataforma de CPU mínima e substituições de disco

Além de especificar tipos e classificações de máquina, é possível substituir a plataforma de CPU mínima e substituir ou adicionar às definições de disco em instanceProperties para cada seleção de instância. Por exemplo, se instanceProperties especificar um Persistent Disk e você selecionar uma série de máquinas N4, será necessário substituir o disco de inicialização por um tipo de Google Cloud Hyperdisk compatível.

Para mais informações sobre os tipos de disco compatíveis e como o Compute Engine aplica substituições, consulte os seguintes recursos:

Para criar VMs em massa com vários tipos de máquina, plataforma de CPU mínima e substituições de disco, selecione uma das seguintes opções:

gcloud

Para criar VMs em massa com vários tipos de máquinas, plataforma mínima de CPU e substituições de disco, use o comando gcloud compute instances bulk create com a flag --instance-flexibility-policy. Para substituir o disco de inicialização padrão de instanceProperties, inclua também a flag --boot-disk-device-name e especifique o mesmo deviceName na seleção de instâncias:

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

Como alternativa, para configurar a política de flexibilidade de instâncias usando um arquivo YAML ou JSON, use a flag --flags-file em vez da flag --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

Substitua:

  • COUNT: o número de VMs a serem criadas
  • NAME_PATTERN: o padrão de nome das VMs
  • REGION: a região em que as VMs serão criadas.
  • BOOT_DISK_DEVICE_NAME: o nome do dispositivo para o disco de inicialização padrão em instanceProperties
  • INSTANCE_SELECTION_1 e INSTANCE_SELECTION_2: os nomes das seleções de instâncias
  • RANK_1, RANK_2: números opcionais que representam sua ordem de preferência para cada seleção de instância. Um valor menor indica uma preferência maior.
  • MACHINE_TYPE_1, MACHINE_TYPE_2: os tipos de máquina para a primeira seleção de instâncias
  • MACHINE_TYPE_3: o tipo de máquina da segunda seleção de instância
  • MIN_CPU_PLATFORM_1, MIN_CPU_PLATFORM_2: plataformas mínimas de CPU opcionais para as VMs em cada seleção de instância
  • BOOT_DISK_DEVICE_NAME_1, BOOT_DISK_DEVICE_NAME_2: os nomes de dispositivos para os discos de inicialização em cada seleção de instância. Para substituir o disco de inicialização padrão, especifique o mesmo nome de BOOT_DISK_DEVICE_NAME.
  • DISK_TYPE_1, DISK_TYPE_2: os tipos de disco para as substituições de disco, como pd-ssd ou hyperdisk-balanced.
  • DISK_SIZE_1, DISK_SIZE_2: os tamanhos dos discos para as substituições de disco.
  • IMAGE_PROJECT_1, IMAGE_PROJECT_2: os projetos que contêm as imagens para as substituições de disco
  • IMAGE_1, IMAGE_2: os nomes das imagens ou famílias de imagens para as substituições de disco.
  • FILE_NAME.yaml: o nome do arquivo YAML ou JSON que contém a configuração de --instance-flexibility-policy.

Exemplo

O exemplo a seguir cria 10 VMs usando duas seleções de instâncias que especificam uma plataforma de CPU mínima, substituem o disco de inicialização padrão e anexam discos adicionais:

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

Como alternativa, se você usar a flag --flags-file, poderá especificar a mesma política de flexibilidade de instâncias em um arquivo 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

Na API Compute Engine, faça uma solicitação POST para o método regionInstances.bulkInsert. Em cada entrada instanceSelections de instanceFlexibilityPolicy, inclua o campo minCpuPlatform para substituir instanceProperties.minCpuPlatform e o campo disks para substituir ou adicionar a 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"
            }
          }
        ]
      }
    }
  }
}

Substitua:

  • COUNT: o número de VMs a serem criadas.
  • NAME_PATTERN: o padrão de nomenclatura das VMs.
  • INSTANCE_SELECTION_1: o nome da primeira seleção de instância
  • INSTANCE_SELECTION_2: o nome da segunda seleção de instância
  • MACHINE_TYPE_1, MACHINE_TYPE_2: os tipos de máquina para a primeira seleção de instâncias
  • MACHINE_TYPE_3: o tipo de máquina para a segunda seleção de instância.
  • MIN_CPU_PLATFORM_1, MIN_CPU_PLATFORM_2: plataformas de CPU mínimas opcionais para as VMs em cada seleção de instância.
  • IMAGE_PROJECT: o projeto que contém a imagem de inicialização padrão em instanceProperties
  • IMAGE: o nome da imagem de inicialização ou família de imagens padrão em instanceProperties
  • IMAGE_PROJECT_1, IMAGE_PROJECT_2, IMAGE_PROJECT_3: os projetos que contêm as imagens para as substituições de disco.
  • IMAGE_1, IMAGE_2, IMAGE_3: os nomes das imagens para as substituições de disco.
  • PROJECT_ID: ID do projeto;
  • REGION: a região em que as VMs serão criadas.

Exemplo

O exemplo a seguir cria 10 VMs usando duas seleções de instâncias que especificam uma plataforma de CPU mínima, substituem o disco de inicialização padrão e anexam outros discos:

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