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. Com a flexibilidade de instâncias, é possível especificar vários tipos de máquinas, classificá-los por preferência e substituir as configurações de plataforma de CPU mínima e disco para cada seleção. Assim, o Compute Engine pode provisionar VMs com base na capacidade e na disponibilidade de cota 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

  • Para VMs e quaisquer recursos relacionados que você planeja criar, verifique se você tem cota suficiente.
  • Se você quiser criar VMs spot em massa, confira a disponibilidade de recursos antes de criar as VMs. Verificar a disponibilidade de recursos ajuda a reduzir as chances de encontrar erros de disponibilidade ao criar VMs. Para instruções, consulte Ver a disponibilidade de recursos das VMs spot.
  • Configure a autenticação, caso ainda não tenha feito isso. Com isso, você confirma sua identidade para acesso a serviços e APIs do Google Cloud . Para executar códigos ou amostras de um ambiente de desenvolvimento local, autentique-se no Compute Engine selecionando uma das seguintes opções:

    Selecione a guia para como planeja usar as amostras nesta página:

    gcloud

    1. Instale a CLI do Google Cloud. Após a instalação, inicialize a Google Cloud CLI executando o seguinte comando:

      gcloud init

      Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  • Defina uma região e uma zona padrão.
  • REST

    Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para a CLI gcloud.

      Instale a CLI do Google Cloud.

      Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

    Saiba mais em Autenticar para usar REST na documentação de autenticação do Google Cloud .

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áquinas 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âncias
  • 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â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, 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áquinas, é 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áquinas, plataforma mínima de CPU 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ância 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 --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ância 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 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
  • 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 discos adicionais:

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