Definir um posicionamento compacto para nós do GKE


É possível controlar se os nós do Google Kubernetes Engine (GKE) estão localizados fisicamente entre si em uma zona usando uma política de posicionamento compacto.

Visão geral

Ao criar pools de nós e cargas de trabalho em um cluster do GKE, é possível definir uma política de posicionamento compacto, que especifica que esses nós ou cargas de trabalho precisam ser colocados mais próximos uns dos outros em uma zona. Ter nós mais próximos uns dos outros pode reduzir a latência de rede entre os nós, o que pode ser útil principalmente para cargas de trabalho em lote fortemente acopladas.

Usar posição compacta com o Autopilot do GKE

Limitações

  • O GKE provisiona cargas de trabalho em um posicionamento compacto na mesma zona.
  • A posição compacta está disponível no Balanced e na GPU A100. Para saber mais, consulte os tipos de máquina.
  • A posição compacta está disponível para pods agrupados em até 150 nós.
  • a migração em tempo real para nós não é compatível.

Ativar uma política de posicionamento compacto

Para ativar a posição compacta do GKE Autopilot, adicione um nodeSelector à especificação do pod com as seguintes chaves:

  • cloud.google.com/gke-placement-group é o identificador atribuído ao grupo de pods que precisam ser executados juntos, no mesmo grupo de posicionamento compacto.

  • Uma das seguintes chaves para definir o tipo de recurso:

    • cloud.google.com/compute-class: "Balanced"
    • cloud.google.com/gke-accelerator: "nvidia-tesla-a100"

O exemplo a seguir é um trecho de uma especificação de pod que permite o posicionamento compacto. O identificador do grupo de posições é placement-group-1, e a classe de computação é Balanced:

  nodeSelector:
    cloud.google.com/gke-placement-group: "placement-group-1"
    cloud.google.com/compute-class: "Balanced"

Cada grupo de posições é limitado a 150 nós. Recomendamos limitar um grupo de posições somente às cargas de trabalho que se beneficiam desse agrupamento e distribuir essas cargas de trabalho em grupos de posições separados, sempre que possível.

Usar posição compacta com o GKE Standard

Limitações

O posicionamento compacto em pools de nós do GKE Standard tem as seguintes limitações:

Criar uma política de colocação de compactação

Para criar políticas de posicionamento compacto, especifique a opção placement-type=COMPACT durante a criação do pool de nós ou do cluster na Google Cloud CLI. Com essa configuração, o GKE tenta posicionar os nós em um pool mais perto um do outro.

Para usar uma política de recursos atual no cluster, especifique o local da política personalizada para a sinalização placement-policy durante a criação do pool de nós ou do cluster. Isso permite a flexibilidade de usar posicionamentos reservados, vários pools de nós com a mesma política de posicionamento e outras opções avançadas de posicionamento. No entanto, ela também requer mais operações manuais do que a especificação da sinalização --placement-type=COMPACT. Por exemplo, você precisa criar, excluir e manter as políticas de recursos personalizados. Certifique-se de que o número máximo de instâncias de VM seja respeitado em todos os pools de nós que usam a política de recursos. Se esse limite for atingido enquanto alguns dos pools de nós não tiverem atingido o tamanho máximo, haverá falha na adição de mais nós.

Se você não especificar as sinalizações placement-type e placement-policy, não haverá requisitos de posição de nó por padrão.

Criar uma política de posicionamento compacto em um novo cluster

Ao criar um novo cluster, é possível especificar uma política de posicionamento compacto que será aplicada ao pool de nós padrão. Ao criar pools de nós subsequentes para o cluster, você terá que especificar se aplicará o posicionamento compacto.

Para criar um novo cluster em que o pool de nós padrão tenha uma política de posicionamento compacto aplicada, use o seguinte comando:

gcloud container clusters create CLUSTER_NAME \
    --machine-type MACHINE_TYPE \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

Substitua:

  • CLUSTER_NAME: o nome do novo cluster.
  • MACHINE_TYPE: o tipo de máquina a ser usado em nós, que precisa ser um tipo de máquina C2 (por exemplo, c2-standard-4);
  • --placement-type COMPACT: aplica o posicionamento compacto de nós no pool de nós padrão.
  • MAX_UNAVAILABLE: número máximo de nós que podem estar indisponíveis ao mesmo tempo durante um upgrade do pool de nós. Para posicionamento compacto, recomendamos upgrades rápidos sem sobrecarga para otimizar a probabilidade de encontrar nós colocados durante os upgrades.

Criar uma política de posicionamento compacto em um cluster atual

Em um cluster atual, é possível criar um pool de nós que tenha uma política de posicionamento compacto aplicada.

Para criar um pool de nós que tenha uma política de posicionamento compacto aplicada, use este comando:

gcloud container node-pools create NODEPOOL_NAME \
    --machine-type MACHINE_TYPE \
    --cluster CLUSTER_NAME \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

Substitua:

  • NODEPOOL_NAME: o nome do novo pool de nós.
  • MACHINE_TYPE: o tipo de máquina a ser usado em nós, que precisa ser um tipo de máquina C2 (por exemplo, c2-standard-4);
  • CLUSTER_NAME: o nome do cluster atual.
  • --placement-type COMPACT: indica a aplicação de um posicionamento compacto para os nós no novo pool de nós.
  • MAX_UNAVAILABLE: número máximo de nós que podem estar indisponíveis ao mesmo tempo durante um upgrade do pool de nós. Para posicionamento compacto, recomendamos upgrades rápidos sem sobrecarga para otimizar a probabilidade de encontrar nós colocados durante os upgrades.

Criar pools de nós usando uma política de posicionamento personalizada compartilhada

É possível criar manualmente uma política de recursos e usá-la em vários pools de nós.

  1. Crie a política de recursos na região do cluster do Google Cloud:

    gcloud compute resource-policies create group-placement POLICY_NAME \
        --region REGION \
        --collocation collocated
    

    Substitua:

    • POLICY_NAME: o nome da política de recursos.
    • REGION: a região do cluster.
  2. Crie um pool de nós usando a política de recursos personalizados:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

    Substitua:

    • NODEPOOL_NAME: o nome do novo pool de nós.
    • MACHINE_TYPE: o tipo de máquina a ser usado em nós, que precisa ser um tipo de máquina C2 (por exemplo, c2-standard-4);
    • CLUSTER_NAME: o nome do cluster atual.
    • MAX_UNAVAILABLE: número máximo de nós que podem estar indisponíveis ao mesmo tempo durante um upgrade do pool de nós. Para posicionamento compacto, recomendamos upgrades rápidos sem sobrecarga para otimizar a probabilidade de encontrar nós colocados durante os upgrades.

Usar uma reserva do Compute Engine com uma política de posicionamento compacto

As reservas ajudam a garantir que o hardware esteja disponível em uma zona especificada, reduzindo o risco de falha na criação do pool de nós causada por hardware insuficiente.

  1. Crie uma reserva que especifique uma política de posicionamento compacta:

    gcloud compute reservations create RESERVATION_NAME \
        --vm-count MACHINE_COUNT \
        --machine-type MACHINE_TYPE \
        --resource-policies policy=POLICY_NAME \
        --zone ZONE \
        --require-specific-reservation
    

    Substitua:

    • RESERVATION_NAME: o nome da sua reserva.
    • MACHINE_COUNT: o número de nós reservados.
    • MACHINE_TYPE: o tipo de máquina a ser usado para nós, que precisa ser um tipo de máquina C2. Por exemplo, para usar um tipo de máquina C2 predefinido com 4 vCPUs, especifique c2-standard-4.
    • POLICY_NAME: o nome da política de recursos.
    • ZONE: a zona em que a reserva será criada.
  2. Crie um pool de nós especificando a política de posicionamento compacto e a reserva criada na etapa anterior:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --reservation-affinity specific \
        --reservation RESERVATION_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

Substitua:

  • NODEPOOL_NAME: o nome do novo pool de nós.
  • MACHINE_TYPE: o tipo de máquina a ser usado em nós, que precisa ser um tipo de máquina C2 (por exemplo, c2-standard-4);
  • CLUSTER_NAME: o nome do cluster atual.

Criar uma carga de trabalho em nós que usam posicionamento compacto

Para executar cargas de trabalho em nós dedicados que usam posicionamento compacto, é possível usar vários mecanismos do Kubernetes, como atribuir pods a nós e impedir a programação de pods indesejados em um grupo de nós para fazer isso.

No exemplo a seguir, adicionamos um taint aos nós dedicados e uma tolerância e afinidade correspondentes aos pods.

  1. Adicione um taint aos nós no pool de nós que tenha uma política de posicionamento compacto:

    kubectl taint nodes -l cloud.google.com/gke-nodepool=NODEPOOL_NAME dedicated-pool=NODEPOOL_NAME:NoSchedule
    
  2. Na definição da carga de trabalho, especifique a tolerância necessária e uma afinidade de nó. Veja um exemplo com um único pod:

    apiVersion: v1
    kind: Pod
    metadata:
      ...
    spec:
      ...
      tolerations:
      - key: dedicated-pool
        operator: "Equal"
        value: "NODEPOOL_NAME"
        effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: dedicated-pool
                operator: In
                values:
                - NODEPOOL_NAME
    

Em alguns locais, não é possível criar um pool de nós grande usando uma política de posicionamento compacto. Para limitar o tamanho desses pools de nós ao que é necessário, considere criar um pool de nós por carga de trabalho que exija posicionamento compacto.

Usar o posicionamento compacto para provisionamento automático de nós

A partir da versão 1.25 do GKE, o provisionamento automático de nós é compatível com a política de posicionamento compacto. Com o provisionamento automático de nós, o GKE provisiona pools de nós automaticamente com base na demanda de recursos do cluster. Para mais informações, consulte Como usar o provisionamento automático de nós.

Para ativar o posicionamento compacto no provisionamento automático de nós, adicione um nodeSelector à especificação do pod com as seguintes chaves:

  • cloud.google.com/gke-placement-group é o identificador atribuído ao grupo de pods que precisam ser executados juntos, no mesmo grupo de posicionamento compacto.

  • cloud.google.com/machine-family é o nome da família de máquinas. Use uma das famílias de máquinas compatíveis com o posicionamento compacto. Recomendamos o uso de famílias de máquinas C2 ou C2D para cargas de trabalho com requisitos de desempenho de computação e rede.

O exemplo a seguir é uma especificação de pod que permite o posicionamento compacto:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  nodeSelector:
    cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
    cloud.google.com/machine-family: MACHINE_FAMILY

É possível omitir a chave cloud.google.com/machine-family se a configuração do pod já definir um tipo de máquina compatível com o posicionamento compacto. Por exemplo, se a especificação do pod incluir nvidia.com/gpu e o cluster estiver configurado para usar GPUs A100, não é necessário incluir a chave cloud.google.com/machine-family.

O exemplo a seguir é uma especificação de pod que define a solicitação nvidia.com/gpu, e o cluster está configurado para usar GPUs A100. Esse pod spec não inclui a chave cloud.google.com/machine-family:

  apiVersion: v1
  kind: Pod
  metadata:
    ...
  spec:
    ...
    nodeSelector:
      cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
      cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
    resources:
      limits:
        nvidia.com/gpu: 2

Para saber mais, consulte Como configurar pods para consumir GPUs.

Otimizar o tamanho do grupo de posições

Como o GKE encontra o melhor posicionamento para implantações menores, recomendamos que você instrua o GKE a evitar a execução de diferentes tipos de pods no mesmo grupo de posições. Adicione uma chave de tolerância com a chave cloud.google.com/gke-placement-group e o identificador de posicionamento compacto definido.

O exemplo a seguir é uma especificação de pod que define uma tolerância de pod com posicionamento compacto:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  tolerations:
  - key: cloud.google.com/gke-placement-group
    operator: "Equal"
    value: PLACEMENT_GROUP_IDENTIFIER
    effect: "NoSchedule"

Para mais informações sobre o provisionamento automático de nós com tolerância de pods, consulte Separação de cargas de trabalho.

A seguir