Nesta página, mostramos como controlar a infraestrutura de computação e o comportamento de dimensionamento automático dos clusters do Google Kubernetes Engine (GKE) com base nas necessidades específicas das cargas de trabalho usando classes de computação personalizadas. Você já deve estar familiarizado com o conceito de classes de computação personalizadas. Para mais detalhes, consulte Sobre as classes de computação personalizadas.
Este documento é destinado a administradores de plataformas que querem definir de forma declarativa perfis de escalonamento automático para nós e para operadores de cluster que querem executar cargas de trabalho em classes de computação específicas.
Sobre as classes de computação personalizadas
As classes de computação personalizadas são os Recursos personalizados do Kubernetes que permitem definir prioridades para o GKE seguir ao provisionar nós para executar as cargas de trabalho. É possível usar uma classe de computação personalizada para fazer o seguinte:
- Dê ao GKE um conjunto de prioridades para seguir sequencialmente ao provisionar nós, cada um com parâmetros específicos, como série de máquinas do Compute Engine ou capacidade mínima de recursos
- Definir limites e parâmetros de escalonamento automático para remover nós subutilizados e consolidar cargas de trabalho de maneira eficiente na capacidade de computação atual
- Instrua o GKE a substituir automaticamente as configurações de nó menos preferenciais por configurações de nó mais preferenciais para um desempenho de carga de trabalho otimizado
Para entender todas as opções de configuração e como elas interagem com cada uma e com o modo Autopilot do GKE e com o modo GKE Standard, consulte Sobre as classes de computação personalizadas.
Preços
O recurso personalizado ComputeClass
é fornecido sem custo financeiro extra no
GKE. As seguintes considerações de preço se aplicam:
Modo Autopilot do GKE: você recebe cobranças usando o modo de faturamento baseado em nó. Saiba mais em Preços do modo Autopilot.
Modo GKE Standard: consulte Preços do modo Standard.
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
.
- Verifique se você tem um cluster do GKE em execução na versão 1.30.3-gke.1451000 ou mais recente. Para mais informações, consulte Criar um cluster do Autopilot.
- Se você estiver usando um cluster no modo padrão, verifique se você tem pelo menos um pool de nós com escalonamento automático ativado ou que o cluster usa provisionamento automático de nós.
Exemplo de cenário para classes de computação
Neste documento, apresentamos um exemplo de cenário em que você define uma classe de computação personalizada. Na prática, considere os requisitos das suas cargas de trabalho e organização específicas e defina classes de computação que atendam a esses requisitos. Para descrições completas de todas as opções de classes de computação, e para considerações especiais, consulte Sobre as classes de computação personalizadas.
Pense neste cenário de exemplo:
- Seu objetivo é otimizar os custos de execução das cargas de trabalho
- Suas cargas de trabalho são tolerantes a falhas e não exigem desligamento suave ou tempo de execução estendido
- Suas cargas de trabalho precisam de pelo menos 64 vCPUs para serem executadas de maneira ideal
- Você só pode usar a série de máquinas N2 do Compute Engine
Com base no cenário de exemplo, você decide que quer uma classe de computação que faça o seguinte:
- Prioriza os nós do N2 Spot com pelo menos 64 vCPU
- Permite que o GKE use qualquer nó do Spot N2, independentemente da capacidade de computação
- Se nenhum nó do Spot N2 estiver disponível, o GKE poderá usar nós do N2 sob demanda.
- Instrui o GKE a mover as cargas de trabalho para nós do Spot sempre que fiquem disponíveis de novo
Configurar uma classe de computação no modo Autopilot
No GKE Autopilot, você define uma classe de computação, faz a implantação no cluster e solicita essa classe de computação nas cargas de trabalho. O GKE executa todas as etapas de configuração do nó, como a aplicação de rótulos e taints, para você.
Salve o seguinte manifesto como compute-class.yaml
:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: cost-optimized
spec:
priorities:
- machineFamily: n2
spot: true
minCores: 64
- machineFamily: n2
spot: true
- machineFamily: n2
spot: false
activeMigration:
optimizeRulePriority: true
nodepoolAutoCreation:
enabled: true
Configurar uma classe de computação no modo padrão
Nos clusters do modo GKE Standard, você define uma classe de computação, após talvez seja necessário executar a configuração manual para garantir a programação dos pods de classe de computação conforme esperado. A configuração manual depende se os pools de nós são provisionados automaticamente, da seguinte maneira:
- Pools de nós gerenciados pelo provisionamento automático de nós: não é necessária nenhuma configuração manual. O provisionamento automático de nós executa automaticamente as etapas de configuração da classe de computação. Para mais detalhes, consulte Provisionamento automático de nós e classes de computação.
- Pools de nós criados manualmente: a configuração manual é obrigatória. É necessário adicionar rótulos e taints de nó aos pools de nós criados manualmente para associar os nós a uma classe de computação específica. Para mais detalhes, consulte Configurar pools de nós criados manualmente para uso da classe de computação.
Usar classes de computação com pools de nós criados manualmente
Esta seção mostra como definir uma classe de computação em um cluster que usa apenas pools de nós criados manualmente.
Salve o seguinte manifesto como
compute-class.yaml
:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: cost-optimized spec: priorities: - machineFamily: n2 spot: true minCores: 64 - machineFamily: n2 spot: false activeMigration: optimizeRulePriority: true
Crie um novo pool de nós com escalonamento automático que usa VMs Spot e o associe à classe de computação:
gcloud container node-pools create cost-optimized-pool \ --location=LOCATION \ --cluster=CLUSTER_NAME \ --machine-type=n2-standard-64 \ --spot \ --enable-autoscaling \ --max-nodes=9 \ --node-labels="cloud.google.com/compute-class=cost-optimized" \ --node-taints="cloud.google.com/compute-class=cost-optimized:NoSchedule"
Substitua:
LOCATION
: o local do cluster.CLUSTER_NAME
: o nome do cluster atual.
Crie um novo pool de nós com escalonamento automático e VMs sob demanda e associe-o à classe de computação:
gcloud container node-pools create on-demand-pool \ --location=LOCATION \ --cluster=CLUSTER_NAME \ --machine-type=n2-standard-64 \ --enable-autoscaling \ --max-nodes=9 \ --num-nodes=0 \ --node-labels="cloud.google.com/compute-class=cost-optimized" \ --node-taints="cloud.google.com/compute-class=cost-optimized:NoSchedule"
Quando você implanta pods que solicitam essa classe de computação e novos nós precisam ser
criados, o GKE prioriza a criação de nós
no pool de nós cost-optimized-pool
. Se não for possível criar novos nós,
o GKE vai criar nós no pool de nós on-demand-pool
.
Para mais detalhes sobre como os pools de nós criados manualmente interagem com classes de computação personalizadas, consulte Configurar pools de nós criados manualmente para uso de classes de computação.
Usar classes de computação com pools de nós provisionados automaticamente
Esta seção mostra como definir uma classe de computação em um cluster que usa o provisionamento automático de nós.
Salve o seguinte manifesto como compute-class.yaml
:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: cost-optimized
spec:
priorities:
- machineFamily: n2
spot: true
minCores: 64
- machineFamily: n2
spot: true
- machineFamily: n2
spot: false
activeMigration:
optimizeRulePriority: true
nodepoolAutoCreation:
enabled: true
Quando você implanta pods que solicitam essa classe de computação e novos nós precisam ser
criados, o GKE prioriza a criação de nós nos itens de ordem no campo
priorities
. Se necessário, o GKE cria pools de nós que
atendem aos requisitos de hardware da classe de computação.
Para mais detalhes sobre como o provisionamento automático de nós funciona com classes de computação personalizadas, consulte Provisionamento automático de nós e classes de computação.
Personalizar limites de escalonamento automático para consolidação de nós
Por padrão, o GKE remove nós subutilizados e reprograma as
cargas de trabalho em outros nós disponíveis. É possível personalizar ainda mais os limites
e o tempo após o qual um nó se torna um candidato à remoção usando o
campo autoscalingPolicy
na definição da classe de computação, como no exemplo
abaixo:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: cost-optimized
spec:
priorities:
- machineFamily: n2
spot: true
minCores: 64
- machineFamily: n2
spot: true
- machineFamily: n2
spot: false
activeMigration:
optimizeRulePriority: true
autoscalingPolicy:
consolidationDelayMinutes : 5
consolidationThreshold : 70
Este exemplo faz com que um nó se torne candidato a remoção se for subutilizado por 70% da CPU e da capacidade de memória disponíveis por mais de cinco minutos. Para conferir uma lista de parâmetros disponíveis, consulte Definir parâmetros de escalonamento automático para consolidação de nós.
Implantar uma classe de computação em um cluster
Depois de definir uma classe de computação, implante-a no cluster:
kubectl apply -f compute-class.yaml
Essa classe de computação está pronta para uso no cluster. É possível solicitar a classe de computação nas especificações do pod ou, opcionalmente, defini-la como a classe de computação padrão em um namespace específico.
Definir uma classe de computação padrão para um namespace
Quando você define uma classe de computação padrão para um namespace, o GKE usa essa classe de computação para criar nós para todos os pods implantados. Se um pod solicitar explicitamente uma classe de computação diferente, a solicitação no nível do pod substitui o padrão do namespace.
Para definir uma classe de computação como padrão para um namespace específico, faça o seguinte:
Para criar um namespace:
kubectl create namespace cost-optimized-ns
Rotule o namespace com a classe de computação:
kubectl label namespaces cost-optimized-ns \ cloud.google.com/default-compute-class=cost-optimized
Solicitar uma classe de computação em uma carga de trabalho
Para solicitar uma classe de computação em uma carga de trabalho, adicione um seletor de nós para essa classe de computação no manifesto.
Salve o seguinte manifesto como
cc-workload.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: custom-workload spec: replicas: 2 selector: matchLabels: app: custom-workload template: metadata: labels: app: custom-workload spec: nodeSelector: cloud.google.com/compute-class: cost-optimized containers: - name: test image: gcr.io/google_containers/pause resources: requests: cpu: 1.5 memory: "4Gi"
Implantar a carga de trabalho:
kubectl apply -f cc-workload.yaml
Quando você implanta essa carga de trabalho, o GKE adiciona automaticamente uma tolerância aos pods que corresponde ao taint do nó para a classe de computação solicitada. Essa tolerância garante que apenas pods que solicitam a classe de computação sejam executados em nós da classe de computação.