Como consumir recursos por zona reservados


Você pode reservar instâncias do Compute Engine em uma zona específica para garantir que os recursos estejam disponíveis para as cargas de trabalho deles conforme a necessidade. Para mais detalhes sobre como gerenciar reservas, consulte Como reservar recursos por zona do Compute Engine.

Depois de criar reservas, é possível consumir os recursos reservados no GKE. O GKE é compatível com os mesmos modos de consumo do Compute Engine:

  • Consumo de recursos de qualquer reserva: somente padrão
  • Como consumir recursos de uma reserva específica: Standard e Autopilot
  • Como criar nós sem consumir nenhuma reserva: Standard e Autopilot

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando gcloud components update.

Consumir reservas de capacidade em clusters do Autopilot

Com os clusters do Autopilot, é possível consumir recursos de reservas de capacidade específicas do Compute Engine no mesmo projeto ou em um projeto compartilhado. A menos que especificado explicitamente, os clusters do Autopilot não consomem reservas. Essas reservas se qualificam para os descontos por compromisso de uso do Autopilot. Use a classe de computação Accelerator ou Performance para consumir reservas de capacidade.

  • Antes de começar, crie um cluster do Autopilot executando as seguintes versões:

    • Para consumir aceleradores reservados usando a classe de computação Accelerator: 1.28.6-gke.1095000 ou posterior
    • Para usar a classe de computação de desempenho: 1.28.6-gke.1369000 e posterior ou versão 1.29.1-gke.1575000 e posterior.

Criar reservas de capacidade para o Autopilot

Os pods do Autopilot podem consumir reservas específicas no mesmo projeto que o cluster ou em uma reserva compartilhada de um projeto diferente. Para consumir o hardware reservado, faça referência explícita a essa reserva no manifesto. É possível consumir reservas no Autopilot para os seguintes tipos de hardware:

  • Qualquer um dos seguintes tipos de GPU:
    • nvidia-h100-80gb: NVIDIA H100 (80 GB) (disponível apenas com a classe de computação Accelerator)
    • nvidia-a100-80gb: NVIDIA A100 (80GB)
    • nvidia-tesla-a100: NVIDIA A100 (40GB)
    • nvidia-l4: NVIDIA L4
    • nvidia-tesla-t4: NVIDIA T4

Para criar uma reserva de capacidade, consulte os recursos a seguir. Verifique se os tipos de máquina, tipos de aceleradores e quantidades de aceleradores correspondem ao que suas cargas de trabalho consumirão.

Consumir uma reserva específica no mesmo projeto no Autopilot

Nesta seção, mostramos como consumir uma reserva de capacidade específica que está no mesmo projeto que seu cluster.

  1. Salve o seguinte manifesto specific-autopilot.yaml como : Esse manifesto tem seletores de nós que consomem uma reserva específica.

    Instâncias de VM

    apiVersion: v1
    kind: Pod
    metadata:
      name: specific-same-project-pod
    spec:
      nodeSelector:
        cloud.google.com/compute-class: Performance
        cloud.google.com/machine-family: MACHINE_SERIES
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-affinity: "specific"
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 12
            memory: "50Gi"
            ephemeral: "200Gi"
    

    Substitua:

    • MACHINE_SERIES: uma série de máquinas que contém o tipo de máquina das VMs na sua reserva de capacidade específica. Por exemplo, se a reserva for para tipos de máquina c3-standard-4, especifique C3 no campo MACHINE_SERIES.
    • RESERVATION_NAME: o nome da reserva de capacidade do Compute Engine.

    Aceleradores

    apiVersion: v1
    kind: Pod
    metadata:
      name: specific-same-project-pod
    spec:
      nodeSelector:
        cloud.google.com/compute-class: "Accelerator"
        cloud.google.com/gke-accelerator: ACCELERATOR
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-affinity: "specific"
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 12
            memory: "50Gi"
            ephemeral: "200Gi"
          limits:
            nvidia.com/gpu: QUANTITY
    

    Substitua:

    • ACCELERATOR: o acelerador que você reservou na reserva de capacidade do Compute Engine. Precisa ser um dos valores abaixo:
      • nvidia-h100-80gb: NVIDIA H100 (80 GB) (disponível apenas com a classe de computação Accelerator)
      • nvidia-a100-80gb: NVIDIA A100 (80GB)
      • nvidia-tesla-a100: NVIDIA A100 (40GB)
      • nvidia-l4: NVIDIA L4
      • nvidia-tesla-t4: NVIDIA T4
    • RESERVATION_NAME: o nome da reserva de capacidade do Compute Engine.
    • QUANTITY: o número de GPUs a serem anexadas ao contêiner. Precisa ser uma quantidade compatível com a GPU especificada, conforme descrito em Quantidades de GPUs compatíveis.
  2. Implante o pod:

    kubectl apply -f specific-autopilot.yaml
    

O Autopilot usa a capacidade reservada na reserva especificada para provisionar um novo nó e posicionar o pod.

Consumir uma reserva compartilhada específica no Autopilot

Nesta seção, usamos os seguintes termos:

  • Projeto de proprietário: o projeto que é proprietário da reserva e que a compartilha com outros projetos.
  • Projeto do consumidor: o projeto que executa as cargas de trabalho que consomem a reserva compartilhada.

Para consumir uma reserva compartilhada, você precisa conceder ao agente de serviço do GKE acesso à reserva no projeto que é proprietário dela. Faça o seguinte:

  1. Crie um papel personalizado do IAM que contenha a permissão compute.reservations.list no projeto de proprietário:

    gcloud iam roles create ROLE_NAME \
        --project=OWNER_PROJECT_ID \
        --permissions='compute.reservations.list'
    

    Substitua:

    • ROLE_NAME: um nome para a nova função.
    • OWNER_PROJECT_ID: o ID do projeto que tem a reserva de capacidade.
  2. Conceda ao agente de serviço do GKE no projeto do consumidor acesso à reserva compartilhada no projeto proprietário:

    gcloud compute reservations add-iam-policy-binding RESERVATION_NAME \
        --project=OWNER_PROJECT_ID \
        --zone=ZONE \
        --member=service-CONSUMER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role='roles/ROLE_NAME'
    

    Substitua CONSUMER_PROJECT_NUMBER pelo número de projeto numérico do seu projeto de consumidor. Para encontrar esse número, consulte Como identificar projetos na documentação do Resource Manager.

  3. Salve o seguinte manifesto shared-autopilot.yaml como : Esse manifesto tem nodeSelectors que instruem o GKE a consumir uma reserva compartilhada específica.

    Instâncias de VM

    apiVersion: v1
    kind: Pod
    metadata:
      name: performance-pod
    spec:
      nodeSelector:
        cloud.google.com/compute-class: Performance
        cloud.google.com/machine-family: MACHINE_SERIES
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-project: OWNER_PROJECT_ID
        cloud.google.com/reservation-affinity: "specific"
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 12
            memory: "50Gi"
            ephemeral: "200Gi"
    

    Substitua:

    • MACHINE_SERIES: uma série de máquinas que contém o tipo de máquina das VMs na sua reserva de capacidade específica. Por exemplo, se a reserva for para tipos de máquina c3-standard-4, especifique C3 no campo MACHINE_SERIES.
    • RESERVATION_NAME: o nome da reserva de capacidade do Compute Engine.
    • OWNER_PROJECT_ID: o ID do projeto que tem a reserva de capacidade.

    Aceleradores

    apiVersion: v1
    kind: Pod
    metadata:
      name: specific-same-project-pod
    spec:
      nodeSelector:
        cloud.google.com/compute-class: "Accelerator"
        cloud.google.com/gke-accelerator: ACCELERATOR
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-project: OWNER_PROJECT_ID
        cloud.google.com/reservation-affinity: "specific"
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 12
            memory: "50Gi"
            ephemeral: "200Gi"
          limits:
            nvidia.com/gpu: QUANTITY
    

    Substitua:

    • ACCELERATOR: o acelerador que você reservou na reserva de capacidade do Compute Engine. Precisa ser um dos valores abaixo:
      • nvidia-h100-80gb: NVIDIA H100 (80 GB) (disponível apenas com a classe de computação Accelerator)
      • nvidia-a100-80gb: NVIDIA A100 (80GB)
      • nvidia-tesla-a100: NVIDIA A100 (40GB)
      • nvidia-l4: NVIDIA L4
      • nvidia-tesla-t4: NVIDIA T4
    • RESERVATION_NAME: o nome da reserva de capacidade do Compute Engine.
    • OWNER_PROJECT_ID: o ID do projeto que tem a reserva de capacidade.
    • QUANTITY: o número de GPUs a serem anexadas ao contêiner. Precisa ser uma quantidade compatível com a GPU especificada, conforme descrito em Quantidades de GPUs compatíveis.
  4. Implante o pod:

    kubectl apply -f shared-autopilot.yaml
    

O Autopilot usa a capacidade reservada na reserva especificada para provisionar um novo nó e posicionar o pod.

Como consumir instâncias reservadas no GKE Standard

Ao criar um cluster ou pool de nós, indique o modo de consumo de reserva especificando a sinalização --reservation-affinity.

Como consumir reservas correspondentes

Para consumir automaticamente qualquer reserva correspondente, defina a sinalização de afinidade de reserva como --reservation-affinity=any.

No modo de consumo de reserva any, os nós usam primeiro a capacidade de todas as reservas de projeto único antes das reservas compartilhadas, que estão mais disponíveis para outros projetos. Para saber como as instâncias são consumidas automaticamente, consulte a ordem de consumo.

Se quiser criar uma reserva e instâncias para consumir qualquer reserva, siga estas etapas:

  1. Crie uma reserva de três instâncias de VM:

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE --vm-count=3
    

    Substitua:

    • RESERVATION_NAME: o nome da reserva a ser criada.
    • MACHINE_TYPE: o tipo de máquina (somente nome) a ser usado para a reserva. Por exemplo, n1-standard-2.
  2. Verifique se a reserva foi criada corretamente:

    gcloud compute reservations describe RESERVATION_NAME
    

    Substitua RESERVATION_NAME pelo nome da reserva que você acabou de criar.

  3. Crie um cluster com um nó para consumir qualquer reserva correspondente:

    gcloud container clusters create CLUSTER_NAME \
        --machine-type=MACHINE_TYPE --num-nodes=1 \
        --reservation-affinity=any
    

    Substitua:

    • CLUSTER_NAME: o nome do cluster a ser criado.
    • MACHINE_TYPE: o tipo de máquina (somente nome) a ser usado no cluster. Exemplo:n1-standard-2
  4. Crie um pool de nós com três nós para consumir qualquer reserva correspondente:

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster CLUSTER_NAME --num-nodes=3 \
        --machine-type=MACHINE_TYPE --reservation-affinity=any
    

    Substitua:

    • NODEPOOL_NAME: o nome do pool de nós a ser criado;
    • CLUSTER_NAME: o nome do cluster criado anteriormente;
    • MACHINE_TYPE: o tipo de máquina (somente nome) a ser usado no pool de nós. Exemplo:n1-standard-2

O número total de nós é quatro, o que excede a capacidade da reserva. Assim, três dos nós consomem a reserva, e o último nó utiliza o pool geral de recursos do Compute Engine.

Como consumir uma reserva específica de projeto único

Para consumir uma reserva específica, defina a sinalização de afinidade de reserva como --reservation-affinity=specific e informe o nome dessa reserva. Nesse modo, as instâncias precisam usar a capacidade da reserva especificada na zona. A solicitação gerará uma falha se a reserva não tiver capacidade suficiente.

Se quiser criar uma reserva e instâncias para consumir uma reserva específica, siga estas etapas:

  1. Crie uma reserva específica de três instâncias de VM:

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE --vm-count=3 \
        --require-specific-reservation
    

    Substitua:

    • RESERVATION_NAME: o nome da reserva a ser criada.
    • MACHINE_TYPE: o tipo de máquina (somente nome) a ser usado para a reserva. Por exemplo, n1-standard-2.
  2. Crie um pool de nós com um único nó para consumir uma reserva específica de um único projeto:

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster CLUSTER_NAME \
        --machine-type=MACHINE_TYPE --num-nodes=1 \
        --reservation-affinity=specific --reservation=RESERVATION_NAME
    

    Substitua:

    • NODEPOOL_NAME: o nome do pool de nós a ser criado;
    • CLUSTER_NAME: o nome do cluster que você criou.
    • MACHINE_TYPE: o tipo de máquina (somente nome) a ser usado no cluster. Exemplo:n1-standard-2
    • RESERVATION_NAME: o nome da reserva a ser consumida.

Como consumir uma reserva compartilhada específica

Para criar uma reserva compartilhada específica e consumir a reserva compartilhada, execute as seguintes etapas:

  1. Siga as etapas em Como permitir e restringir projetos de criar e modificar reservas compartilhadas.

  2. Crie uma reserva compartilhada específica:

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE --vm-count=3 \
        --zone=ZONE \
        --require-specific-reservation \
        --project=OWNER_PROJECT_ID \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS
    

    Substitua:

    • RESERVATION_NAME: o nome da reserva a ser criada.
    • MACHINE_TYPE: o nome do tipo de máquina a ser usado para a reserva. Por exemplo, n1-standard-2.
    • OWNER_PROJECT_ID: o ID do projeto para o qual essa reserva compartilhada será criada. Se você omitir a sinalização --project, o GKE usará o projeto atual como proprietário por padrão.
    • CONSUMER_PROJECT_IDS: uma lista separada por vírgulas dos IDs dos projetos com os quais você quer compartilhar essa reserva. Por exemplo, project-1,project-2. É possível incluir de 1 a 100 projetos de consumidor. Esses projetos precisam estar na mesma organização do projeto de proprietário. Não inclua o OWNER_PROJECT_ID, porque ele pode consumir essa reserva por padrão.
  3. Consumir a reserva compartilhada:

     gcloud container node-pools create NODEPOOL_NAME \
         --cluster CLUSTER_NAME \
         --machine-type=MACHINE_TYPE --num-nodes=1 \
        --reservation-affinity=specific \
        --reservation=projects/OWNER_PROJECT_ID/reservations/RESERVATION_NAME
    

    Substitua:

    • NODEPOOL_NAME: o nome do pool de nós a ser criado;
    • CLUSTER_NAME: o nome do cluster que você criou.
    • MACHINE_TYPE: o nome do tipo de máquina a ser usado para o cluster. Por exemplo, n1-standard-2.
    • OWNER_PROJECT_ID: o ID do projeto em que a reserva compartilhada será criada.
    • RESERVATION_NAME: o nome da reserva compartilhada específica que será consumida.

Outras considerações sobre o consumo de uma reserva específica

Quando um pool de nós é criado com uma afinidade específica de reserva, incluindo pools padrão na criação do cluster, o tamanho dele é limitado à capacidade da reserva específica durante todo o ciclo de vida do pool. Isso afeta os seguintes recursos do GKE:

  • Cluster com várias zonas: em clusters regionais ou de várias zonas, os nós de um pool podem se estender por várias zonas. Como as reservas são exclusivas de uma zona, é necessário ter várias reservas. Para ter um pool de nós que consuma a reserva desses clusters, crie uma reserva específica com exatamente os mesmos nome e propriedades de máquina em cada zona do pool.
  • Upgrade automático de clusters e upgrades de pools de nós: se você não tiver capacidade extra na reserva específica, os upgrades de pools de nós ou o escalonamento automático do pool de nós poderão falhar porque as duas operações exigem criação de outras instâncias. Para resolver isso, altere o tamanho da reserva ou libere alguns dos seus recursos limitados.

Como criar nós sem consumir reservas

Para evitar expressamente o consumo de recursos de qualquer reserva, defina a afinidade como --reservation-affinity=none.

  1. Crie um cluster que não consuma nenhuma reserva:

    gcloud container clusters create CLUSTER_NAME --reservation-affinity=none
    

    Substitua CLUSTER_NAME pelo nome do cluster a ser criado.

  2. Crie um pool de nós que não consuma nenhuma reserva:

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster CLUSTER_NAME \
        --reservation-affinity=none
    

    Substitua:

    • NODEPOOL_NAME: o nome do pool de nós a ser criado;
    • CLUSTER_NAME: o nome do cluster criado anteriormente;

Como seguir reservas disponíveis entre zonas

Ao usar pools de nós em execução em várias zonas com reservas que não sejam iguais entre zonas, use a sinalização --location_policy=ANY. Isso garante que, quando novos nós forem adicionados ao cluster, eles sejam criados na zona que ainda tem reservas não utilizadas.

Reserva da TPU

As reservas de TPU são diferentes de outros tipos de máquina. Confira a seguir os aspectos específicos da TPU que precisam ser considerados ao criar reservas de TPU:

  • Ao usar TPUs no GKE, SPECIFIC é o único valor compatível com a flag --reservation-affinity de gcloud container node-pools create.
  • As reservas de TPU não podem ser compartilhadas entre projetos.

Para mais informações, consulte Reservas da TPU.

Limpar

Para evitar cobranças dos recursos usados nesta página na conta do Google Billing, siga estas etapas:

  1. Exclua os clusters criados executando o seguinte comando para cada um dos clusters:

    gcloud container clusters delete CLUSTER_NAME
    
  2. Exclua as reservas criadas executando o seguinte comando para cada uma das reservas:

    gcloud compute reservations delete RESERVATION_NAME
    

A seguir