Crear VMs en bloque


Si quieres crear un gran número de instancias de máquinas virtuales (VM) idénticas e independientes entre sí, puedes hacerlo de forma masiva mediante la CLI de Google Cloud o la API de Compute Engine. Puedes crear estas VMs en todas las zonas de una región o distribuirlas en determinadas zonas.

Para obtener más información y las limitaciones asociadas, consulta Información sobre la creación de VMs en bloque. Si quieres crear instancias con GPUs vinculadas, consulta el artículo Crear VMs con GPU en bloque.

Antes de empezar

  • En el caso de las VMs y los recursos relacionados que quieras crear, asegúrate de que tienes suficiente cuota y los permisos necesarios.
  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    Select the tab for how you plan to use the samples on this page:

    gcloud

    1. Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    2. Set a default region and zone.

    REST

    Para usar las muestras de la API REST de esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la CLI de gcloud.

      Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    Para obtener más información, consulta el artículo Autenticarse para usar REST de la documentación sobre autenticación de Google Cloud .

Roles obligatorios

Para obtener los permisos que necesitas para crear VMs en bloque, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Administrador de instancias de Compute (v. 1) (roles/compute.instanceAdmin.v1) en el proyecto. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para crear máquinas virtuales en bloque. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para crear VMs en bloque, se necesitan los siguientes permisos:

  • compute.instances.create del proyecto
  • Para usar una imagen personalizada para crear la VM, sigue estos pasos: compute.images.useReadOnly en la imagen
  • Para usar una captura para crear la VM, sigue estos pasos: compute.snapshots.useReadOnly en la captura
  • Para usar una plantilla de instancia para crear la VM, haz lo siguiente: compute.instanceTemplates.useReadOnly en la plantilla de instancia
  • Para asignar una red antigua a la VM, sigue estos pasos: compute.networks.use en el proyecto
  • Para especificar una dirección IP estática para la máquina virtual, haz lo siguiente: compute.addresses.use en el proyecto
  • Para asignar una dirección IP externa a la VM cuando se usa una red antigua, haz lo siguiente: compute.networks.useExternalIp en el proyecto
  • Para especificar una subred para tu VM, haz lo siguiente: compute.subnetworks.use en el proyecto o en la subred elegida
  • Para asignar una dirección IP externa a la VM cuando se usa una red de VPC, sigue estos pasos: compute.subnetworks.useExternalIp en el proyecto o en la subred elegida
  • Para definir los metadatos de la instancia de VM: compute.instances.setMetadata en el proyecto
  • Para definir etiquetas en la VM, haz lo siguiente: compute.instances.setTags en la VM
  • Para definir etiquetas en la VM, sigue estos pasos: compute.instances.setLabels en la VM
  • Para definir una cuenta de servicio que pueda usar la VM, sigue estos pasos: compute.instances.setServiceAccount en la VM
  • Para crear un disco para la VM, sigue estos pasos: compute.disks.create en el proyecto
  • Para adjuntar un disco en modo de solo lectura o de lectura y escritura, sigue estos pasos: compute.disks.use en el disco
  • Para adjuntar un disco en modo de solo lectura, sigue estos pasos: compute.disks.useReadOnly en el disco

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Crear VMs en bloque en una región

Para crear máquinas virtuales en bloque en una región, usa la CLI de gcloud o la API de Compute Engine.

Si especificas un tipo de máquina o la compatibilidad con hardware adicional, como una GPU o un SSD local, Compute Engine colocará las VMs en una zona de la región que admita el tipo de máquina y el hardware adicional.

gcloud

Para crear VMs de forma masiva en una región, usa el siguiente gcloud compute instances bulk createcomando:

gcloud compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --region=REGION \
    --count=COUNT \
    [ --min-count=MIN_COUNT \ ]
    [--location-policy=LOCATION_POLICY \ ]
    [--target-distribution-shape=TARGET_DISTRIBUTION_SHAPE ]

Haz los cambios siguientes:

  • NAME_PATTERN: el patrón de nombre de las VMs. Usa una secuencia de caracteres de almohadilla (#) para que Compute Engine la sustituya por una secuencia de números. Por ejemplo, si usas vm-# como patrón de nombre, se generarán VMs con nombres como vm-1 y vm-2, hasta el número de VMs especificado por --count, que debe ser igual o inferior al número de VMs que permite el patrón de nombre.

    Cuando se usa un patrón de nombre, Compute Engine intenta evitar conflictos de nombres comprobando los nombres de las VMs creadas a partir de solicitudes anteriores.

  • PREDEFINED_NAMES: una lista de nombres predefinidos para las VMs que se van a crear. Si usas esta marca y especificas COUNT, COUNT debe ser igual al número de nombres proporcionados.

  • REGION: la región en la que se crearán las VMs.

  • COUNT: número de VMs que se van a crear. Este valor debe ser menor o igual que el número de máquinas virtuales permitidas por NAME_PATTERN. Si usa --predefined-names, no tiene que especificar COUNT, pero si lo hace, debe ser igual al número de nombres proporcionados.

  • MIN_COUNT: número mínimo de máquinas virtuales que se van a crear. En la siguiente tabla se describe el comportamiento de la solicitud en función de cómo definas esta marca:

    Valor Descripción
    Sin establecer El valor predeterminado es COUNT. Si Compute Engine no puede crear el número de VMs especificado por COUNT, la solicitud falla y no se crea ninguna VM.
    1 Compute Engine crea tantas máquinas virtuales como sea posible, hasta un máximo de COUNT.
    Mayor que 1 y menor que COUNT Compute Engine crea al menos MIN_COUNT VMs y un máximo de COUNT VMs. Si no se pueden crear MIN_COUNT VMs, la solicitud falla y no se crea ninguna VM.
  • LOCATION_POLICY: las zonas que se van a incluir o excluir de una región. Use una lista de pares clave-valor, con la zona como clave y la política como valor. Los valores válidos de la política son allow (el valor predeterminado) y deny. A continuación, se muestra un valor de ejemplo de esta marca:

    --location-policy=us-east1-b=allow,us-east1-c=deny
    
  • TARGET_DISTRIBUTION_SHAPE: la distribución de las VMs en las zonas especificadas. Usa la marca --location-policy para especificar las zonas. En la siguiente tabla se muestran los valores válidos de esta marca:

    Valor Descripción
    ANY_SINGLE_ZONE Fuerza la colocación de las VMs en una sola zona y prioriza la utilización de las reservas no utilizadas. Úsalo para evitar el tráfico saliente de la red entre zonas o para reducir la latencia de la red. Este es el valor predeterminado.
    BALANCED Intenta distribuir las VMs de forma uniforme entre todas las zonas de la región.
    ANY Permite distribuir las máquinas virtuales en varias zonas de una región. Elige las zonas que tienen recursos disponibles y que maximizan las reservas zonales sin usar.

REST

Para crear VMs en bloque en una región, usa el siguiente instances.bulkInsert método:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {},
    "PREDEFINED_NAME_2": {},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  "locationPolicy": {
    "LOCATION_POLICY"
    },
    "targetShape": "TARGET_DISTRIBUTION_SHAPE"
  ...
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto.

  • REGION: la región en la que se crearán las VMs.

  • NAME_PATTERN: el patrón de nombre de las VMs. Especifica esto o perInstanceProperties. Usa una secuencia de caracteres de almohadilla (#) para que Compute Engine la sustituya por una secuencia de números. Por ejemplo, si usas vm-# como patrón de nombre, se generarán VMs con nombres como vm-1 y vm-2, hasta el número de VMs especificado por --count, que debe ser igual o inferior al número de VMs que permite el patrón de nombre.

    Cuando se usa un patrón de nombre, Compute Engine intenta evitar conflictos de nombres comprobando los nombres de las VMs creadas a partir de solicitudes anteriores.

  • PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...: lista de nombres predefinidos de las VMs que se van a crear. Especifica esta opción o namePattern. Si se usa esta marca y se especifica COUNT, COUNT debe ser igual al número de nombres proporcionados.

  • COUNT: número de VMs que se van a crear. Este valor debe ser menor o igual que el número de máquinas virtuales permitidas por NAME_PATTERN. Si usa perInstanceProperties, no tiene que especificar COUNT, pero, si lo hace, debe ser igual al número de nombres proporcionados.

  • MIN_COUNT: número mínimo de máquinas virtuales que se van a crear. En la siguiente tabla se describe el comportamiento de la solicitud en función de cómo definas esta marca:

    Valor Descripción
    Sin establecer El valor predeterminado es COUNT. Si Compute Engine no puede crear el número de VMs especificado por COUNT, la solicitud falla y no se crea ninguna VM.
    1 Compute Engine crea tantas máquinas virtuales como sea posible, hasta un máximo de COUNT.
    Mayor que 1 y menor que COUNT Compute Engine crea al menos MIN_COUNT VMs y un máximo de COUNT VMs. Si no se pueden crear MIN_COUNT VMs, la solicitud falla y no se crea ninguna VM.
  • LOCATION_POLICY: las zonas que se van a incluir o excluir de una región. Use una lista de pares clave-valor, con la zona como clave y la política como valor. Los valores válidos de la política son ALLOW (el valor predeterminado) y DENY. A continuación, se muestra un valor de ejemplo de este campo:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • TARGET_DISTRIBUTION_SHAPE: la distribución de las VMs en las zonas especificadas. Usa el campo locationPolicy para especificar las zonas. En la siguiente tabla se muestran los valores válidos de este campo:

    Valor Descripción
    ANY_SINGLE_ZONE Fuerza la colocación de las VMs en una sola zona y prioriza la utilización de las reservas no utilizadas. Úsalo para evitar el tráfico saliente de la red entre zonas o para reducir la latencia de la red. Este es el valor predeterminado.
    BALANCED Intenta distribuir las VMs de forma uniforme entre todas las zonas de la región.
    ANY Permite distribuir las máquinas virtuales en varias zonas de una región. Elige las zonas que tienen recursos disponibles y que maximizan las reservas zonales sin usar.

Crear máquinas virtuales en bloque en una zona

Para crear máquinas virtuales en bloque en una zona, usa la CLI de gcloud o la API de Compute Engine.

gcloud

Para crear VMs de forma masiva en una zona específica, usa el siguiente gcloud compute instances bulk createcomando.

gcloud compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --zone=ZONE \
    --count=COUNT \
    [ --min-count=MIN_COUNT ]

Haz los cambios siguientes:

  • NAME_PATTERN: el patrón de nombre de las VMs. Usa una secuencia de caracteres de almohadilla (#) para que Compute Engine la sustituya por una secuencia de números. Por ejemplo, si usas vm-# como patrón de nombre, se generarán VMs con nombres como vm-1 y vm-2, hasta el número de VMs especificado por --count, que debe ser igual o inferior al número de VMs que permite el patrón de nombre.

    Cuando se usa un patrón de nombre, Compute Engine intenta evitar conflictos de nombres comprobando los nombres de las VMs creadas a partir de solicitudes anteriores.

  • PREDEFINED_NAMES: una lista de nombres predefinidos para las VMs que se van a crear. Si usas esta marca y especificas COUNT, COUNT debe ser igual al número de nombres proporcionados.

  • ZONE: la zona en la que se crearán las VMs.

  • COUNT: número de VMs que se van a crear. Este valor debe ser menor o igual que el número de máquinas virtuales permitidas por NAME_PATTERN. Si usa --predefined-names, no tiene que especificar COUNT, pero si lo hace, debe ser igual al número de nombres proporcionados.

  • MIN_COUNT: número mínimo de máquinas virtuales que se van a crear. En la siguiente tabla se describe el comportamiento de la solicitud en función de cómo definas esta marca:

    Valor Descripción
    Sin establecer El valor predeterminado es COUNT. Si Compute Engine no puede crear el número de VMs especificado por COUNT, la solicitud falla y no se crea ninguna VM.
    1 Compute Engine crea tantas máquinas virtuales como sea posible, hasta un máximo de COUNT.
    Mayor que 1 y menor que COUNT Compute Engine crea al menos MIN_COUNT VMs y un máximo de COUNT VMs. Si no se pueden crear MIN_COUNT VMs, la solicitud falla y no se crea ninguna VM.

REST

Para crear VMs en bloque en una zona, usa el siguiente instances.bulkInsert método.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {},
    "PREDEFINED_NAME_2": {},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  ...
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto.

  • ZONE: la zona en la que se crearán las VMs.

  • NAME_PATTERN: el patrón de nombre de las VMs. Especifica esto o perInstanceProperties. Usa una secuencia de caracteres de almohadilla (#) para que Compute Engine la sustituya por una secuencia de números. Por ejemplo, si usas vm-# como patrón de nombre, se generarán VMs con nombres como vm-1 y vm-2, hasta el número de VMs especificado por --count, que debe ser igual o inferior al número de VMs que permite el patrón de nombre.

    Cuando se usa un patrón de nombre, Compute Engine intenta evitar conflictos de nombres comprobando los nombres de las VMs creadas a partir de solicitudes anteriores.

  • PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...: lista de nombres predefinidos de las VMs que se van a crear. Especifica esta opción o namePattern. Si se usa esta marca y se especifica COUNT, COUNT debe ser igual al número de nombres proporcionados.

  • COUNT: número de VMs que se van a crear. Este valor debe ser menor o igual que el número de máquinas virtuales permitidas por NAME_PATTERN. Si usa perInstanceProperties, no tiene que especificar COUNT, pero, si lo hace, debe ser igual al número de nombres proporcionados.

  • MIN_COUNT: número mínimo de máquinas virtuales que se van a crear. En la siguiente tabla se describe el comportamiento de la solicitud en función de cómo definas esta marca:

    Valor Descripción
    Sin establecer El valor predeterminado es COUNT. Si Compute Engine no puede crear el número de VMs especificado por COUNT, la solicitud falla y no se crea ninguna VM.
    1 Compute Engine crea tantas máquinas virtuales como sea posible, hasta un máximo de COUNT.
    Mayor que 1 y menor que COUNT Compute Engine crea al menos MIN_COUNT VMs y un máximo de COUNT VMs. Si no se pueden crear MIN_COUNT VMs, la solicitud falla y no se crea ninguna VM.

Crear VMs con nombres de host personalizados en bloque

Puedes crear máquinas virtuales con nombres de host personalizados en bloque en una región o en una zona mediante la CLI de gcloud o la API de Compute Engine.

Debes configurar manualmente el registro DNS de tu nombre de host personalizado. Para obtener más información, consulta las limitaciones.

Si no especificas un nombre de host, Compute Engine asignará a las VMs uno de los siguientes:

  • VM_NAME.c.PROJECT_ID.internal cuando habilitas el DNS global
  • VM_NAME.ZONE.c.PROJECT_ID.internal cuando habilitas el DNS zonal

Para obtener más información, consulta Nombres de DNS internos.

gcloud

Para crear VMs de forma masiva con nombres de host personalizados en una región específica, usa el siguiente gcloud beta compute instances bulk createcomando.

gcloud beta compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --per-instance-hostnames=[VM_NAME=HOSTNAME,...] \
    --zone=REGION \
    --count=COUNT \
    [ --min-count=MIN_COUNT ]
    [--location-policy=LOCATION_POLICY \ ]
    [--target-distribution-shape=TARGET_DISTRIBUTION_SHAPE ]

Haz los cambios siguientes:

  • NAME_PATTERN: el patrón de nombre de las VMs. Usa una secuencia de caracteres de almohadilla (#) para que Compute Engine la sustituya por una secuencia de números. Por ejemplo, si usas vm-# como patrón de nombre, se generarán VMs con nombres como vm-1 y vm-2, hasta el número de VMs especificado por --count, que debe ser igual o inferior al número de VMs que permite el patrón de nombre.

    Cuando se usa un patrón de nombre, Compute Engine intenta evitar conflictos de nombres comprobando los nombres de las VMs creadas a partir de solicitudes anteriores.

  • PREDEFINED_NAMES: una lista de nombres predefinidos para las VMs que se van a crear. Si usas esta marca y especificas COUNT, COUNT debe ser igual al número de nombres proporcionados.

  • [VM_NAME=HOSTNAME, ...]: una lista de pares clave-valor de nombres predefinidos para las VMs y nombres de host de dominio completos que quieras asignar a las VMs. Los nombres de host personalizados deben cumplir los requisitos de la RFC 1035 para que sean válidos.

  • REGION: la zona en la que se crearán las VMs.

  • COUNT: número de VMs que se van a crear. Este valor debe ser menor o igual que el número de máquinas virtuales permitidas por NAME_PATTERN. Si usa --predefined-names, no tiene que especificar COUNT, pero si lo hace, debe ser igual al número de nombres proporcionados.

  • MIN_COUNT: número mínimo de máquinas virtuales que se van a crear. En la siguiente tabla se describe el comportamiento de la solicitud en función de cómo definas esta marca:

    Valor Descripción
    Sin establecer El valor predeterminado es COUNT. Si Compute Engine no puede crear el número de VMs especificado por COUNT, la solicitud falla y no se crea ninguna VM.
    1 Compute Engine crea tantas máquinas virtuales como sea posible, hasta un máximo de COUNT.
    Mayor que 1 y menor que COUNT Compute Engine crea al menos MIN_COUNT VMs y un máximo de COUNT VMs. Si no se pueden crear MIN_COUNT VMs, la solicitud falla y no se crea ninguna VM.
  • LOCATION_POLICY: las zonas que se van a incluir o excluir de una región. Use una lista de pares clave-valor, con la zona como clave y la política como valor. Los valores válidos de la política son ALLOW (el valor predeterminado) y DENY. A continuación, se muestra un valor de ejemplo de este campo:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • TARGET_DISTRIBUTION_SHAPE: la distribución de las VMs en las zonas especificadas. Usa el campo locationPolicy para especificar las zonas. En la siguiente tabla se muestran los valores válidos de este campo:

    Valor Descripción
    ANY_SINGLE_ZONE Fuerza la colocación de las VMs en una sola zona y prioriza la utilización de las reservas no utilizadas. Úsalo para evitar el tráfico saliente de la red entre zonas o para reducir la latencia de la red. Este es el valor predeterminado.
    BALANCED Intenta distribuir las VMs de forma uniforme entre todas las zonas de la región.
    ANY Permite distribuir las máquinas virtuales en varias zonas de una región. Elige las zonas que tienen recursos disponibles y que maximizan las reservas zonales sin usar.

REST

Para crear VMs con nombres de host personalizados de forma masiva en una región específica, usa el siguiente instances.bulkInsertmétodo:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {"hostname": HOSTNAME_1},
    "PREDEFINED_NAME_2": {"hostname": HOSTNAME_2},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  "locationPolicy": {
    "LOCATION_POLICY"
    },
    "targetShape": "TARGET_DISTRIBUTION_SHAPE"
  ...
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto.

  • REGION: la región en la que se crearán las VMs.

  • NAME_PATTERN: el patrón de nombre de las VMs. Especifica esto o perInstanceProperties. Usa una secuencia de caracteres de almohadilla (#) para que Compute Engine la sustituya por una secuencia de números. Por ejemplo, si usas vm-# como patrón de nombre, se generarán VMs con nombres como vm-1 y vm-2, hasta el número de VMs especificado por --count, que debe ser igual o inferior al número de VMs que permite el patrón de nombre.

    Cuando se usa un patrón de nombre, Compute Engine intenta evitar conflictos de nombres comprobando los nombres de las VMs creadas a partir de solicitudes anteriores.

  • PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...: lista de nombres predefinidos de las VMs que se van a crear. Especifica esta opción o namePattern. Si se usa esta marca y se especifica COUNT, COUNT debe ser igual al número de nombres proporcionados.

  • HOSTNAME_1, HOSTNAME_2, ...: nombres de host de dominio completos que quieras asignar a las VMs. Los nombres de host personalizados deben cumplir los requisitos de la RFC 1035 para que sean válidos.

    Por ejemplo, para crear dos VMs, vm-1 y vm-2, con los nombres de host personalizados my-host1234.example.com y test.example.com, respectivamente, especifica la propiedad hostname en perInstanceProperties de la siguiente manera:

    {
    ...
    "perInstanceProperties": {
    "vm-1": { "hostname": "my-host1234.example.com" },
    "vm-2": { "hostname": "test.example.com" },
    ...
    },
    
  • COUNT: número de VMs que se van a crear. Este valor debe ser menor o igual que el número de máquinas virtuales permitidas por NAME_PATTERN. Si usa perInstanceProperties, no tiene que especificar COUNT, pero, si lo hace, debe ser igual al número de nombres proporcionados.

  • MIN_COUNT: número mínimo de máquinas virtuales que se van a crear. En la siguiente tabla se describe el comportamiento de la solicitud en función de cómo definas esta marca:

    Valor Descripción
    Sin establecer El valor predeterminado es COUNT. Si Compute Engine no puede crear el número de VMs especificado por COUNT, la solicitud falla y no se crea ninguna VM.
    1 Compute Engine crea tantas máquinas virtuales como sea posible, hasta un máximo de COUNT.
    Mayor que 1 y menor que COUNT Compute Engine crea al menos MIN_COUNT VMs y un máximo de COUNT VMs. Si no se pueden crear MIN_COUNT VMs, la solicitud falla y no se crea ninguna VM.
  • LOCATION_POLICY: las zonas que se van a incluir o excluir de una región. Use una lista de pares clave-valor, con la zona como clave y la política como valor. Los valores válidos de la política son ALLOW (el valor predeterminado) y DENY. A continuación, se muestra un valor de ejemplo de este campo:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • TARGET_DISTRIBUTION_SHAPE: la distribución de las VMs en las zonas especificadas. Usa el campo locationPolicy para especificar las zonas. En la siguiente tabla se muestran los valores válidos de este campo:

    Valor Descripción
    ANY_SINGLE_ZONE Fuerza la colocación de las VMs en una sola zona y prioriza la utilización de las reservas no utilizadas. Úsalo para evitar el tráfico saliente de la red entre zonas o para reducir la latencia de la red. Este es el valor predeterminado.
    BALANCED Intenta distribuir las VMs de forma uniforme entre todas las zonas de la región.
    ANY Permite distribuir las máquinas virtuales en varias zonas de una región. Elige las zonas que tienen recursos disponibles y que maximizan las reservas zonales sin usar.

Consultar el estado de una solicitud para crear VMs en bloque

Cuando creas una solicitud de mutación, Compute Engine devuelve un recurso operation que puedes sondear para obtener el estado de la operación. Para obtener más información, consulta Gestionar respuestas de la API.

Para obtener el estado de una solicitud de inserción masiva, envía una solicitud HTTP GET al recurso operation:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/OPERATION_ID

Para obtener el estado de una solicitud de inserción en bloque regional, envía la siguiente solicitud:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/operations/OPERATION_ID

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto en el que vas a crear las VMs
  • REGION: la región en la que vas a crear las VMs
  • ZONE: la zona en la que vas a crear las VMs.
  • OPERATION_ID: el ID de la operación de inserción en bloque

El objeto instancesBulkInsertOperationMetadata de la respuesta contiene los siguientes detalles de la operación:

  • status: el estado es uno de los siguientes:
    • CREATING: la creación de la VM está en curso
    • ROLLING_BACK: la solicitud ha fallado y se está revirtiendo
    • DONE: se ha completado correctamente la creación o la restauración de la VM
  • targetVmCount: número de VMs que se van a crear en la zona especificada
  • createdVmCount: número de VMs ya creadas en la zona especificada
  • failedToCreateVmCount: número de VMs que no se han podido crear en la zona especificada
  • deletedVmCount: número de VMs que se han eliminado al revertir una operación fallida

El campo progress de la respuesta representa el porcentaje de finalización de la operación.

El estado de la operación de inserción masiva es RUNNING hasta que Compute Engine crea correctamente al menos el número mínimo de VMs y no se creen más VMs ni se revierta la solicitud.

Mientras se esté llevando a cabo la operación de inserción en bloque, debería ver una respuesta similar a la siguiente:

{
  "kind" : "compute#operation",
  "id": "4653028658507445766",
  "name": "operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationType": "bulkInsert",
  "targetLink":  "https://www.googleapis.com/compute/v1/projects/my-project"
  "targetId": 4653028658507445766,
  "status": "RUNNING",
  "progress": 2,
  "user": "example@google.com",
  "insertTime": "2023-04-23T09:57:13.474-07:00",
  "startTime": "2023-04-23T09:57:13.474-07:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/operations/operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationGroupId": "4653028658507445766",
  "metadata":
    "instances_bulk_insert_operation_metadata": {
      "per_location_status": {
         "zones/us-central1-a": {
           "status": "CREATING",
           "targetVmCount": 50,
           "createdVmCount": 1
         }
      }
    }
}

En este ejemplo, se ha creado una instancia correctamente y la operación se ha completado al 2 %.

La operación devuelve el estado DONE cuando Compute Engine crea correctamente al menos el número mínimo de VMs especificado por minCount o cuando Compute Engine completa la reversión de la solicitud. Una vez que se hayan creado correctamente las VMs solicitadas, recibirás una respuesta similar a la siguiente:

{
  "endTime": "2023-04-23T09:58:13.474-07:00",
  "id": "5053101474378293244",
  "insertTime": "2023-04-23T09:57:13.474-07:00",
  "instancesBulkInsertOperationMetadata": {
    "perLocationStatus": {
      "zones/us-central1-a": {
        "status": "DONE",
        "createdVmCount": 50,
        "targetVmCount": 50
      }
    }
  },
  "kind": "compute#operation",
  "name": "operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationGroupId": "4653028658507445766",
  "operationType": "bulkInsert",
  "progress": 100,
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/operations/operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "startTime": "2023-09-11T16:21:55.629-07:00",
  "status": "DONE",
  "targetId": "625521788110",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/my-project",
  "user": "example@google.com",
  "zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a"
}

Para obtener más información, consulta la documentación del objeto instancesBulkInsertOperationMetadata.

Consultar el estado de una sola máquina virtual

Para comprobar el estado de una sola máquina virtual creada a partir de una solicitud para crear máquinas virtuales en bloque, usa la CLI de gcloud o la API Compute Engine.

gcloud

  1. En el Operation devuelto por la solicitud, obtén el valor de la propiedad operationGroupId.

  2. Usa la propiedad operationGroupId como filtro con el comando gcloud compute operations list para buscar en todas las operaciones y zonas del proyecto las VMs asociadas a la solicitud regional o zonal:

    gcloud compute operations list \
       --filter=(operationGroupId=OPERATION_GROUP_ID)
    
  3. Para obtener el resto de las propiedades de la máquina virtual, haga lo siguiente:

    • En la lista de operaciones, targetLink representa la ruta de la VM. Usa el gcloud compute instances describe comando con esta ruta como nombre de la VM para obtener sus propiedades:

      gcloud compute instances describe VM_NAME
      
    • Usa el gcloud compute instances list comando con un filtro que incluya los nombres de las VMs de la lista de operaciones:

      gcloud compute instances list VM_NAME \
         --filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      
    • Usa el comando gcloud compute instances list para obtener las propiedades de las VMs de todas las zonas y regiones, y filtra por una etiqueta que sea única para las instancias o por sus nombres:

      gcloud compute instances list \
         --filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      

REST

  1. En el Operation devuelto por la solicitud, obtén el valor de la propiedad operationGroupId.

  2. Usa la propiedad operationGroupId para obtener la lista de operaciones de VM asociadas a la solicitud regional o por zonas:

    • Si has enviado una solicitud regional, para buscar en todas las operaciones y zonas del proyecto, usa el método globalOperations.aggregatedList e incluye la propiedad operationGroupId como filtro:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/aggregated/operations?filter=(operationGroupId=OPERATION_GROUP_ID)
      
    • Si has enviado una solicitud zonal, para enumerar las operaciones de esa zona, usa el método zoneOperations.get e incluye la propiedad operationGroupId en el cuerpo de la solicitud:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances/bulkInsert
      
      {
      ...
      "operationGroupId":"OPERATION_GROUP_ID"
      ...
      }
      
  3. Para obtener el resto de las propiedades de la máquina virtual, haga lo siguiente:

    • En la lista de operaciones, targetLink representa la ruta de la máquina virtual. Usa el método instances.get con esta ruta como nombre de la VM para obtener todas las propiedades de la VM:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances/VM_NAME
      
    • Usa el instances.get método con un filtro que incluya los nombres de las VMs de la lista de operaciones:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances?filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      
    • Usa el instances.aggregatedListmétodo para obtener las propiedades de las VMs de todas las zonas y regiones, y filtrar por una etiqueta que sea única para las instancias o por sus nombres:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/aggregated/instances?filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      

Ejemplos de pseudocódigo

En los siguientes ejemplos de pseudocódigo se muestra cómo personalizar las solicitudes para crear VMs en bloque.

Crear VMs en bloque en una región a partir de un conjunto de regiones

En el siguiente pseudocódigo se describe cómo crear 1000 VMs en una región a partir de un conjunto de regiones. Cuando se intenta crear VMs en bloque en una región a partir de un conjunto de regiones, la solicitud primero comprueba la capacidad. Si no hay suficiente capacidad, la solicitud falla inmediatamente y se vuelve a intentar con la siguiente región del conjunto.

  1. Especifica el número de VMs que se crearán en una zona.

    nTarget = 1000
    
  2. Designa las regiones en las que se intentará crear las VMs.

    acceptableRegions = ["us-central1", "us-east1", "us-west1"]
    
  3. Itera por las regiones e intenta crear las VMs en cada región hasta que se complete la operación.

    for region in acceptableRegions:
      call bulk API: region=region, location-policy=location-policy, count=nTarget
      if request succeeds and the operation succeeds:
        break
    

Crear VMs en bloque en una zona con un tipo de máquina

En el siguiente pseudocódigo se describe cómo crear varias VMs en una zona con un tipo de máquina específico. Cuando se intenta crear máquinas virtuales en bloque con el mismo tipo de máquina, la solicitud primero comprueba la disponibilidad de esos tipos de máquina. Si no hay suficiente cantidad del tipo de máquina disponible, la solicitud falla inmediatamente y se vuelve a intentar con el siguiente tipo de máquina.

  1. Especifica el número de VMs que quieres crear y la región en la que quieres crearlas.

    nTarget = 1000
    region = "us-central1"
    
  2. Especifica las familias de máquinas en las que se intentará crear las VMs.

    acceptableMachineFamilies = ["n2","c2","e2","n1"]
    
  3. Itera por el conjunto de tipos de máquina e intenta crear las VMs en el tipo de máquina hasta que se complete correctamente.

    for family in acceptableMachineFamilies:
      call bulk APIs: region=region, count=nTarget, machineFamily=family
      if request succeeds and the operation succeeds:
        break
    

Crear más de 5000 VMs en una zona

Cuando creas VMs en bloque, solo puedes crear 5000 VMs con cada solicitud. El siguiente pseudocódigo describe cómo crear más de 5000 VMs en una zona enviando varias solicitudes.

  1. Especifica el número de VMs que quieres crear, un contador para hacer un seguimiento del número total de VMs creadas, la región en la que quieres crear las VMs y una variable para almacenar la zona en la que Compute Engine crea las VMs.

    nTarget = 10000
    nCreated = 0
    region = "us-central1"
    targetZone = ""
    
  2. Envía una solicitud inicial para crear 5000 VMs, guarda la zona devuelta por la solicitud y actualiza el contador del número de VMs creadas.

    call bulk API: region=region, count=5000
    targetZone = zone chosen by bulk API
    nCreated += # of VMs created
    
  3. Sigue enviando solicitudes para crear hasta 5000 VMs a la vez en la zona hasta que Compute Engine cree el número especificado de VMs.

    while(nTarget - nCreated > 0):
      call bulk API: zone=targetZone, count=5000
      nCreated += # of VMs created
    

Crear VMs en bloque y ver su estado

En el siguiente procedimiento se muestra cómo crear un grupo de VMs con nombres predefinidos y, a continuación, ver su estado:

  1. Especifica el número de VMs que quieres crear, la zona en la que quieres crearlas y una estructura de datos en la que almacenar los nombres.

    nTarget = 1000
    targetZone = "us-central-1a"
    names = []
    
  2. Genera los nombres con patrón de las VMs y añádelos a la estructura de datos.

    for n in range(0, 1000):
      names.push("instance-%d".format(n))
    
  3. Crea las VMs y usa perInstanceProperties para especificar los nombres.

    call bulk API(zone=targetZone, count=nTarget, names=perInstanceProperties)
    
  4. Obtén los detalles de las VMs mediante el instances.listmétodo con un filtro para los nombres de las VMs de las que quieras obtener los detalles.

    instances.list(filter=(name = "instance-1") OR (name = "instance-2") ...)
    

Siguientes pasos

Después de crear VMs en bloque, haga una o ambas de las siguientes acciones para simplificar la gestión de esas VMs: