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 de 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

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

Defina as configurações padrão da gcloud usando um dos seguintes métodos:

  • Use gcloud init se você quer receber orientações sobre a definição de padrões.
  • Use gcloud config para definir individualmente a região, a zona e o ID do projeto.

Como usar o gcloud init

  1. Execute gcloud init e siga as instruções:

    gcloud init

    Se você estiver usando SSH em um servidor remoto, use a sinalização --console-only para impedir que o comando inicie um navegador:

    gcloud init --console-only
  2. Siga as instruções para autorizar gcloud a usar sua conta do Google Cloud.
  3. Crie uma nova configuração ou selecione uma atual.
  4. Escolha um projeto do Google Cloud.
  5. Escolha uma zona padrão do Compute Engine.

Como usar a configuração da gcloud

  • 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 pools de nós automaticamente com base nas especificações de Pods não programáveis.

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

Limites de recursos

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

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

Limites de pools de nós

Os pools de nós criados pelo provisionamento automático de nós estão limitados a 1.000 nós.

Limites de clusters

Os limites que você define são aplicados com base no total de recursos de CPU e memória usados no cluster, e não apenas em pools automaticamente provisionados.

O escalonador automático de cluster não criará 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 Pods pendentes tiverem afinidades e tolerâncias de nós, o provisionamento automático poderá ser feito em nós com rótulos e taints correspondentes.

O provisionamento automático de nós poderá 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 a seguir 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 esse pool de nós. Pools de nós não marcados como provisionados automaticamente não são excluídos.

Tipos de máquina com suporte

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

Suporte para VMs preemptivas

O provisionamento automático de nós oferece suporte à criação de pools de nós com base em instâncias de máquinas virtuais (VM) preemptivas.

A criação de pools de nós com base em VMs preemptivas apenas será considerada se existirem pods não programáveis com tolerância para o taint cloud.google.com/gke-preemptible="true":NoSchedule.

Os nós baseados em VMs preemptivas e criados por pools de nós automaticamente provisionados têm o taint aplicado.

Limitações de escalonabilidade

O provisionamento automático de nós tem as mesmas limitações que o escalonador automático de cluster, bem como as seguintes limitações adicionais:

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 de nós quando o número deles se aproxima de 100. É possível criar mais de 100 pools de nós, 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
    

em que:

  • cluster-name é o nome do cluster para ativar o provisionamento automático de nós;
  • minimum-cpu é o número mínimo de núcleos no cluster;
  • minimum-memory é o número mínimo de gigabytes de memória no cluster;
  • maximum-cpu é o número máximo de núcleos no cluster;
  • maximum-memory é o número máximo de gigabytes de memória no cluster.

O exemplo a seguir ativa o provisionamento automático de nós no dev-cluster e permite o escalonamento entre um tamanho de cluster total de 1 CPU e 1 gigabyte de memória a um máximo de 10 CPUs e 64 gigabytes de memória:

    gcloud container clusters update dev-cluster \
      --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 desejado de CPU e 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 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
    

em que:

  • cluster-name é o nome do cluster para ativar o provisionamento automático de nós;
  • service-account é o endereço de e-mail da conta de serviço padrão.

O exemplo a seguir define 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 container clusters update cluster-name \
      --enable-autoprovisioning --autoprovisioning-scopes=scope
    

em que:

  • cluster-name é o nome do cluster para ativar o provisionamento automático de nós;
  • scope corresponde aos escopos do Google Cloud usados por pools de nós com provisionamento automático. Para especificar vários escopos, separe-os com uma vírgula (por exemplo, escopo, escopo,...).

O exemplo a seguir define o escopo padrão no 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
    

Como configurar limites de GPU

Ao usar o provisionamento automático de nós com GPUs, defina o limite máximo de cada tipo de GPU no cluster, usando o parâmetro gcloud ou o Console do Google Cloud. Para configurar vários tipos de GPU, use um arquivo de configuração.

Para listar os resourceTypes disponíveis, execute gcloud compute accelerator-types list.

gcloud

    gcloud container clusters update cluster-name \
      --enable-autoprovisioning \
      --max-cpu maximum-cpu \
      --max-memory maximum-memory \
      --min-accelerator type=gpu-type,count=minimum-accelerator
      --max-accelerator type=gpu-type,count=maximum-accelerator
    

em que:

  • cluster-name é o nome do cluster para ativar o provisionamento automático de nós;
  • maximum-cpu é o número máximo de núcleos no cluster;
  • maximum-memory é o número máximo de gigabytes de memória no cluster;
  • gpu-type é o tipo de acelerador de GPU;
  • minimum-accelerator é o número mínimo de aceleradores de GPU gpu-type no cluster;
  • maximum-accelerator é o número máximo de aceleradores de GPU gpu-type no cluster.

O exemplo a seguir define os limites de GPU para o tipo de acelerador de GPU nvidia-tesla-k80 no cluster dev-cluster:

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

Arquivo

É possível carregar limites para vários tipos de GPU usando um arquivo de configuração. A seguinte configuração YAML configura dois tipos diferentes de GPUs:

      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 em que 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:

  • cluster-name é o nome do cluster para ativar o provisionamento automático de nós;
  • file-name é o nome do arquivo que contém os limites de recursos.

Para mais informações, consulte a documentação de 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 desejado de CPU e 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 desejados de GPUs para adicionar ao cluster.
  7. Aceite as limitações de 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. Não há suporte para locais regionais. Zonas precisam pertencer à mesma região que o cluster, mas não estão limitadas a 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.

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

gcloud container clusters update cluster-name \
      --enable-autoprovisioning --autoprovisioning-locations=zone

em que:

  • cluster-name é o nome do cluster para ativar o provisionamento automático de nós.
  • zone é a zona em que o provisionamento automático de nós pode criar novos pools de nós. Para especificar várias zonas, separe-as com vírgula (por exemplo, zona, zona,...).

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 para um cluster, execute o seguinte comando:

    gcloud container clusters update cluster-name --no-enable-autoprovisioning
    

Console

Para desativar o provisionamento automático de nós usando 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.

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

    gcloud container node-pools update node-pool-name --enable-autoprovisioning
    

node-pool-name é o nome do pool de nós.

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

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

    gcloud container node-pools update node-pool-name --no-enable-autoprovisioning
    

node-pool-name é o nome do pool de nós.

A seguir