Как реализовать auto-scaling в Kubernetes (HPA, VPA)?
Auto-scaling в Kubernetes: HPA и VPA — как это работает и как настроить
Auto-scaling в k8s решает две разные задачи: горизонтальное масштабирование (больше/меньше реплик) и вертикальное (изменение ресурсов контейнера). Для этого используются Horizontal Pod Autoscaler (HPA) и Vertical Pod Autoscaler (VPA). Дополнительно нужен Cluster Autoscaler для автоматического добавления/удаления узлов.
Horizontal Pod Autoscaler (HPA)
Что делает: автоматически увеличивает или уменьшает число реплик (Deployment/ReplicaSet/StatefulSet) на основе метрик.
Требования:
-
Для CPU/Memory: установлен metrics-server.
-
Для кастомных метрик: Prometheus + Prometheus Adapter или другой adapter, обеспечивающий Metrics API.
Простой быстрый пример (CLI):
kubectl autoscale deployment my-deploy --min=2 --max=10 --cpu-percent=80
Пример манифеста (autoscaling/v2, ресурсный таргет по CPU):
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-example
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deploy
minReplicas: 2
maxReplicas: 10
metrics:
\- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 75
Дополнительно: в HPA v2 можно задать behavior (политики scaleUp/scaleDown, стабилизационные окна, ограничения скорости масштабирования) чтобы избегать «рывков» и флип-флопа.
Как проверять:
kubectl get hpa
kubectl describe hpa hpa-example
Vertical Pod Autoscaler (VPA)
Что делает: рекомендует или автоматически меняет requests (и часто limits) CPU/Memory для контейнеров в Pod, основываясь на использовании за прошлое время. Полезен для подгонки ресурсов (правильные requests) и уменьшения перерасхода/перескальзования.
Компоненты: recommender (считает рекомендации), updater (при необходимости эвакуирует/пересоздаёт Pod для применения новых requests) и admission controller (опционально, применяет initial requests при создании Pod).
Пример простого VPA-ресурса:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: vpa-example
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-deploy
updatePolicy:
updateMode: "Auto" # типичные режимы: Off (только рекомендации), Auto (применять), Recreate (применять через пересоздание)
Важные моменты:
-
VPA не входит в k8s «по умолчанию» — нужно установить VPA-компоненты.
-
В автоматическом режиме VPA может эвакуировать Pod (delete) чтобы новый с обновлёнными requests создался; это влияет на доступность.
-
VPA и HPA могут конфликтовать: VPA меняет requests, это влияет на метрики CPU% (которые HPA использует). Рекомендуется:
-
использовать VPA в режиме рекомендаций (Off) + применять рекомендации вручную/через CI,
-
или комбинировать HPA (горизонтальное) с VPA только для initial sizing / recommendation-only,
-
либо HPAрабатывать на внешних/custom метриках, чтобы избежать дрейфа из-за изменений requests.
-
Node autoscaling (Cluster Autoscaler)
HPA увеличит число Pod, но если нод не хватает, Pod останутся Pending. Cluster Autoscaler (в облаке или on-prem) обнаружит Pending из-за нехватки ресурсов и добавит узлы (или удалит неиспользуемые). Для полного auto-scaling-цепочки нужно HPA (или VPA-инициация), + Cluster Autoscaler.
Рекомендации и порядок действий
-
Установить metrics-server (и Prometheus Adapter при нужде в custom metrics).
-
Настроить HPA для горизонтального масштабирования (начните с CPU или custom метрик).
-
Установить VPA в режиме рекомендаций и собрать данные, просмотреть рекомендации. При уверенности — перейти к автоматическому применению или применять рекомендации периодически.
-
Настроить Cluster Autoscaler в провайдере/кластере, чтобы узлы добавлялись при необходимости.
-
Ограничивать скорость масштабирования HPA через behavior и проверять readiness/liveness, чтобы новые Pod не попадали в трафик до готовности.
-
Тщательно тестировать сочетания HPA+VPA в staging, чтобы избежать конфликтов и неожиданного поведения.
Команды диагностики
kubectl get hpa -A
kubectl describe hpa <name> -n <ns>
kubectl get vpa -A
kubectl describe vpa <name> -n <ns>
kubectl get pods -o wide # смотреть Pending из-за нехватки ресурсов
Auto-scaling — это сочетание метрик, политик и инфраструктуры (узлы). HPA отвечает за число реплик, VPA — за ресурсы контейнеров; Cluster Autoscaler обеспечивает доступность нод под новые нагрузки.