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.
O CPA suporta dois modos para calcular o número de réplicas:
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:
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:
Para instalar o Cluster Proportional Autoscaler:
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.
Ao instalar via interface web, apenas um recurso alvo pode ser especificado usando o parâmetro
target.
Se quiser escalar múltiplos recursos, como
metrics-serverecoredns, é necessário usar a instalação manual com múltiplas instâncias do autoscaler.
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:
nodesPerReplica: 1)preventSinglePointFailure (adiciona um pod extra se houver apenas um node)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
Com a instalação manual, é possível rodar múltiplas instâncias independentes do autoscaler para diferentes serviços.
Para isso:
values-nginx.yamltarget e namespace para o deployment (por exemplo, nginx no namespace default)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.