Стадия жизненного цикла модуля: Experimental
У модуля есть требования для установки

Включение AutoVPA для всех пространств имен

Чтобы включить контроллер AutoVPA для всех пространств имен в кластере, установите settings.autovpa.enabled в true без дополнительных фильтров:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: adaptive-resource-management
spec:
  version: 1
  enabled: true
  settings:
    autovpa:
      enabled: true

В этом режиме AutoVPA создает объекты VPA для рабочих нагрузок в каждом пространстве имен, кроме системных (см. Исключённые пространства имён).

Включение AutoVPA для определенных пространств имен с помощью label selector

Чтобы ограничить AutoVPA пространствами имен, соответствующими label selector, используйте параметр namespaceLabelSelector:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: adaptive-resource-management
spec:
  version: 1
  enabled: true
  settings:
    autovpa:
      enabled: true
      namespaceLabelSelector:
        matchLabels:
          env: prod

AutoVPA будет управлять только пространствами имен с лейблом env: prod.

Включение AutoVPA для пространств имен со специальным лейблом

Чтобы управлять только пространствами имен, явно отмеченными лейблом autovpa.deckhouse.io/enabled: "true", используйте параметр onlySpecialLabel:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: adaptive-resource-management
spec:
  version: 1
  enabled: true
  settings:
    autovpa:
      enabled: true
      onlySpecialLabel: true

Затем добавьте лейбл к нужным пространствам имен:

d8 k label namespace my-namespace autovpa.deckhouse.io/enabled=true

При onlySpecialLabel: true (или заданном namespaceLabelSelector) модуль формирует список управляемых пространств имён и передаёт его контроллеру. После добавления или снятия лейбла autovpa.deckhouse.io/enabled дождитесь перехода ModuleConfig в состояние Ready и обновления Deployment autovpa-controller (проверьте аргумент --include-namespaces), прежде чем ожидать появления VPA в недавно помеченном namespace.

Комбинирование label selector со специальным лейблом

Когда одновременно заданы onlySpecialLabel и namespaceLabelSelector, итоговый список управляемых пространств имен формируется как объединение обоих наборов:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: adaptive-resource-management
spec:
  version: 1
  enabled: true
  settings:
    autovpa:
      enabled: true
      onlySpecialLabel: true
      namespaceLabelSelector:
        matchLabels:
          team: backend

В этом примере AutoVPA будет управлять пространствами имен, которые имеют лейбл team: backend или лейбл autovpa.deckhouse.io/enabled: "true" (или оба).

Сводная таблица поведения выбора пространств имен

onlySpecialLabel namespaceLabelSelector Управляемые пространства имен
false не задан Все пространства имён, кроме kube-* и d8-* (см. Исключённые пространства имён)
false задан Только пространства имен, соответствующие selector
true не задан Только пространства имен с лейблом autovpa.deckhouse.io/enabled: "true"
true задан Объединение: пространства имен, соответствующие selector + пространства имен со специальным лейблом

Как AutoVPA применяет изменения

AutoVPA пересчитывает объекты VPA в namespace при одном из событий:

Источник события Запускает пересчёт? Типичный случай
Создание, изменение или удаление Pod Да Rollout, рестарт pod’а
Создание или изменение Namespace (лейблы, аннотации) Да Настройки на уровне namespace, opt-out лейбл
Создание, изменение или удаление VPA на том же workload (не управляемого AutoVPA) Да См. Сосуществование с другими VPA
Изменение только metadata workload (аннотации/лейблы без смены pod’ов) Нет
Изменение ModuleConfig Косвенно Модуль обновляет список управляемых namespace’ов и перезапускает контроллер

Объекты workload (Deployment, StatefulSet, DaemonSet, Job) не отслеживаются напрямую. При пересчёте контроллер находит top-level контроллеры по pod’ам в namespace и читает их актуальные аннотации через API.

На практике:

  • Аннотации и лейблы на Namespace применяются после изменения namespace.

  • Аннотации на workload учитываются при пересчёте, но сам по себе пересчёт от изменения metadata workload не запускается.

  • После смены аннотации на workload перезапустите нагрузку, если нужно обновить VPA сразу:

    kubectl rollout restart deployment/<имя> -n <namespace>
  • Workload без запущенных pod’ов (scale to 0, завершённый Job) не пересчитывается, пока pod снова не появится.

Исключённые пространства имён

Независимо от настроек ModuleConfig, AutoVPA никогда не управляет пространствами имён, имена которых начинаются с kube- или d8-. Это нельзя переопределить лейблами или namespaceLabelSelector.

В режиме «все пространства имён» управляются прикладные namespace’ы; системные пространства Kubernetes и Deckhouse исключаются автоматически.

Аннотации и лейблы для настройки VPA

По умолчанию AutoVPA создает объекты VPA в режиме Off (только рекомендации). Параметры VPA можно переопределить аннотациями или лейблами на Namespace или на workload (Deployment, StatefulSet, DaemonSet или Job).

Порядок применения:

  1. Аннотация имеет приоритет над лейблом с тем же ключом.
  2. Настройка на уровне workload переопределяет значение по умолчанию для namespace.

Куда ставить аннотации

Аннотации и лейблы настройки размещайте в metadata объекта workload, а не в spec.template.metadata pod’а.

Поддерживаемые типы workload: Deployment, StatefulSet, DaemonSet, Job. CronJob учитывается, если у него есть запущенные pod’ы.

Доступные ключи

Ключ Объект Назначение Влияние
autovpa.deckhouse.io/vpa-update-mode Namespace, workload Режим обновления VPA Задает spec.updatePolicy.updateMode в VPA, создаваемом AutoVPA. Допустимые значения: Off, Initial, Recreate, InPlaceOrRecreate. По умолчанию: Off. Режимы, отличные от Off, требуют работающий VPA updater в кластере и могут изменять resource requests/limits pod’ов.
autovpa.deckhouse.io/vpa-resource-policy Namespace, workload Resource policy JSON-объект, записываемый в spec.resourcePolicy VPA (containerPolicies, minAllowed, maxAllowed и другие поля resource policy VPA).
autovpa.deckhouse.io/vpa-min-replicas Namespace Минимальное число реплик для eviction Целое число в виде строки, записываемое в spec.updatePolicy.minReplicas. Только уровень namespace.
autovpa.deckhouse.io/exclude-containers Namespace, workload Исключение контейнеров Список имён sidecar контейнеров через запятую, исключаемых из рекомендаций VPA (например istio-proxy или linkerd-proxy).
autovpa.deckhouse.io/enabled Namespace (лейбл) Opt-in / opt-out См. раздел Включение AutoVPA для пространств имен со специальным лейблом. При работе AutoVPA с --on-by-default лейбл autovpa.deckhouse.io/enabled=false исключает namespace из управления. При onlySpecialLabel: true модуль использует этот лейбл для формирования списка управляемых namespace’ов.

Примеры

Задать режим обновления, отличный от Off, на Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: my-namespace
  annotations:
    autovpa.deckhouse.io/vpa-update-mode: "InPlaceOrRecreate"
spec:
  # ...

Задать resource policy на Namespace:

apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace
  annotations:
    autovpa.deckhouse.io/vpa-resource-policy: >
      {"containerPolicies":[{"containerName":"app","minAllowed":{"cpu":"100m","memory":"128Mi"}}]}

Применение изменений на workload

Если VPA уже создан, смена autovpa.deckhouse.io/vpa-update-mode на Deployment сама по себе не обновит VPA. Перезапустите workload или задайте ту же аннотацию на Namespace:

kubectl rollout restart deployment/my-app -n my-namespace
kubectl get vpa autovpa-my-app -n my-namespace -o jsonpath='{.spec.updatePolicy.updateMode}{"\n"}'

Сосуществование с другими VPA

Если на workload уже есть VPA без меток:

  • creator: Deckhouse
  • source: autovpa

AutoVPA не создаёт свой VPA для этого workload. Ранее созданный AutoVPA VPA для него будет удалён при следующем пересчёте.

Чтобы AutoVPA снова управлял workload’ом, удалите существующий VPA (если он создан вручную или другим инструментом).

Создаваемые объекты VPA

Для workload с именем my-app AutoVPA создаёт:

Поле Значение
Имя VPA autovpa-my-app
Метки creator: Deckhouse, source: autovpa
Режим по умолчанию Off (только рекомендации)

По меткам можно отличить VPA, созданные модулем, от VPA, созданных вручную или другими средствами.

Устранение неполадок

Симптом Возможная причина Что проверить
VPA не создаётся Namespace вне области управления ModuleConfig, лейблы NS, префикс kube-/d8-
VPA не создаётся Уже есть другой VPA на workload kubectl get vpa -n <namespace>
updateMode не меняется Нет пересчёта после смены аннотации rollout restart или аннотация на Namespace
После лейбла NS нет VPA Контроллер ещё не обновился ModuleConfig Ready, --include-namespaces у autovpa-controller