Garanta a disponibilidade de recursos através de reservas de VMs

Este documento explica como criar tarefas que são executadas em recursos reservados e como impedir que as tarefas consumam reservas.

As reservas são uma funcionalidade do Compute Engine. Uma reserva oferece um nível de garantia muito elevado na obtenção de capacidade para uma ou mais VMs com a configuração de hardware especificada. Uma reserva de uma VM incorre nos custos dessa VM desde o momento em que cria a reserva até a eliminar. No entanto, enquanto estiver a consumir essa VM, o custo total é equivalente a uma VM sem uma reserva.

Geralmente, as reservas são úteis quando a disponibilidade de capacidade é criticamente importante ou para evitar erros na obtenção de recursos. Especificamente para o Batch, considere usar reservas dedicadas para ajudar a minimizar o tempo de agendamento de tarefas ou tente usar reservas existentes enquanto não estão a ser usadas. Se tiver reservas pouco usadas, como reservas necessárias para descontos de utilização comprometida, pode configurar tarefas para tentar consumi-las enquanto não estão a ser usadas para tentar ajudar a otimizar os custos incorridos. Em alternativa, se quiser priorizar a disponibilidade de recursos para outras cargas de trabalho no seu projeto, pode bloquear explicitamente uma tarefa de consumir reservas.

Para saber mais sobre as reservas, consulte a documentação do Compute Engine sobre reservas.

Antes de começar

  1. Se nunca usou o Batch, reveja o artigo Comece a usar o Batch e ative o Batch concluindo os pré-requisitos para projetos e utilizadores.
  2. Certifique-se de que tem as autorizações para criar uma reserva ou ver uma reserva existente que quer que as VMs de uma tarefa consumam conforme necessário.
  3. Para receber as autorizações de que precisa para criar uma tarefa, peça ao seu administrador para lhe conceder as seguintes funções de IAM:

    Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

    Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Restrições

Além das restrições gerais para reservas, o Batch também tem as seguintes restrições:

  • As VMs de uma tarefa não podem consumir reservas partilhadas.
  • As VMs de uma tarefa não podem consumir reservas se qualquer uma especificar uma política de posicionamento compacta.
  • Se criar uma tarefa através da Google Cloud consola, as respetivas VMs consomem automaticamente as reservas correspondentes. Para consumir uma reserva específica ou impedir que as VMs consumam reservas, tem de definir o campo reservation quando cria uma tarefa através da CLI gcloud ou da API Batch.

Requisitos

Esta secção resume os requisitos para que as VMs de uma tarefa consumam uma reserva. Para mais informações acerca de todos os requisitos, consulte os requisitos gerais para reservas na documentação do Compute Engine e o procedimento para planear a sua configuração mais adiante neste documento.

  • Para que as VMs de uma tarefa sejam geralmente capazes de consumir uma reserva, têm de ser cumpridas todas as condições seguintes:

    • A tarefa e a reserva têm de especificar propriedades da VM que correspondam exatamente.

    • Tem de agir em conformidade com todas as restrições neste documento e todos os outros requisitos gerais para reservas.

  • Para que cada VM de uma tarefa consuma com êxito uma reserva, a reserva tem de ter capacidade não utilizada disponível durante o tempo de execução da VM.

    A capacidade não utilizada de uma reserva é a diferença entre o número de VMs e o número de VMs que a consomem atualmente. As VMs tentam consumir reservas sempre que tem capacidade de reserva não utilizada. Assim, uma VM pode começar a consumir uma reserva quando é criada ou mais tarde durante o respetivo tempo de execução. Uma VM não para de consumir uma reserva até que a VM pare de ser executada ou a reserva seja eliminada.

    Consoante a capacidade de reserva não utilizada total, nenhuma, algumas ou todas as VMs de uma tarefa podem consumir reservas, e a quantidade de VMs reservadas pode variar ao longo do tempo de execução da tarefa.

Crie e execute uma tarefa que possa consumir VMs reservadas

  1. Planeie a sua configuração. Para se certificar de que o seu trabalho e reserva são compatíveis, conclua os seguintes passos.

    Se quiser consumir uma reserva já existente, tem de criar uma tarefa com uma configuração correspondente. Caso contrário, se planear criar uma nova reserva, selecione as opções de configuração que preferir.

    1. Determine as propriedades da reserva. Devido às restrições, o tipo de partilha tem de ser de projeto único, que é a opção predefinida para uma reserva. Determine os valores que quer usar para as seguintes propriedades de reserva:

      • Tipo de consumo*
      • Número de VMs

      *O tipo de consumo da reserva (especificamente segmentado ou consumido automaticamente) determina que VMs podem consumir a reserva.

      O número de VMs representa a capacidade total de uma reserva. Ao decidir este valor, considere o número de VMs da tarefa.

    2. Determine as propriedades da VM para a tarefa e a reserva. Devido às restrições, nem a tarefa nem a reserva podem especificar uma política de posicionamento compacta, que é a opção predefinida para reservas e tarefas. Determine os valores que quer usar para as seguintes propriedades de VM, que têm de corresponder exatamente à reserva e à tarefa:

      • Projeto
      • Zona*
      • Tipo de máquina
      • Plataforma de CPU mínima (se aplicável)
      • Tipo e quantidade de GPU (se aplicável)
      • Tipo e quantidade de SSDs locais (se existirem)
      • Afinidade de reservas#

      *As VMs de tarefas têm de estar localizadas na mesma zona que as VMs reservadas. Tem de incluir esta zona no campo allowedLocations[] do trabalho ou, se omitir o campo allowedLocations[], definir a localização do trabalho para a região que contém esta zona.

      A tarefa tem de definir todas estas propriedades através dos subcampos policy ou de um modelo de instância de VM. Uma tarefa não pode especificar uma combinação de subcampos policy e um modelo.

      Não é possível definir um campo opcional para um recurso e omitir o mesmo para o outro. Defina ou omita o campo opcional para a reserva e a tarefa. Se a tarefa especificar um modelo de instância de VM, isto também se aplica aos campos do modelo especificado.

      #O tipo de consumo da reserva determina a afinidade de reserva necessária para as VMs da tarefa, que tem de especificar na tarefa da seguinte forma:

      • Se a tarefa estiver a usar um modelo de instância de VM, o modelo tem de configurar a afinidade de reserva, conforme explicado na documentação de reservas.
      • Se a tarefa não estiver a usar um modelo e a reserva for especificamente segmentada, especifique o nome da reserva no campo reservation da tarefa.
      • Caso contrário, se a tarefa não estiver a usar um modelo e a reserva for consumida automaticamente, omita o campo reservation da tarefa.
  2. Prepare a reserva. Se ainda não o fez, crie a reserva que quer que as VMs da tarefa consumam. Certifique-se de que a reserva tem as propriedades que planeou.

  3. Crie e execute o trabalho. Pode criar e executar uma tarefa que consuma VMs da reserva preparada através da CLI gcloud ou da API Batch:

    gcloud

    1. Crie um ficheiro JSON que especifique os detalhes de configuração da tarefa que define os subcampos do recurso de instância de VM (instances[]) para corresponderem exatamente às propriedades de VM de uma reserva.

      Por exemplo, para criar uma tarefa de script básica que consuma VMs de uma reserva, crie um ficheiro JSON com o seguinte conteúdo:

      {
        "taskGroups": [
          {
            "taskSpec": {
              "runnables": [
                {
                  "script": {
                    "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                  }
                }
              ]
            },
            "taskCount": 3
          }
        ],
        "allocationPolicy": {
          "instances": [
            {
              VM_RESOURCES
            }
          ],
        },
        "logsPolicy": {
          "destination": "CLOUD_LOGGING"
        }
      }
      

      Substitua VM_RESOURCES pelos recursos de VM que correspondem à reserva que quer que a tarefa consuma especificando os subcampos instances[] que planeou nos passos anteriores.

      Por exemplo, comece pelo seguinte valor para VM_RESOURCES:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }
      

      Para usar este valor, faça todas as seguintes alterações:

      1. Quer usar um modelo de instância?

        • Sim: substitua o campo policy pelo campo instanceTemplate e especifique um modelo de instância de VM existente que corresponda à reserva. Por exemplo, veja o exemplo de código para usar um modelo de instância de VM. Se a reserva usar GPUs ou SSDs locais, também tem de configurar o campo installGpuDrivers do trabalho e o campo volumes[], respetivamente. Caso contrário, ignore as restantes alterações.

        • Não: substitua MACHINE_TYPE pelo mesmo tipo de máquina que a reserva.

      2. A reserva inclui uma plataforma de CPU mínima?

        • Sim: substitua MIN_CPU_PLATFORM pela mesma plataforma de CPU mínima.

        • Não: remova o campo minCpuPlatform.

      3. A reserva inclui GPUs?

        • Sim: substitua INSTALL_GPU_DRIVERS, GPU_TYPE e GPU_COUNT para corresponder à reserva. Por exemplo, consulte o exemplo de código para usar GPUs.

        • Não: remova o campo installGpuDrivers e o campo accelerators[].

      4. A reserva inclui SSDs locais?

        • Sim: substitua LOCAL_SSD_SIZE e LOCAL_SSD_NAME para corresponder à reserva e monte os SSDs locais adicionando o campo volumes[] ao trabalho. Por exemplo, consulte o exemplo de código para usar SSDs locais.

        • Não: remova o campo disks[].

      5. A reserva usa o tipo de consumo segmentado especificamente?

        • Sim: substitua SPECIFIC_RESERVATION_NAME pelo nome da reserva.

        • Não: remova o campo reservation.

      Por exemplo, suponha que está a usar uma reserva consumida automaticamente para n2-standard-32 VMs que não especifica nenhuma plataforma de CPU mínima, GPUs ou SSDs locais. Além disso, não quer especificar um modelo de instância de VM. Nesse caso, tem de substituir VM_RESOURCES pelo seguinte valor:

      "policy": {
        "machineType": "n2-standard-32"
      }
      
    2. Para criar e executar a tarefa, use o comando gcloud batch jobs submit:

      gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
      

      Substitua o seguinte:

      • JOB_NAME: o nome da tarefa.

      • LOCATION: a localização do trabalho. A menos que a tarefa especifique o campo allowedLocations[], esta tem de ser a região que contém a zona da reserva.

      • JSON_CONFIGURATION_FILE: o caminho para um ficheiro JSON com os detalhes de configuração da tarefa.

    API

    Faça um pedido POST ao método jobs.create que define os subcampos do recurso de instância de VM (instances[]) para corresponderem exatamente às propriedades de VM de uma reserva.

    Por exemplo, para criar uma tarefa de script básica que consuma VMs de uma reserva, faça o seguinte pedido:

    POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            VM_RESOURCES
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto do seu projeto.

    • LOCATION: a localização do trabalho. A menos que a tarefa especifique o campo allowedLocations[], esta tem de ser a região que contém a zona da reserva.

    • JOB_NAME: o nome da tarefa.

    • VM_RESOURCES: os recursos de VM que correspondem à reserva que quer que a tarefa consuma especificando os subcampos instances[] que planeou nos passos anteriores.

      Por exemplo, comece pelo seguinte valor para VM_RESOURCES:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }

      Para usar este valor, faça todas as seguintes alterações:

      1. Quer usar um modelo de instância?

        • Sim: substitua o campo policy pelo campo instanceTemplate e especifique um modelo de instância de VM existente que corresponda à reserva. Por exemplo, veja o exemplo de código para usar um modelo de instância de VM. Se a reserva usar GPUs ou SSDs locais, também tem de configurar o campo installGpuDrivers do trabalho e o campo volumes[], respetivamente. Caso contrário, ignore as restantes alterações.

        • Não: substitua MACHINE_TYPE pelo mesmo tipo de máquina que a reserva.

      2. A reserva inclui uma plataforma de CPU mínima?

        • Sim: substitua MIN_CPU_PLATFORM pela mesma plataforma de CPU mínima.

        • Não: remova o campo minCpuPlatform.

      3. A reserva inclui GPUs?

        • Sim: substitua INSTALL_GPU_DRIVERS, GPU_TYPE e GPU_COUNT para corresponder à reserva. Por exemplo, consulte o exemplo de código para usar GPUs.

        • Não: remova o campo installGpuDrivers e o campo accelerators[].

      4. A reserva inclui SSDs locais?

        • Sim: substitua LOCAL_SSD_SIZE e LOCAL_SSD_NAME para corresponder à reserva e monte os SSDs locais adicionando o campo volumes[] ao trabalho. Por exemplo, consulte o exemplo de código para usar SSDs locais.

        • Não: remova o campo disks[].

      5. A reserva usa o tipo de consumo segmentado especificamente?

        • Sim: substitua SPECIFIC_RESERVATION_NAME pelo nome da reserva.

        • Não: remova o campo reservation.

      Por exemplo, suponha que está a usar uma reserva consumida automaticamente para n2-standard-32 VMs que não especifica nenhuma plataforma de CPU mínima, GPUs ou SSDs locais. Além disso, não quer especificar um modelo de instância de VM. Nesse caso, tem de substituir VM_RESOURCES pelo seguinte valor:

      "policy": {
        "machineType": "n2-standard-32"
      }

Crie e execute uma tarefa que não possa consumir VMs reservadas

Para impedir que uma tarefa consuma reservas, defina o campo reservation como NO_RESERVATION. Para mais informações sobre como impedir o consumo de reservas, consulte o artigo Impeça que as instâncias de computação consumam reservas na documentação do Compute Engine.

Pode criar e executar uma tarefa que não possa consumir nenhuma VM reservada através da CLI gcloud ou da API Batch.

gcloud

  1. Crie um ficheiro JSON que especifique os detalhes de configuração da tarefa e defina o campo reservation como NO_RESERVATION.

    Por exemplo, para criar uma tarefa de script básica que não possa consumir reservas, crie um ficheiro JSON com o seguinte conteúdo:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "reservation": "NO_RESERVATION"
            }
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. Para criar e executar a tarefa, use o comando gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Substitua o seguinte:

    • JOB_NAME: o nome da tarefa.

    • LOCATION: a localização do trabalho.

    • JSON_CONFIGURATION_FILE: o caminho para um ficheiro JSON com os detalhes de configuração da tarefa.

API

Faça um pedido POST ao método jobs.create que define o campo reservation como NO_RESERVATION.

Por exemplo, para criar uma tarefa de script básica que não possa consumir reservas, faça o seguinte pedido:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "reservation": "NO_RESERVATION"
        }
      }
    ],
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

Substitua o seguinte:

O que se segue?