Cluster Proportional Autoscaler (CPA) — это контроллер, который автоматически масштабирует выбранный деплоймент в зависимости от количества нод в кластере. Он полезен в случаях, когда сервис должен быть доступен на каждой ноде или масштабироваться пропорционально объему ресурсов в кластере.
CPA не использует метрики нагрузки, а работает на основе пропорциональных формул, которые задаются вручную.
CPA поддерживает два режима расчета количества реплик:
В режиме linear
количество реплик рассчитывается по следующей формуле:
replicas = max(min, min(max, cores / coresPerReplica, nodes / nodesPerReplica))
Можно использовать оба параметра (coresPerReplica
и nodesPerReplica
) или только один. Значения min
и max
ограничивают итоговое число реплик.
Пример настройки:
config:
linear:
coresPerReplica: 2
nodesPerReplica: 1
min: 2
max: 20
preventSinglePointFailure: true
includeUnschedulableNodes: true
В этом примере:
В режиме ladder
количество реплик задается явно, через таблицу соответствий. Это удобно, когда нужно точное количество подов при конкретных размерах кластера.
Пример настройки:
config:
ladder:
coresToReplicas:
- [ 1, 1 ]
- [ 64, 3 ]
- [ 512, 5 ]
- [ 1024, 7 ]
- [ 2048, 10 ]
nodesToReplicas:
- [ 1, 1 ]
- [ 2, 2 ]
- [ 5, 3 ]
В этом примере:
Для установки Cluster Proportional Autoscaler откройте панель управления кластером, перейдите во вкладку «Дополнения» и выберите Cluster Proportional Autoscaler.
В открывшемся мастере вы можете изменить конфигурацию скейлера, отредактировав манифест в блоке «Конфигурация».
По умолчанию скейлер будет настроен для работы с metrics-server
в неймспейсе kube-system
. Он использует линейный режим, создавая один под на каждую ноду:
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
Если вы хотите масштабировать другой сервис — например, nginx в неймспейсе default — достаточно изменить параметры target
и namespace
в конфигурации перед установкой.
Если вы хотите изменить параметры масштабирования или режим работы, отредактируйте блок config
. Вы можете, например, раскомментировать параметры для ladder
и использовать его вместо linear
.
При установке через панель управления можно указать только один объект для масштабирования через параметр
target
.Если вы хотите масштабировать несколько ресурсов одновременно — например,
metrics-server
иcoredns
— используйте ручную установку с несколькими экземплярами скейлера.
Если вы хотите более гибко настроить Cluster Proportional Autoscaler или применить несколько скейлеров для разных сервисов, используйте установку через Helm.
Сначала добавьте репозиторий чарта:
helm repo add cluster-proportional-autoscaler https://kubernetes-sigs.github.io/cluster-proportional-autoscaler
Эта команда добавит внешний источник, из которого будет установлен скейлер.
Затем обновите список доступных чартов:
helm repo update
Создайте файл values.yaml
со следующим содержимым:
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
Эта конфигурация включает линейный режим, при котором создается один под на каждую ноду (nodesPerReplica: 1
). Параметры min
и max
ограничивают количество реплик. Флаг preventSinglePointFailure
добавляет дополнительную реплику при наличии всего одной ноды, а includeUnschedulableNodes
учитывает ноды, на которые нельзя запланировать поды.
В разделе options
задаются namespace
и объект, который будет масштабироваться — в нашем случае это deployment/metrics-server.
Раздел serviceAccount
указывает, что Helm должен создать сервис-аккаунт с нужными правами автоматически.
Установите скейлер с помощью команды:
helm upgrade --install metrics-autoscaler cluster-proportional-autoscaler/cluster-proportional-autoscaler --values values.yaml
После установки убедитесь, что pod запущен:
kubectl get pods -n kube-system
При ручной установке вы можете создавать несколько независимых экземпляров скейлера для разных целей. Для этого создайте отдельный файл, например values-nginx.yaml
, измените в нем параметры target
и namespace
, и примените новую установку:
helm upgrade --install nginx-autoscaler cluster-proportional-autoscaler/cluster-proportional-autoscaler --values values-nginx.yaml
Такой способ позволяет масштабировать любое количество сервисов с разными настройками.