Автомасштабирование: HPA по метрикам, обзор VPA и Cluster Autoscaler

Рейтинг: 70.1% · 9 голосов
Kubernetes для разработчиков: поды, деплойменты, сервисы, ingress, конфиги и отладка. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
anton_k8s
Сообщения: 26
Зарегистрирован: 12 май 2026, 03:23

Автомасштабирование: HPA по метрикам, обзор VPA и Cluster Autoscaler

Сообщение anton_k8s »

АкадемияKubernetes на практикеГлава 17 из 19
Оглавление курса (19)
  1. Зачем нужен Kubernetes и из чего состоит кластер
  2. Поднимаем локальный кластер: minikube и kind
  3. Поды: базовая единица запуска
  4. Deployment и ReplicaSet: управляем репликами
  5. Service: сетевой доступ к подам
  6. ConfigMap и Secret: выносим конфигурацию
  7. Ingress: пускаем трафик снаружи
  8. Хранилище: Volumes и PersistentVolumeClaim
  9. Namespaces, requests и limits
  10. Health checks: liveness и readiness пробы
  11. Отладка: почему под не стартует
  12. Helm: пакетный менеджер для Kubernetes
  13. Базовая безопасность: RBAC и доступы
  14. Job и CronJob: разовые и периодические задачи
  15. StatefulSet и DaemonSet: stateful-нагрузки и системные агенты
  16. Стратегии обновления и планирование: rollout и rollback, graceful shutdown, nodeSelector, affinity, taints
  17. Автомасштабирование: HPA по метрикам, обзор VPA и Cluster Autoscaler (вы здесь)
  18. Наблюдаемость: логи, метрики, events, обзор Prometheus и Grafana
  19. Безопасность глубже: securityContext, Pod Security Standards, NetworkPolicy, шифрование секретов
Вручную крутить replicas можно, пока трафик предсказуем. Потом случается рассылка или вечерний пик, и вы в одиннадцать вечера делаете kubectl scale. Автомасштабирование снимает эту рутину, но работает ровно настолько хорошо, насколько честно выставлены requests из девятой главы. Без них вся механика ниже слепа.

Три уровня:

HPA (Horizontal Pod Autoscaler) меняет число реплик у Deployment или StatefulSet. VPA подбирает requests и limits самого пода. Cluster Autoscaler добавляет и убирает ноды, когда подам некуда вставать. Задачи разные: HPA вы будете трогать постоянно, два других скорее настроить и поглядывать.

HPA по CPU:

Метрики CPU и памяти отдает metrics-server. В managed-кластерах (Yandex Cloud, VK Cloud, Selectel) он обычно уже есть, в minikube включается аддоном:

Код: Выделить всё

minikube addons enable metrics-server
kubectl top pods
Если kubectl top показывает цифры, можно вешать HPA. Актуальный API autoscaling/v2, стабилен еще с Kubernetes 1.23:

Код: Выделить всё

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: orders-api
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: orders-api
  minReplicas: 2
  maxReplicas: 12
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Pods
        value: 1
        periodSeconds: 60
averageUtilization: 70 значит 70 процентов от requests.cpu, не от лимита и не от ядра ноды. Контроллер раз в 15 секунд сравнивает среднее по подам потребление с целью и считает реплики: desired = ceil(текущие реплики * текущая метрика / целевая). Отклонение меньше 10 процентов игнорируется, чтобы не дергаться попусту.

Блок behavior управляет скоростью. Вверх HPA по умолчанию идет быстро, вниз ждет 5 минут стабильно низкой нагрузки (stabilizationWindowSeconds: 300). Здесь мы вдобавок ограничили спуск одной репликой в минуту, сервисам с долгим прогревом это спасает от качелей.

Проверка:

Код: Выделить всё

kubectl get hpa orders-api
kubectl describe hpa orders-api
unknown в колонке TARGETS и FailedGetResourceMetric в describe значат одно из двух: нет metrics-server или не заданы requests.

Не только CPU:

По памяти масштабировать технически можно, но JVM и многие рантаймы память после пика не отдают, и HPA раздует реплики навсегда. Куда полезнее прикладные метрики: длина очереди, лаг консьюмера Kafka, RPS. Штатный путь, custom и external metrics через адаптеры вроде prometheus-adapter, но в 2026 проще взять KEDA: он сам создает HPA под капотом, знает десятки источников и умеет масштабировать в ноль, чего голому HPA не дано (minReplicas ниже 1 без альфа-фичи не бывает).

VPA коротко:

Vertical Pod Autoscaler ставится отдельно (проект kubernetes/autoscaler) и считает рекомендации по фактическому потреблению. Самый полезный режим, Off: ничего не трогает, рекомендации видны в kubectl describe vpa, а манифесты вы правите руками.

Код: Выделить всё

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: orders-api
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: orders-api
  updatePolicy:
    updateMode: "Off"
Off обязательно в кавычках, иначе YAML прочитает его как false. Режим Auto применяет рекомендации пересозданием подов, для прода это болезненно. In-place изменение ресурсов пода в Kubernetes дозрело до беты (1.33+), и VPA учится им пользоваться, но в 2026 это еще не дефолт. И не вешайте VPA в Auto вместе с HPA по CPU на один Deployment, они будут воевать.

Cluster Autoscaler:

HPA попросил 12 реплик, ноды кончились, поды повисли в Pending. Cluster Autoscaler видит их, прикидывает по requests, влезут ли они в ноду из настроенной группы, и заказывает ее у облака. В managed Kubernetes включается галочкой на группе нод. Два свойства, которые ломают ожидания: CA смотрит только на Pending поды и их requests, фактическая загрузка нод ему безразлична; и новая нода поднимается одну-три минуты, так что на резких пиках выручает запас через minReplicas или overprovisioning (под-пустышка с отрицательным priorityClass, который вытесняется и освобождает место). Вниз тоже автоматически: ноду, загруженную меньше чем наполовину, CA попробует разгрузить и удалить, уважая PodDisruptionBudget. В AWS и Azure набирает обороты Karpenter, заказывающий ноды нужного размера без заранее нарезанных групп; в облаках СНГ пока классический CA.

Типичные грабли:

spec.replicas в Git поверх HPA: каждый apply сбрасывает реплики на цифру из файла, и на пике сервис схлопывается. Поле надо убрать из манифеста (в Argo CD есть ignoreDifferences, но удалить честнее). maxReplicas от балды: каждая реплика тащит свои коннекты к PostgreSQL, и на сорока подах база умрет раньше, чем кончится CPU, считайте емкость зависимостей. И агрессивная цель вроде 50 процентов на рваном трафике без блока behavior: получите качели, где реплики прыгают каждые две минуты.

Итог:

HPA двигает реплики по метрикам и требует честных requests. VPA в режиме Off подсказывает, какими этим requests быть. Cluster Autoscaler подвозит ноды под Pending поды. Каскад простой: метрика выросла, HPA добавил поды, места не хватило, CA добавил ноды. Тюнить это вслепую невозможно, поэтому в следующей главе займемся наблюдаемостью: логи, events и метрики в Prometheus с Grafana.
👍4 ❤️2 🔥1 😄 🤔
✔ Лучший ответ сформирован автоматически — michi123
anton_k8s писал(а):каждый apply сбрасывает реплики на цифру из файла, и на пике сервис схлопывается прожили это в проде. argo каждые три минуты возвращал replicas: 2 поверх hpa, который раскручивал до десяти, полдня ловили волны 503 пока не посмотрели историю replicaset. и осторожнее с удалением поля: при первом client-side apply после этого деплоймент может схлопнуться до одной реплики, мы перее…
Перейти к ответу →
Аватара пользователя
michi123
Сообщения: 1
Зарегистрирован: 11 май 2026, 20:35

Re: Автомасштабирование: HPA по метрикам, обзор VPA и Cluster Autoscaler

Сообщение michi123 »

✔ Лучший ответ — сформирован автоматически
anton_k8s писал(а):каждый apply сбрасывает реплики на цифру из файла, и на пике сервис схлопывается
прожили это в проде. argo каждые три минуты возвращал replicas: 2 поверх hpa, который раскручивал до десяти, полдня ловили волны 503 пока не посмотрели историю replicaset. и осторожнее с удалением поля: при первом client-side apply после этого деплоймент может схлопнуться до одной реплики, мы переезжали через server-side apply
👍2 ❤️1 🔥 😄 🤔1
Аватара пользователя
SvelteGuru
Сообщения: 2
Зарегистрирован: 28 май 2026, 08:43

Re: Автомасштабирование: HPA по метрикам, обзор VPA и Cluster Autoscaler

Сообщение SvelteGuru »

масштабировал go сервис по памяти, реплики только растут и не падают, лол. перевел на rps через prometheus-adapter и живет ровно. память как сигнал это ловушка, тут все верно написано
👍2 ❤️1 🔥1 😄 🤔
Аватара пользователя
PyPro
Сообщения: 2
Зарегистрирован: 21 май 2026, 14:45

Re: Автомасштабирование: HPA по метрикам, обзор VPA и Cluster Autoscaler

Сообщение PyPro »

anton_k8s писал(а):в 2026 проще взять KEDA
плюсую, воркеры у нас скейлятся по лагу консьюмер-группы в кафке. по cpu это не работало вообще: консьюмер ест 5 процентов проца, а лаг растет миллионами. одно но, scale to zero для медленных джоб больно, первое сообщение после простоя ждет холодного старта секунд тридцать
👍1 ❤️ 🔥1 😄 🤔2
Аватара пользователя
moro
Сообщения: 1
Зарегистрирован: 19 май 2026, 16:30

Re: Автомасштабирование: HPA по метрикам, обзор VPA и Cluster Autoscaler

Сообщение moro »

а кто-нибудь в яндексовом managed кубере ускорял выдачу нод? группа с автоскейлом разворачивает ноду минуты по две, на резком пике не спасает. сделал overprovisioning как в уроке, pause под на два ядра с отрицательным priorityClass, работает, но ощущение что костыль
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Стратегии обновления и планирование: rollout и rollback, graceful shutdown, nodeSelector, affinity, taints
Следующая глава →
Наблюдаемость: логи, метрики, events, обзор Prometheus и Grafana

Все главы курса «Kubernetes на практике»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «Kubernetes на практике»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей