Как реализовать 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.

Рекомендации и порядок действий

  1. Установить metrics-server (и Prometheus Adapter при нужде в custom metrics).

  2. Настроить HPA для горизонтального масштабирования (начните с CPU или custom метрик).

  3. Установить VPA в режиме рекомендаций и собрать данные, просмотреть рекомендации. При уверенности — перейти к автоматическому применению или применять рекомендации периодически.

  4. Настроить Cluster Autoscaler в провайдере/кластере, чтобы узлы добавлялись при необходимости.

  5. Ограничивать скорость масштабирования HPA через behavior и проверять readiness/liveness, чтобы новые Pod не попадали в трафик до готовности.

  6. Тщательно тестировать сочетания 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 обеспечивает доступность нод под новые нагрузки.