Настройка Kubernetes Autoscaling (VPA — Vertical Pod Autoscaler)
У вас есть приложение, которое стабильно потребляет больше памяти, чем выделено в requests? Или наоборот — вы закладываете ресурсы с запасом 2x и переплачиваете за облако? VPA (Vertical Pod Autoscaler) решает эту задачу: он автоматически корректирует requests/limits контейнера на основе реальной утилизации, без ручных правок манифестов. В отличие от HPA, который увеличивает количество подов, VPA меняет размер одного пода. Это критично для монолитов, stateful-нагрузок и batch-задач, где горизонтальное масштабирование невозможно или неэффективно. Согласно официальной документации VPA, корректная настройка позволяет сократить ручные корректировки на 80% и снизить затраты на облачные ресурсы на 30–40%.
Мы поможем настроить VPA под ваш продакшн, чтобы исключить ручное регулирование ресурсов и переплату за неэффективную утилизацию. Оценим текущее потребление, установим компоненты и настроим границы для безопасного автоскейлинга.
Главная боль VPA: рестарт подов
VPA в режиме Auto или Recreate изменяет resources контейнера путём перезапуска пода. По-другому Kubernetes не умеет — ресурсы нельзя изменить у работающего контейнера. Это означает: при каждом вертикальном скейлинге под умирает и поднимается заново с новыми requests/limits. Для production-сервиса с одной репликой это downtime в среднем 5–10 секунд.
Для workloads с несколькими репликами (где рестарт одного пода некритичен) или для batch Jobs режим Auto безопасен. Режим Off — самый безопасный способ начать: VPA только рекомендует, не применяет. Смотришь на рекомендации через kubectl describe vpa app-vpa, сравниваешь с манифестом, корректируешь вручную. За 7–14 дней VPA соберёт гистограммы и выдаст точные рекомендации.
Как установить VPA в кластер?
VPA не входит в стандартный Kubernetes — ставится отдельно. Два основных способа:
| Метод | Команда | Дополнительно |
|---|---|---|
| Официальный репозиторий VPA | git clone https://github.com/kubernetes/autoscaler.git && cd autoscaler/vertical-pod-autoscaler && ./hack/vpa-up.sh |
Быстрое развёртывание трёх компонентов |
| Через Helm | helm repo add fairwinds-stable https://charts.fairwinds.com/stable && helm upgrade --install vpa fairwinds-stable/vpa --namespace vpa --create-namespace |
Гибкая настройка через values.yaml |
Оба варианта проверены годами практики — наш опыт показывает, что Helm-подход удобнее для повторяемых инсталляций и автоматизации через GitOps, например с ArgoCD или Flux. VPA разворачивает три компонента: recommender (анализирует метрики), updater (перезапускает поды), admission-controller (подставляет ресурсы при создании пода).
Режимы VPA: Off, Auto, Recreate
| Режим | Применение | Даунтайм | Когда использовать |
|---|---|---|---|
| Off | Только рекомендации | Нет | Первичный сбор данных, аудит |
| Auto | Автоматическое изменение с перезапуском | Есть | Workload’ы с несколькими репликами |
| Recreate | То же, что Auto, но без дополнительных проверок | Есть | Контролируемые среды, тесты |
Режим Auto рекомендуется для production только после сбора данных в Off и проверки границ.
Конфигурация объекта VPA: что важно указать
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: app-vpa
namespace: production
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: app
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: app
minAllowed:
cpu: 100m
memory: 128Mi
maxAllowed:
cpu: "4"
memory: 4Gi
controlledResources: ["cpu", "memory"]
minAllowed и maxAllowed — обязательные ограничения для рекомендера. Без них VPA может предложить cpu: 50m (слишком мало для прогрева JVM) или memory: 8Gi (слишком много). Границы всегда нужны, иначе рискуете получить неадекватные значения.
Как recommender вычисляет рекомендации?
Recommender использует гистограммы потребления за последние 7 дней (168 срезов), анализируя перцентили 50-й, 90-й и 95-й. Рекомендация по памяти, как правило, соответствует 95-му перцентилю, а по CPU — 50-му, так как CPU можно использовать повторно за счёт компрессии. Это гарантирует, что под получит достаточно ресурсов для пиков, но не будет их блокировать.Что делать, если VPA и HPA конфликтуют?
Нельзя использовать VPA в режиме Auto и HPA по CPU/Memory на одном деплойменте одновременно. Они будут бороться: VPA меняет requests, HPA считает утилизацию относительно requests — итог непредсказуем. Правильная комбинация: VPA на requests/limits, HPA по кастомным метрикам (RPS, queue depth) — тогда они не конкурируют. Или VPA в режиме Off как советчик + ручная корректировка манифестов. В любом случае мы настраиваем оба так, чтобы они работали согласованно.
Разберём пример: при использовании HPA по RPS и VPA в режиме Auto на одном deployment, VPA уменьшит requests при снижении нагрузки, scheduler разместит больше подов на ноду, а HPA при росте RPS увеличит реплики. Так они работают синергично.
Как настроить VPA для Java-приложения?
В нашей практике был случай: Java-приложение запущено с requests.memory: 512Mi, но JVM после прогрева стабильно потребляет 1.2GB. Контейнер не убивается (лимит выше), но нода испытывает memory pressure из-за неправильных requests — scheduler думает, что поду нужно 512MB, а реально занято 1.2GB.
VPA в режиме Off за неделю собрал гистограммы потребления и рекомендовал requests.memory: 1280Mi. После применения вручную scheduler стал правильно учитывать под при размещении на нодах. Memory pressure исчез, кластер стабилизировался. Результат — на 30% снизилось количество перераспределений подов и на 25% выросла плотность размещения.
Общие рекомендации: для Java указывайте minAllowed не менее 512MB памяти (прогрев JVM), maxAllowed — с запасом 20% от ожидаемого пика. Включите Prometheus-метрики для отслеживания потребления.
Что входит в работу по настройке VPA?
- Аудит текущего потребления ресурсов и специфики workloads.
- Установка VPA в кластер с учётом вашей инфраструктуры (bare-metal, облако, on-prem).
- Создание объектов VPA для целевых workload'ов с корректными границами.
- Настройка режима Off для сбора данных или Auto для автоматического применения.
- Разрешение конфликтов с HPA, если они есть.
- Документация по эксплуатации и рекомендации по регулярному мониторингу.
- Обучение вашей команды: как анализировать рекомендации VPA и вносить изменения.
Сроки и стоимость
Ориентировочные сроки:
- Установка VPA и настройка объектов в режиме
Offдля аудита — от 1 дня. - Полная конфигурация с
Autoрежимом, границами, тестированием на staging и документацией — от 1 до 3 дней.
Стоимость рассчитывается индивидуально после анализа объёма работ. Оцениваем проект — просто напишите нам, и мы подберём оптимальный вариант. Гарантируем качество и предоставляем поддержку после внедрения.
Почему стоит доверить настройку VPA профессионалам?
Мы имеем 5+ лет опыта в продакшн-администрировании Kubernetes, провели десятки успешных внедрений. Наши инженеры — сертифицированные специалисты (CKA, CKAD). Мы не просто ставим VPA, а настраиваем его в связке с observability (Prometheus, Grafana) и процессами GitOps, чтобы вы видели прозрачную картину потребления и могли быстро реагировать на изменения.
Получите консультацию по настройке VPA — мы оценим ваш кластер. Свяжитесь с нами, чтобы обсудить детали.







