Como escalonar clusters de usuários

Para escalonar suas cargas de trabalho no GKE na AWS, configure o AWSNodePools para escalonar horizontalmente de modo automático ou crie e exclua manualmente AWSNodePools para escalonar verticalmente.

Escalonador automático de cluster

O GKE na AWS implementa o escalonador automático de cluster do Kubernetes. Quando a demanda nos nós é alta, o escalonador automático de cluster adiciona nós ao pool de nós. Quando ela é baixa, o escalonador automático do cluster volta para um tamanho mínimo designado por você. Isso pode aumentar a disponibilidade das cargas de trabalho quando você precisar delas e, ao mesmo tempo, controlar os custos.

Visão geral

O escalonador automático de cluster redimensiona automaticamente o número de nós em um determinado pool de nós, com base nas demandas das cargas de trabalho. Não é preciso adicionar ou remover manualmente nós, ou provisionar os pools de nós em excesso. Em vez disso, especifique um tamanho mínimo e máximo para o pool de nós, e o cluster será escalonado automaticamente.

Se os recursos forem excluídos ou movidos durante o escalonamento automático do cluster, as cargas de trabalho poderão sofrer interrupções temporárias. Por exemplo, se a carga de trabalho consistir de uma única réplica, o pod dessa réplica poderá ser reprogramado em um nó diferente caso o nó atual seja excluído. Antes de ativar o escalonador automático de cluster no AWSNodePool, crie as cargas de trabalho para tolerar possíveis interrupções ou garantir que os pods críticos não sejam interrompidos.

Como funciona o escalonador automático de clusters

O escalonador automático de cluster funciona por pool de nós. Ao criar um pool de nós, você especifica um tamanho mínimo e máximo para o pool de nós no recurso AWSNodePool do Kubernetes.

Desative o escalonador automático de cluster definindo spec.minNodeCount como igual a spec.maxNodeCount no AWSNodePools.

O escalonador automático de cluster aumenta ou diminui o tamanho do pool de nós automaticamente com base nas solicitações de recursos dos usuários em execução nos nós do conjunto de nós, em vez da utilização real de recursos. Ele verifica periodicamente o status de pods e nós e toma as seguintes medidas:

Se os pods forem não-modificáveis porque não há nós suficientes no pool de nós, o escalonador automático de cluster acrescentará nós até o tamanho máximo do pool de nós. Se os nós forem subutilizados e todos os pods puderem ser programados mesmo com menos nós no pool de nós, o escalonador automático de cluster removerá nós até o tamanho mínimo do pool de nós. Se não for possível esvaziar o nó após um período de tempo limite (10 minutos), ele será forçado a ser encerrado. O período de carência não é configurável.

Se os pods solicitarem poucos recursos (por exemplo, se os padrões forem insuficientes), o escalonador automático de cluster não corrigirá a situação. Para garantir que o escalonador automático de cluster trabalhe com a maior precisão possível, crie solicitações de recursos adequadas para todas as cargas de trabalho.

Critérios de operação

O escalonador automático de clusters parte dos seguintes pressupostos ao redimensionar um pool de nós:

  • Todos os pods replicados podem ser reiniciados em outro nó, o que pode causar uma breve interrupção. Se seus serviços não tolerarem interrupções, não recomendamos o uso do escalonador automático de cluster.

  • Todos os nós em um único pool têm o mesmo conjunto de rótulos.

  • Se você tiver AWSNodePools com diferentes tipos de instância, o escalonador automático de cluster considerará o custo relativo do lançamento de novos nós e tentará expandir o pool de nós mais barato.

  • Os rótulos adicionados manualmente após a criação inicial do cluster ou do pool de nós não são rastreados. Os nós criados pelo escalonador automático de cluster são especificados por rótulos atribuídos com --node-labels no momento da criação do pool de nós.

Redimensionar um pool de nós

Um AWSNodePool inclui os campos minNodeCount e maxNodeCount. Esses campos declaram um número mínimo e máximo de nós de trabalho no pool. É possível editar esses valores antes ou depois da criação do AWSNodePool.

Antes de começar

Provisione um cluster usando as instruções em Como criar um cluster de usuário. Tenha o arquivo YAML (por exemplo, cluster-0.yaml) que cria o cluster disponível.

Como ativar o escalonamento automático de pools de nós

  1. No diretório anthos-aws, use anthos-gke para alternar o contexto para o serviço de gerenciamento.

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. Para ativar o escalonador automático de cluster, edite o manifesto para seu AWSNodePool. Edite o arquivo cluster-0.yaml e encontre a seção AWSNodePool. Altere os valores de spec.minNodeCount e spec.maxNodeCount.

    O exemplo abaixo mantém o tamanho mínimo desse pool de nós em nós 3, mas permite que o escalonador automático de cluster aumente o tamanho para nós 10.

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: cluster-0-pool-0
    spec:
      clusterName: cluster-0
      version: 1.25.5-gke.2100
      minNodeCount: 3
      maxNodeCount: 10
      ...
    
  3. Em seguida, aplique o YAML para redimensionar o pool de nós.

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl apply -f cluster-0.yaml
    
  4. O recurso AWSNodePool será transferido para o estado Resizing. Quando o AWSNodePool conclui o escalonamento, ele passa para o estado Provisioned.

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl get AWSNodePools
    

    A saída mostra que o AWSNodePool é Resizing. As operações de redimensionamento levam vários minutos para serem concluídas.

    NAME               CLUSTER     STATE     AGE   VERSION
    cluster-0-pool-0   cluster-0   Resizing  3h    1.25.5-gke.2100
    

Como criar um novo AWSNodePool manualmente

Também é possível escalonar o cluster criando novos AWSNodePools. Ao criar um novo AWSNodePool, também é possível aumentar ou diminuir os tamanhos de instância.

  1. É possível recuperar o manifesto de configuração de um AWSNodePool atual com kubectl get.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get awsnodepool cluster-0-pool-0 -o yaml > new_nodepool.yaml
    
  2. Edite new_nodepool.yaml e remova as seções que não estão presentes no exemplo a seguir. Salve o arquivo.

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: NODE_POOL_NAME
    spec:
      clusterName: AWSCLUSTER_NAME
      version:  CLUSTER_VERSION # latest version is 1.25.5-gke.2100
      region: AWS_REGION
      subnetID: AWS_SUBNET_ID
      minNodeCount: MINIMUM_NODE_COUNT
      maxNodeCount: MAXIMUM_NODE_COUNT
      maxPodsPerNode: MAXIMUM_PODS_PER_NODE_COUNT
      instanceType: AWS_NODE_TYPE
      keyName: KMS_KEY_PAIR_NAME
      iamInstanceProfile: NODE_IAM_PROFILE
      proxySecretName: PROXY_SECRET_NAME
      rootVolume:
        sizeGiB: ROOT_VOLUME_SIZE
        volumeType: VOLUME_TYPE # Optional
        iops: IOPS # Optional
        kmsKeyARN: NODE_VOLUME_KEY # Optional 
    
  3. Para criar um novo AWSNodePool, aplique o manifesto ao cluster de gerenciamento.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f new_nodepool.yaml
    

A seguir

Implante um serviço apoiado pelo Ingress.

Para ver outras opções, leia a documentação de referência em AWSNodePool.