Como usar o provisionamento automático de nós

Nesta página, você aprende a usar o recurso de provisionamento automático de nós do Google Kubernetes Engine (GKE).

Visão geral

O provisionamento automático de nós gerencia automaticamente um conjunto de pools de nós em nome do usuário. Sem o provisionamento automático do nós, o GKE considera a inicialização de novos nós somente a partir do conjunto de pools de nós criados pelo usuário. Com esse recurso, é possível criar e excluir novos pools de nós automaticamente.

Antes de começar

Prepare-se para a tarefa seguindo essas etapas:

  • Verifique se você ativou a API Google Kubernetes Engine.
  • Ativar a API do Google Kubernetes Engine
  • Verifique se o SDK do Cloud está instalado.
  • Defina o ID do projeto padrão:
    gcloud config set project [PROJECT_ID]
  • Se você estiver trabalhando com clusters zonais, defina a zona do Compute padrão:
    gcloud config set compute/zone [COMPUTE_ZONE]
  • Se você estiver trabalhando com clusters regionais, defina a região do Compute padrão:
    gcloud config set compute/region [COMPUTE_REGION]
  • Atualize gcloud para a versão mais recente:
    gcloud components update

Requisitos

O provisionamento automático de nós está disponível nestas versões do GKE:

  • v1.11.2-gke.25 e superior para clusters zonais
  • v1.12.x e superior para clusters regionais

Operação

O provisionamento automático de nós é um mecanismo do escalonador automático de clusters, que escalona por pool de nós. Com o provisionamento automático de nós ativado, o escalonador automático de cluster pode estender os pools de nós automaticamente com base nas especificações dos pods não programáveis.

O provisionamento automático de nós cria pools de nós com base nestas informações:

Limites de recurso

O provisionamento automático de nós e o autoescalador de clusters têm limites em dois níveis:

  • Nível do pool de nós
  • Nível do cluster

Limites dos pools de nós

Os pools de nós criados pelo NAP estão limitados a 1.000 nós.

Limites dos clusters

Os limites definidos são aplicados com base em todos os recursos de CPU e memória usados no cluster, não apenas nos pools provisionados automaticamente.

O escalonador automático de cluster não cria novos nós se essa ação exceder um dos limites definidos. Se os limites já tiverem sido excedidos, os nós não serão excluídos automaticamente.

Separação da carga de trabalho

Se os pods pendentes tiverem afinidades e tolerâncias de nó, o provisionamento automático poderá ser feito em nós com rótulos e taints correspondentes.

O provisionamento automático de nós pode criar pools de nós com rótulos e taints se todas as condições a seguir forem atendidas:

  • Um pod pendente requer um nó com uma chave de rótulo e um valor específicos.
  • O pod tem uma tolerância para um taint com a mesma chave.
  • A tolerância é para o efeito NoSchedule, NoExecute ou todos os efeitos.

A especificação do pod pode expressar que ele exige nós com rótulos específicos de duas maneiras:

  • Usando um campo nodeSelector.
  • Usando um campo nodeAffinity com um operador In e exatamente um valor.

O exemplo a seguir é um trecho de uma especificação de pod interpretada como uma solicitação de separação de carga de trabalho. Neste exemplo, o administrador do cluster escolheu dedicated como a chave que será usada para o isolamento da carga de trabalho, e a equipe da IU determinou que precisa de nós dedicados para suas cargas de trabalho.

O pod tem uma tolerância para nós rotulados com dedicated=ui-team e usa nodeAffinity para seleção de nós:

spec:
  tolerations:
  - key: dedicated
    operator: Equal
    value: ui-team
    effect: NoSchedule
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: dedicated
            operator: In
            values:
            - ui-team

Se esse pod existir, os nós com taint dedicated=ui-team:NoSchedule e rótulo dedicated=ui-team serão considerados para criação pelo provisionamento automático de nós.

O exemplo abaixo usa nodeSelector e tem o mesmo efeito:

spec:
  tolerations:
  - key: dedicated
    operator: Equal
    value: ui-team
    effect: NoSchedule
  nodeSelector:
    dedicated: ui-team

Exclusão de pools de nós provisionados automaticamente

Quando não há nós em um pool de nós provisionado automaticamente, o GKE exclui o pool de nós. Os pools de nós que não estão marcados como provisionados automaticamente não são excluídos.

Tipos de máquinas compatíveis

No momento, o provisionamento automático de nós leva em consideração apenas a criação de pools de nós com máquinas de até 64 vCPUs. Essa limitação será removida no futuro.

Limitações de escalonabilidade

O provisionamento automático de nós tem as mesmas limitações do escalonador automático de clusters e outras descritas nas seções a seguir.

Limite no número de cargas de trabalho separadas
O provisionamento automático de nós é compatível com no máximo 100 cargas de trabalho separadas e diferentes.
Limite no número de pools de nós
O provisionamento automático de nós deixa de priorizar a criação de novos pools quando a quantidade deles chega perto de 100. Criar mais de 100 pools de nós é possível, mas só quando isso é a única opção para programar um pod pendente.

Como ativar o provisionamento automático de nós

Use gcloud ou o Console do Google Cloud para ativar o provisionamento automático de nós nos clusters.

gcloud

Para ativar o provisionamento automático de nós, execute o seguinte comando:

gcloud container clusters update [CLUSTER_NAME] \
  --enable-autoprovisioning \
  --min-cpu [MINIMUM_CPU] \
  --min-memory [MINIMUM_MEMORY] \
  --max-cpu [MAXIMUM_CPU] \
  --max-memory [MAXIMUM_MEMORY]

Nesse comando:

  • --enable-autoprovisioning indica que o provisionamento automático de nós está ativado.
  • --min-cpu especifica o número mínimo de núcleos no cluster.
  • --min-memory especifica o número mínimo de gigabytes de memória no cluster.
  • --max-cpu especifica o número máximo de núcleos no cluster.
  • --max-memory especifica o número máximo de gigabytes de memória no cluster.

Por exemplo, para habilitar o provisionamento automático de nós em um cluster e permitir o escalonamento do tamanho do cluster entre um total de 1 CPU e 1 gigabyte de memória para no máximo 10 CPU e 64 gigabytes de memória, execute:

gcloud container clusters update [CLUSTER_NAME] \
  --enable-autoprovisioning \
  --min-cpu 1 \
  --min-memory 1 \
  --max-cpu 10 \
  --max-memory 64

Console

Para ativar o provisionamento automático de nós, execute as seguintes etapas:

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

Acessar o menu do Google Kubernetes Engine

  1. Selecione o cluster desejado.
  2. Clique no ícone edit.
  3. Role para baixo até provisionamento automático de nós e selecione Ativado.
  4. Defina o uso mínimo e máximo da CPU e da memória para o cluster.
  5. Clique em Salvar. O GKE atualizará o cluster.

Como definir padrões de identidade para pools de nós com provisionamento automático

As permissões para recursos do Google Cloud são fornecidas por identidades.

É possível especificar uma identidade padrão (uma conta de serviço ou pelo menos um escopo) usada pelos novos pools de nós com provisionamento automático. A alteração de padrões de identidade não afeta os pools de nós já existentes.

Para especificar a conta de serviço padrão do Cloud IAM usada pelo provisionamento automático de nós, execute o seguinte comando:

gcloud container clusters update \
[CLUSTER_NAME] --enable-autoprovisioning --autoprovisioning-service-account=SERVICE_ACCOUNT

Por exemplo, para definir test-service-account@google.com como a conta de serviço padrão no cluster dev-cluster:

gcloud container clusters update dev-cluster \
--enable-autoprovisioning --autoprovisioning-service-account=test-service-account@google.com

Para especificar os escopos padrão usados pelo provisionamento automático de nós, execute o seguinte comando gcloud:

gcloud container clusters update \
[CLUSTER_NAME] --enable-autoprovisioning --autoprovisioning-scopes=SCOPE,[SCOPE,...]

Por exemplo, para definir o escopo padrão do cluster dev-cluster como devstorage.read_only:

gcloud container clusters update dev-cluster \
--enable-autoprovisioning --autoprovisioning-scopes=https://www.googleapis.com/auth/pubsub,https://www.googleapis.com/auth/devstorage.read_only

Em que:

  • --enable-autoprovisioning ativa o provisionamento automático de nós.
  • --autoprovisioning-service-account especifica a conta de serviço do Google Cloud usada pelos pools de nós provisionados automaticamente.
  • --autoprovisioning-scopes especifica os escopos do Google Cloud usados pelos pools de nós provisionados automaticamente.

Como configurar limites da GPU

Ao usar o provisionamento automático de nós com GPUs, defina o limite máximo para cada tipo de GPU no cluster usando a sinalização --max-accelerator ou o Google Cloud Console.

O comando gcloud compute accelerator-types list gera como resultado uma lista de resourceTypes disponíveis.

Para configurar vários tipos de GPU, use um arquivo de configuração.

gcloud

gcloud container clusters update [CLUSTER_NAME] \
  --enable-autoprovisioning \
  --max-cpu 10 \
  --max-memory 64 \
  --min-accelerator type=nvidia-tesla-k80,count=1
  --max-accelerator type=nvidia-tesla-k80,count=4

Nesse comando:

  • --enable-autoprovisioning indica que o provisionamento automático de nós está ativado.
  • --max-cpu especifica o número máximo de núcleos no cluster.
  • --max-memory especifica o número máximo de gigabytes de memória no cluster.
  • --min-accelerator especifica o número mínimo de aceleradores de GPU nvidia-tesla-k80.
  • --max-accelerator especifica o número máximo de aceleradores de GPU nvidia-tesla-k80.

Arquivo

Se preferir, é possível carregar limites de um arquivo de configuração. Esta configuração do YAML configura dois tipos diferentes de GPU:

  resourceLimits:
    -resourceType: 'cpu'
     minimum: 4
     maximum: 10
    -resourceType: 'memory'
     maximum: 64
    -resourceType: 'nvidia-tesla-k80'
     maximum: 4
    -resourceType: 'nvidia-tesla-v100'
     maximum: 2

Para usar um arquivo de configuração de provisionamento automático:

  1. Copie a configuração acima para um arquivo em um local onde gcloud possa acessá-lo. Edite os valores de cpu e memory. Adicione quantos valores forem necessários para resourceType. Salve o arquivo.

  2. Use gcloud para aplicar a configuração ao cluster:

gcloud container clusters update [CLUSTER_NAME] \
  --enable-autoprovisioning \
  --autoprovisioning-config-file [FILE_NAME]

Em que:

  • --enable-autoprovisioning indica que o provisionamento automático de nós está ativado.
  • --autoprovisioning-config-file especifica o arquivo com limites de recursos.

Para mais informações, consulte a documentação gcloud container clusters update.

Console

Para ativar o provisionamento automático de nós com recursos de GPU, execute as seguintes etapas:

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

Acessar o menu do Google Kubernetes Engine

  1. Selecione o cluster desejado.
  2. Clique no ícone edit Editar.
  3. Role para baixo até provisionamento automático de nós e selecione Ativado.
  4. Defina o uso mínimo e máximo da CPU e da memória para o cluster.
  5. Clique em add Adicionar recurso.
  6. Selecione o tipo de GPU que você quer adicionar, por exemplo, NVIDIA TESLA K80. Defina os números mínimo e máximo de GPUs para adicionar ao cluster.
  7. Aceite as limitações das GPUs no GKE.
  8. Clique em Salvar. O GKE atualizará o cluster.

Locais do provisionamento automático de nós

Defina as zonas em que o provisionamento automático de nós pode criar novos pools de nós. Os locais regionais não são compatíveis. Todas as zonas precisam pertencer à mesma região que o cluster, mas elas não estão limitadas aos locais de nós definidos no nível do cluster. Alterar os locais de provisionamento automático de nós não afeta os pools de nós atuais.

gcloud

Para definir locais em que o provisionamento automático de nós pode criar novos pools de nós, execute o comando gcloud a seguir:

gcloud container clusters update [CUSTER_NAME] \
  --enable-autoprovisioning --autoprovisioning-locations=ZONE,[ZONE,...]

Nesse comando:

  • --enable-autoprovisioning indica que o provisionamento automático de nós está ativado.
  • --autoprovisioning-locations especifica locais onde o provisionamento automático de nós pode criar novos pools de nós.

Como desativar o provisionamento automático de nós

Quando você desativa o provisionamento automático de nós para um cluster, os pools de nós não são mais provisionados automaticamente.

gcloud

Para desativar o provisionamento automático de nós, atualize o cluster com a sinalização --no-enable-autoprovisioning:

gcloud container clusters update [CLUSTER_NAME] --no-enable-autoprovisioning

Nesse comando:

  • --no-enable-autoprovisioning indica que o provisionamento automático de nós está desativado.

Console

Para desativar o provisionamento automático de nós, use o Console do Google Cloud.

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

Acessar o menu do Google Kubernetes Engine

  1. Selecione o cluster desejado.
  2. Clique no ícone edit Editar.
  3. Role para baixo até provisionamento automático de nós e selecione Desativado.

Como marcar o pool de nós como provisionado automaticamente

Depois de ativar o provisionamento automático de nós no cluster, especifique quais pools de nós serão provisionados automaticamente. Um pool de nós desse tipo é excluído automaticamente quando não é usado por nenhuma carga de trabalho.

gcloud

Para marcar o pool de nós como provisionado automaticamente, execute o seguinte comando:

gcloud container node-pools update [NODE_POOL_NAME] --enable-autoprovisioning

Nesse comando:

  • --enable-autoprovisioning indica que o pool de nós está marcado como provisionado automaticamente.

Marcar o pool de nós como não provisionado automaticamente

É possível remover o provisionamento automático de um pool de nós usando a sinalização --no-enable-autoprovisioning.

gcloud

Para marcar o pool de nós como não provisionado automaticamente, execute o seguinte comando da gcloud:

gcloud container node-pools update [NODE_POOL_NAME] --no-enable-autoprovisioning

Nesse comando:

  • --no-enable-autoprovisioning indica que o pool de nós está marcado como não provisionado automaticamente.

A seguir