Стадия жизненного цикла модуля: 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: prodAutoVPA будет управлять только пространствами имен с лейблом 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).
Порядок применения:
- Аннотация имеет приоритет над лейблом с тем же ключом.
- Настройка на уровне 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: Deckhousesource: 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 |