Cluster Proportional Autoscaler


O Cluster Proportional Autoscaler (CPA) é um controlador que ajusta automaticamente a escala de um deployment específico com base no número de nodes no cluster. Ele é especialmente útil quando um serviço precisa estar disponível em todos os nodes ou deve escalar proporcionalmente aos recursos totais do cluster.

Ao contrário de autoscalers tradicionais, o CPA não depende de métricas de carga. Em vez disso, utiliza fórmulas proporcionais definidas manualmente.

Modos de operação
Copiar link

O CPA suporta dois modos para calcular o número de réplicas:

Modo linear
Copiar link

No modo linear, o número de réplicas é calculado com a seguinte fórmula:

replicas = max(min, min(max, cores / coresPorReplica, nodes / nodesPorReplica))

Você pode usar ambos os parâmetros (coresPerReplica e nodesPerReplica) ou apenas um. Os valores min e max definem os limites inferior e superior para o número de réplicas.

Exemplo de configuração:

config:
  linear:
    coresPerReplica: 2
    nodesPerReplica: 1
    min: 2
    max: 20
    preventSinglePointFailure: true
    includeUnschedulableNodes: true

Neste exemplo:

  • Um pod é criado por node
  • Um pod adicional é criado a cada 2 núcleos de CPU
  • Sempre pelo menos 2 pods, máximo de 20
  • Se houver apenas um node, 2 pods serão criados para evitar ponto único de falha
  • Nodes não agendáveis também são considerados

Modo ladder
Copiar link

No modo ladder, o número de réplicas é definido explicitamente usando uma tabela de consulta. Isso é útil quando você precisa de um número exato de pods para determinados tamanhos de cluster.

Exemplo de configuração:

config:
  ladder:
    coresToReplicas:
      - [ 1, 1 ]
      - [ 64, 3 ]
      - [ 512, 5 ]
      - [ 1024, 7 ]
      - [ 2048, 10 ]
    nodesToReplicas:
      - [ 1, 1 ]
      - [ 2, 2 ]
      - [ 5, 3 ]

Neste exemplo:

  • Com 1 node → 1 pod
  • Com 2 nodes → 2 pods
  • Com 5 ou mais nodes → 3 pods
  • Núcleos de CPU também são considerados:
    • 64 cores → 3 pods
    • 2048 cores → 10 pods

Instalar via painel de controle
Copiar link

Para instalar o Cluster Proportional Autoscaler:

  1. Vá para a seção Kubernetes e clique no cluster.
  2. Na aba Complementos, clique em Cluster Proportional Autoscaler.
  3. No assistente de instalação, ajuste a configuração editando o manifest na seção Configuração.

Por padrão, o autoscaler é configurado para escalar o metrics-server no namespace kube-system usando o modo linear, criando um pod por node:

config:
  linear:
    coresPerReplica: 1
    nodesPerReplica: 1
    min: 1
    max: 100
    preventSinglePointFailure: true
    includeUnschedulableNodes: true

options:
  logToStdErr: true
  logLevel: 7
  namespace: kube-system
  target: deployment/metrics-server

Se quiser escalar um serviço diferente, por exemplo, nginx no namespace default, altere os parâmetros target e namespace antes da instalação.

Para mudar modos de escala ou parâmetros, edite a seção config. Por exemplo, você pode descomentar os parâmetros do modo ladder e utilizá-lo em vez do linear.

Instalar manualmente
Copiar link

Para maior flexibilidade ou múltiplos autoscalers para diferentes serviços, utilize o Helm.

Passo 1: Adicionar repositório Helm

helm repo add cluster-proportional-autoscaler https://kubernetes-sigs.github.io/cluster-proportional-autoscaler

Isso adiciona uma fonte externa de onde o autoscaler pode ser instalado.

Passo 2: Atualizar lista de charts

helm repo update

Passo 3: Criar arquivo values.yaml com o seguinte conteúdo:

config:
  linear:
    coresPerReplica: 1
    nodesPerReplica: 1
    min: 1
    max: 100
    preventSinglePointFailure: true
    includeUnschedulableNodes: true

options:
  logToStdErr: true
  logLevel: 7
  namespace: kube-system
  target: deployment/metrics-server

serviceAccount:
  create: true

Esta configuração:

  • Usa o modo linear, criando um pod por node (nodesPerReplica: 1)
  • Limita as réplicas entre 1 e 100
  • Habilita preventSinglePointFailure (adiciona um pod extra se houver apenas um node)
  • Inclui nodes não agendáveis nos cálculos
  • Especifica o deployment e namespace alvo
  • Cria automaticamente uma service account com permissões necessárias

Passo 4: Instalar o autoscaler com Helm

helm upgrade --install metrics-autoscaler cluster-proportional-autoscaler/cluster-proportional-autoscaler --values values.yaml

Passo 5: Verificar se o pod está em execução

kubectl get pods -n kube-system

Escalar múltiplos serviços
Copiar link

Com a instalação manual, é possível rodar múltiplas instâncias independentes do autoscaler para diferentes serviços.

Para isso:

  1. Crie um arquivo separado values-nginx.yaml
  2. Atualize os parâmetros target e namespace para o deployment (por exemplo, nginx no namespace default)
  3. Instale usando um nome de release diferente:
helm upgrade --install nginx-autoscaler cluster-proportional-autoscaler/cluster-proportional-autoscaler --values values-nginx.yaml

Dessa forma, você pode escalar qualquer número de serviços com configurações individuais.