É 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
Em clusters do Autopilot, é possível solicitar o posicionamento compacto para cargas de trabalho específicas adicionando seletores de nó à especificação do pod. É possível usar a política de posicionamento compacto padrão do Autopilot ou uma política de posicionamento compacto do Compute Engine que use a série de máquinas N2 ou N2D.
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 precisa ser executado junto, no mesmo grupo de posicionamento compacto. 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.Uma das seguintes chaves para definir o tipo de recurso:
cloud.google.com/compute-class: "Balanced"
cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
cloud.google.com/placement-policy-name
: opcionalmente, o nome de uma política de posicionamento compacto do Compute Engine. Só é possível especificar uma política de posicionamento compacta personalizada no GKE versão 1.31.1-gke.20100000 e mais recentes.Para instruções, consulte a seção Criar uma política de posicionamento compacta nesta página.
O exemplo de especificação de pod a seguir permite o posicionamento compacto com uma política de posicionamento compacto personalizada:
apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
nodeSelector:
cloud.google.com/gke-placement-group: "placement-group-1"
cloud.google.com/compute-class: "Balanced"
cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
Substitua PLACEMENT_POLICY_NAME
pelo nome de uma
política de posicionamento compacto do Compute Engine. Para usar a
política de posicionamento compacta padrão para o Autopilot, omita a
linha cloud.google.com/placement-policy-name
.
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:
- compatível apenas com novos pools de nós. Não é possível ativar ou desativar o posicionamento compacto em pools de nós existentes;
- disponível apenas para pools de nós que operam em uma única zona;
- Disponível apenas nos tipos de máquina A2, A3, C2, G2, C2D, C3D, N2, N2D e C3.
- compatível com até 150 instâncias de VM do Compute Engine em cada política. Qualquer pool de nós que exceder esse limite a qualquer momento será recusado durante a criação;
- a migração em tempo real para nós não é compatível.
- O fornecimento de uma política de recursos personalizada usando a sinalização
placement-policy
não é compatível com upgrades azul-verde.
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.
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.
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.
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, especifiquec2-standard-4
.POLICY_NAME
: o nome da política de recursos.ZONE
: a zona em que a reserva será criada.
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.
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
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
Com o provisionamento automático de nós, o GKE provisiona automaticamente pools de nós 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, como no exemplo abaixo:
apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
nodeSelector:
cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
cloud.google.com/machine-family: MACHINE_FAMILY
cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
# lines omitted for clarity
Substitua:
PLACEMENT_GROUP_IDENTIFIER
: o identificador atribuído ao grupo de pods que precisam ser executados juntos, no mesmo grupo de posicionamento compacto.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.PLACEMENT_POLICY_NAME
: opcionalmente, o nome de uma política de posicionamento compacto do Compute Engine. O GKE usa a política de posicionamento compacto especificada quando o provisionamento automático de nós cria um novo pool de nós para agrupar seus pods. Só é possível especificar uma política de posicionamento compacta personalizada no GKE versão 1.31.1-gke.2010000 e mais recentes.Para instruções, consulte a seção Criar uma política de posicionamento compacta nesta página.
É possível omitir a chave cloud.google.com/machine-family
se a configuração do pod já
define 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
- Saiba mais sobre Como definir políticas de posicionamento de instância no Compute Engine.