Автомасштабирование (HPA)
| Объект | HorizontalPodAutoscaler (autoscaling/v2) |
|---|---|
| Источник метрик | metrics-server, Prometheus Adapter, внешние метрики |
| Цикл проверки | 15 секунд (по умолчанию) |
| Масштабирует | Deployment, StatefulSet, ReplicaSet |
| Вертикальное | Vertical Pod Autoscaler (VPA) |
| По событиям | KEDA (проект CNCF) |
| Узлы | Cluster Autoscaler, Karpenter |
Автомасштабирование в Kubernetes — набор механизмов, которые подстраивают мощность приложения под нагрузку без участия человека. Главный из них — Horizontal Pod Autoscaler (HPA): он увеличивает или уменьшает число реплик Deployment в зависимости от загрузки процессора, памяти или прикладных метрик. Днём, когда пользователей много, работает десять подов, ночью — два. Дополняют его вертикальное масштабирование подов (VPA) и масштабирование самих узлов кластера.
Уровни масштабирования
| Что меняется | Инструмент | Пример |
|---|---|---|
| Число подов | HPA, KEDA | 2 → 10 реплик при росте RPS |
| Ресурсы пода | VPA | запросы памяти 256 → 512 МиБ |
| Число узлов | Cluster Autoscaler, Karpenter | добавить ВМ, когда поды не помещаются |
Обычно они работают вместе: HPA добавляет поды, им не хватает места на узлах, и Cluster Autoscaler заказывает у облака новую машину.
Как работает HPA
Контроллер HPA раз в 15 секунд запрашивает метрики и вычисляет нужное число реплик по формуле:[1]
желаемые = ceil(текущие × текущее_значение / целевое_значение)
Если цель — 60% CPU, а четыре пода загружены в среднем на 90%, нужно ceil(4 × 90 / 60) = 6 реплик. Загрузка процессора считается относительно запросов ресурсов (resources.requests) — без них HPA по CPU работать не может. Источником базовых метрик служит metrics-server; прикладные метрики (запросы в секунду, длина очереди) подключают через Prometheus Adapter или KEDA.[3]
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target: {type: Utilization, averageUtilization: 60}
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- {type: Percent, value: 50, periodSeconds: 60}
Блок behavior защищает от «дребезга»: уменьшение реплик откладывается на 5 минут (окно стабилизации по умолчанию) и ограничивается по скорости. Быстрое создание HPA — kubectl autoscale deployment api --cpu-percent=60 --min=2 --max=20; состояние — kubectl get hpa и kubectl describe hpa api (см. kubectl).[2]
Метрики
- Resource — CPU и память контейнеров. Память — плохой сигнал для масштабирования: многие среды выполнения (JVM, Python) не возвращают её системе после пика.
- Pods / Object — прикладные метрики из Prometheus: RPS на под, задержки, число активных соединений.
- External — метрики вне кластера: длина очереди в облачном брокере, лаг потребителя Kafka.
Лучший сигнал — тот, что напрямую отражает нагрузку: для веб-API — запросы в секунду или задержка, для обработчиков — длина очереди.
KEDA
KEDA (Kubernetes Event-driven Autoscaling) расширяет HPA десятками источников событий — Kafka, RabbitMQ, Redis, SQS, cron, запросы к Prometheus — и умеет масштабировать до нуля: если очередь пуста, подов нет вообще, а при появлении сообщений они создаются.[4] Это удобно для фоновых обработчиков и задач по расписанию.
VPA и масштабирование узлов
Vertical Pod Autoscaler анализирует фактическое потребление и рекомендует или выставляет запросы CPU и памяти. Применение новых значений обычно требует пересоздания пода; совмещать VPA и HPA по одной и той же метрике CPU нельзя — они будут мешать друг другу.[5] Часто VPA используют в режиме рекомендаций, чтобы правильно задать запросы.
Cluster Autoscaler добавляет узлы, когда поды висят в Pending из-за нехватки ресурсов, и удаляет недогруженные узлы. Karpenter (AWS, теперь проект Kubernetes SIG) подбирает тип и размер машины под конкретные ожидающие поды и быстрее реагирует.[6]
Практика
- Всегда задавайте
resources.requests— от них считается и загрузка, и размещение подов. minReplicasне меньше 2 для сервисов, которые должны переживать сбой узла; добавьте PodDisruptionBudget.- Учитывайте время старта: если под готов через минуту, HPA не спасёт от резкого всплеска — нужен запас или предварительное масштабирование по расписанию.
- Приложение должно быть без состояния и корректно завершаться по SIGTERM, иначе уменьшение реплик обрывает запросы.
- Проверяйте поведение нагрузочным тестом и следите за событиями масштабирования в мониторинге.