Attune — оператор Kubernetes, который автоматически подбирает оптимальные запросы и лимиты ресурсов для подов с помощью изменения ресурсов без перезапуска (In-Place Pod Resize) (GA в Kubernetes 1.35; бета с включением по умолчанию в 1.33–1.34; альфа с 1.27, с feature gate в 1.32). Attune требует Kubernetes 1.32+ для использования субресурса /resize. По умолчанию применяется in-place изменение, при необходимости — опциональный откат через вытеснение (eviction) для неосуществимых ресайзов, без конфликтов с HPA.
Зачем это нужно
| Проблема | Последствия |
|---|---|
Средняя утилизация CPU составляет 8% |
Большая часть запрошенных ресурсов простаивает (CAST AI 2026) |
70% называют избыточное выделение ресурсов одним из главных факторов роста затрат |
Ресурсы, выделенные «на всякий случай», так и не высвобождаются (CNCF 2023) |
<1% используют VPA в production |
VPA исторически вытесняет поды, конфликтует с HPA и плохо поддаётся автоматизации (ScaleOps 2026) |
In-Place Pod Resize стал GA (K8s 1.35; бета 1.33–1.34; альфа с 1.27) |
Ненарушительный подбор ресурсов стал стабильным примитивом Kubernetes |
Чем Attune отличается от аналогов
In-place применение — это общий примитив (субресурс Kubernetes /resize). Attune — это безопасный автономный цикл поверх него: измерить, принять решение, применить к canary-поднабору, проверить результат, откатиться при необходимости.
| VPA | Goldilocks | Attune | |
|---|---|---|---|
Метод ресайза |
Исторически вытеснение; новые режимы могут использовать in-place там, где это поддерживается |
Без ресайза (только рекомендации) |
In-place по умолчанию (опциональный откат через вытеснение) |
Совместимость с HPA |
Рискованно на одной метрике (петли смерти) |
Н/П |
Да (корректирует базовые запросы, не проценты HPA) |
Безопасность |
Минимальные ограничения |
Н/П |
Автооткат (OOM, throttle, рестарты, NotReady) + SLO-ограничители на PromQL |
Радиус поражения |
Все целевые поды |
Н/П |
Canary-доля с наблюдением и опциональным автопродвижением |
Холодный старт |
Нет |
Н/П |
Startup boost (временный запас CPU, затем откат к steady-state) |
Алгоритм |
Гистограммы на основе прошлых данных |
Рекомендер VPA |
С учётом времени суток + обнаружение всплесков + масштабирование по уверенности |
Путь в production |
<1% применяют в production |
Ручное применение |
Observe → Recommend → Canary → Auto |
Мигрируете с VPA? Ознакомьтесь с пошаговым docs/guides/migrating-from-vpa.md[руководством по миграции]: там есть сопоставление полей, матрица режимов, сравнение YAML и инструкция по переходу без простоев.
Другие in-place решения 2026 года (k8s-sustain, CruiseKube, Kedify PRA) рассмотрены в разделе docs/why-attune.md#other-2026-in-place-appliers[Why Attune].
Быстрый старт
Предварительные требования
-
Kubernetes 1.32+ (в 1.32 необходимо включить feature gate
InPlacePodVerticalScaling; в 1.33–1.34 бета включена по умолчанию; 1.35+ GA) -
Prometheus (для метрик использования)
-
Helm 3.16+ или 4.x
-
cert-manager (требуется для TLS admission webhook по умолчанию; чтобы пропустить, установите с
--set webhooks.enabled=false)
Опциональный режим GitOps-экспорта: рекомендации можно записывать в ConfigMap вместо (или в дополнение к) прямого ресайза. Идеально подходит для рабочих процессов ArgoCD/Flux. Подробнее — в docs/guides/auto-mode.md#exporting-recommendations-to-configmaps[руководстве по режиму Auto].
Установка
# Требует cert-manager при включённых webhooks (поведение по умолчанию).
# Типичные ошибки при первом запуске:
# --set webhooks.enabled=false # пропустить cert-manager
# --set networkPolicy.prometheusPort=80 # если Prometheus Service слушает :80
# # (chart по умолчанию разрешает только :9090)
# Chart 0.1.23 по умолчанию использует тег :0.1.23 (никогда не публиковался). Закрепите
# chart с помощью --set image.tag=v0.1.23. Начиная с 0.1.24+ пин можно не указывать.
helm install attune oci://ghcr.io/attune-io/charts/attune \
--namespace attune-system --create-namespace
Также доступно через OperatorHub.io (OLM-пакет attune) и на OpenShift 4.19+ во встроенном каталоге OperatorHub Community под тем же именем. Сырые манифесты публикуются с каждым релизом. Все варианты установки описаны в руководстве по установке и docs/guides/openshift[руководстве для OpenShift].
Создание политики (Policy)
Начните в режиме Recommend (безопасный, без применения изменений):
apiVersion: attune.io/v1alpha1
kind: AttunePolicy
metadata:
name: api-services
namespace: production
spec:
targetRef:
kind: Deployment
selector:
matchLabels:
tier: api
metricsSource:
prometheus:
address: http://prometheus-server.monitoring:80
# Опционально: более быстрый первый взгляд (~1ч вместо ~4ч при queryStep: 5m)
# minimumDataPoints: 12
cpu:
percentile: 95
overhead: "20"
minAllowed: "1m"
memory:
percentile: 99
overhead: "30"
minAllowed: "4Mi"
updateStrategy:
type: Recommend
kubectl apply -f policy.yaml
Просмотр рекомендаций
kubectl get attunepolicies -n production
# NAME TYPE WORKLOADS RECS RESIZED READY AGE
# api-services Recommend 3 0 0 False 5m
После накопления достаточного количества данных появятся рекомендации:
kubectl get attunepolicies -n production
# NAME TYPE WORKLOADS RECS RESIZED READY AGE
# api-services Recommend 3 3 0 True 2d
kubectl attune recommendations -n production
# NAMESPACE POLICY WORKLOAD CONTAINER CPU REQ CPU REC MEM REQ MEM REC GRADE CONFIDENCE / STATUS
# production api-services api-server app 500m 320m 512Mi 384Mi D 92.0%
# production api-services worker main 1000m 480m 2Gi 1.2Gi F 88.5%
# production api-services frontend nginx 250m 120m 256Mi 180Mi F 95.1%
kubectl attune savings -n production
# NAMESPACE NAME CPU SAVED MEMORY SAVED % SAVED EST. MONTHLY
# production api-services 830m 1012Mi 34% $72.40
Примечание:
minimumDataPointsсчитает выборки из range-запросов Prometheus, а не часы. При дефолтномqueryStep: 5mдляminimumDataPoints: 48потребуется около 4 часов данных. Если увеличитьqueryStep, реальное время ожидания тоже вырастет. Подробности — в docs/getting-started/quickstart.md[руководстве по быстрому старту].В этом примере не задан
maxAllowed. Добавьте его, если хотите ограничить максимум.Эффективные значения по умолчанию: большинство полей политики, имеющих дефолты, контроллер применяет во время reconcile, чтобы их можно было переопределить через
AttuneDefaultsиAttuneNamespaceDefaults. Такие поля могут выглядеть пустыми при выполненииkubectl get attunepolicy -o yaml, но политика всё равно следует встроенному и унаследованному поведению, если явно не переопределить эти поля. Используйтеkubectl attune explain -n <namespace> <policy>, чтобы увидеть эффективные значения ключевых defaults, применяемых контроллером, и узнать, откуда каждое из них взято: из самой политики, namespace-дефолтов, кластерных дефолтов или встроенных значений.
Обновляетесь? Проверьте CHANGELOG.md[changelog] на наличие критических изменений.
Helm-установки: если в кластере действуют ограничительные сетевые политики, ознакомьтесь с charts/attune/README.md#networkpolicy[Helm README] перед установкой с
networkPolicy.enabled=true(по умолчанию). Политика разрешает исходящий трафик для webhook, метрик, DNS, API-сервера и Prometheus на портуnetworkPolicy.prometheusPort(по умолчанию9090).
Переход в режим Canary
Когда рекомендации вызывают доверие, переключитесь в режим Canary: изменения будут применяться сначала к 10% подов:
spec:
updateStrategy:
type: Canary
canary:
percentage: 10
observationPeriod: 30m # рекомендуемое первое окно; без указания — 5m
autoRevert: true # по умолчанию
Больше сценариев — в директории examples/[examples/]: режим Auto, совместная работа с HPA, кластерные дефолты и мультирабочие селекторы.
Плагин kubectl
Плагин kubectl attune даёт быстрый доступ к статусу политики, экономии, рекомендациям, истории ресайзов и обоснованиям рекомендаций — без разбора сырого YAML.
# Установка через Krew (рекомендуется)
kubectl krew install attune
# Или сборка из исходников
make build-plugin
sudo cp bin/kubectl-attune /usr/local/bin/
# Использование
kubectl attune status -n production
kubectl attune savings -n production
kubectl attune recommendations -n production
kubectl attune preview -n production api-services # текущее vs рекомендованное перед продвижением
kubectl attune export -n production # GitOps ConfigMap-экспорты + время последнего обновления
kubectl attune history -n production
kubectl attune explain -n production api-services
kubectl attune wizard # интерактивное создание политики
kubectl attune doctor # версия кластера, pods/resize, cgroup v2, Prometheus
kubectl attune version
# Все пространства имён
kubectl attune status -A
Пример вывода (kubectl attune status):
NAMESPACE NAME TYPE WORKLOADS PENDING RESIZED READY RESIZING DEGRADED SCHEDULE CANARY EXPORT AGE production api-services Canary 3 0 1 Monitoring Idle - - - - 2d
Пример вывода (kubectl attune recommendations):
NAMESPACE POLICY WORKLOAD CONTAINER CPU REQ CPU REC MEM REQ MEM REC GRADE CONFIDENCE / STATUS production api-services api-server app 500m 320m 512Mi 384Mi D 92.0%
Дашборд Grafana
Helm chart (рекомендуется): включите grafanaDashboard.enabled: true в values Helm, чтобы дашборд автоматически подготавливался через Grafana sidecar:
helm upgrade attune oci://ghcr.io/attune-io/charts/attune \
--set grafanaDashboard.enabled=true
Ручной импорт: сырой JSON находится по адресу deploy/grafana/dashboard.json[deploy/grafana/dashboard.json]. Импортируйте его в Grafana и выберите источник данных Prometheus.
Дашборд включает:
-
Overview: общее количество ресайзов, откатов, сэкономленных CPU и памяти
-
Resize Operations: частота ресайзов по результатам, откаты по причинам
-
Recommendations: рекомендации CPU/памяти по воркloadам и показатели уверенности
-
Operator Health: задержка reconcile (p50/p99), длительность запросов к Prometheus, ошибки запросов
Архитектура
┌────────────────────────────────────────────────────┐
│ attune │
│ │
│ Policy Metrics Recommender │
│ Controller ──► Collector ──► Engine │
│ │ (percentile -> margin │
│ │ -> confidence -> │
│ ▼ bounds clamping) │
│ Resize Safety │
│ Engine ◄────► Monitor │
│ (/resize (OOMKill, throttle, │
│ subresource) restarts, auto-revert) │
└────────────────────────────────────────────────────┘
│ │
▼ ▼
Kubernetes API Prometheus
(Pod /resize) (usage data)
Возможности
Безопасность
-
Автооткат: автоматически восстанавливает исходные ресурсы при OOMKill, CPU throttle, всплесках рестартов или переходе пода в NotReady.
-
SLO-ограничители: проверки работоспособности приложения через PromQL (задержка, частота ошибок) — при превышении порогов после ресайза запускается откат.
-
Постепенный rollout: пять режимов от нулевого риска до полной автоматизации — Observe, Recommend, OneShot, Canary (с опциональным автопродвижением), Auto.
-
Canary-rollout: сначала ресайз применяется к части подов, затем наблюдение, и только потом продвижение — радиус поражения остаётся под контролем до перехода в полный Auto.
-
Startup boost: временный запас CPU при старте контейнера (JIT / cold path), после чего происходит откат к steady-state рекомендации.
-
Проверка ёмкости узла: перед применением изменений валидирует, что запросы после ресайза укладываются в allocatable на узле.
-
Защита LimitRange/ResourceQuota: пропускает ресайзы, которые нарушают ограничения пространства имён или превышают доступную квоту.
-
Экспоненциальный backoff: cooldown удваивается при каждом последовательном откате (максимум 16x). Состояние Degraded сигнализирует о воркloadах, требующих настройки.
Интеллект
-
Масштабирование по уверенности: консервативные рекомендации при малом объёме данных, точные — по мере их накопления. Без преждевременной оптимизации.
-
Учёт времени суток: почасовые профили использования гарантируют, что рекомендации покрывают пиковые часы, а не только среднее значение.
-
Совместная работа с HPA: корректирует базовые запросы ресурсов, не вмешиваясь в процентное масштабирование HPA. Без петель смерти.
-
Границы ресурсов:
minAllowedиmaxAllowedзадаются на уровне политики. Если минимум не указан, для CPU нижняя граница — 1m, для памяти — 4Mi. Если максимум не указан, ограничений нет.
Операции
-
In-place ресайз: корректирует CPU и память запущенных подов через субресурс K8s
/resize(GA в 1.35). По умолчанию — без рестартов.InPlaceOrRecreateопционально откатывается к вытеснению, если kubelet отвергает in-place ресайз. -
Оценка экономии затрат:
EstimatedMonthlySavingsна уровне воркload в статусе, в CLI (kubectl attune savings) и дашборде Grafana. -
Расписание ресайзов: ограничение применения изменений конкретными временными окнами и днями недели. Рекомендации вычисляются непрерывно вне зависимости от расписания.
-
Лимиты прироста в минуту: ограничение того, насколько много CPU и памяти одна политика может добавить за минуту.
-
Параллельная обработка подов: одновременный ресайз нескольких подов в рамках одного цикла для снижения задержки при масштабировании.
Совместимость
-
Несколько источников данных: Thanos, VictoriaMetrics, Grafana Mimir, управляемый Prometheus. Поддержка без аутентификации, с Secret на namespace или с единой идентификацией оператора для кластера с исключениями для отдельных namespace. Кастомные заголовки и TLS.
-
Автообнаружение Prometheus: находит Prometheus через CRD оператора или общеизвестные имена сервисов, если адрес не задан явно.
-
Пакетные воркloadы: CronJob и Job для подбора ресурсов только в режиме рекомендаций. CREATE может по-прежнему задавать ресурсы для новых подов Job при включённом начальном sizing.
-
Дефолты на уровне namespace:
AttuneNamespaceDefaultsпереопределяют кластерные дефолты отдельно для production и staging. -
Обнаружение конфликтов: предупреждает о VPA, пересекающихся политиках или активных rollout’ах, нацеленных на тот же воркload.
-
Потребление рекомендаций VPA: использование существующих рекомендаций
VerticalPodAutoscalerв качестве альтернативы запросам к Prometheus черезmetricsSource.vpa. -
GitOps diff-команда:
kubectl attune diffвыводит рекомендации в формате diff для проверки в рабочих процессах ArgoCD/Flux. -
Webhook начального sizing: задаёт ресурсы поду в момент создания на основе существующих рекомендаций политики, устраняя разрыв «деплой с плохими дефолтами».
-
Асимметричные лимиты изменений:
maxIncreasePercent/maxDecreasePercentотдельно для каждого ресурса (снижение памяти рискованнее, чем увеличение CPU). -
Вывод памяти из CPU:
memoryFromCpuRatioвычисляет память на основе CPU для JVM и воркloadов, ограниченных кучей. -
Приостановка reconcile:
spec.paused: trueостанавливает всю активность без отмены существующих ресайзов. -
Заморозка namespace: аннотируйте namespace
attune.io/freeze=true, чтобы пропустить новые операции apply (resize, persist, CREATE). Ожидающий safety revert при этом всё равно выполнится. Рекомендации остаются в статусе. -
Предупреждения webhook: 13 предупреждений на этапе admission для бессмысленных комбинаций конфигурации, 31 runtime-событие K8s и подавление на уровне отдельной политики.
Документация
Полная документация: attune-io.github.io/attune
| Руководство | Описание |
|---|---|
docs/why-attune.md[Почему Attune?] |
Суть проблемы, почему VPA не справляется, и как in-place ресайз меняет ситуацию |
docs/savings-calculator.md[Калькулятор экономии] |
Оцените ежемесячную экономию с помощью интерактивного калькулятора |
docs/getting-started/installation.md[Установка] |
Helm, OLM и сырые манифесты |
docs/getting-started/quickstart.md[Быстрый старт] |
Запуск за 5 минут |
docs/getting-started/first-30-days.md[Первые 30 дней] |
Пошаговое руководство от установки до режима Auto в production |
docs/guides/prometheus-setup.md#choose-how-attune-authenticates[Настройка Prometheus] |
Без аутентификации, per-namespace токен или единая идентификация оператора |
docs/guides/migrating-from-vpa.md[Миграция с VPA] |
Пошаговая замена VPA |
docs/guides/hpa-coexistence.md[Совместная работа с HPA] |
Использование рядом с HPA |
docs/guides/slo-guardrails.md[SLO-ограничители] |
Проверки работоспособности приложения через PromQL после ресайза |
docs/guides/runtime-profiles.md[Runtime-профили] |
Языково-зависимые дефолты для памяти |
docs/guides/multi-cluster.md[Мультикластер] |
Паттерны развёртывания, кросс-кластерные операции и постепенные rollout’ы |
docs/guides/scaling.md[Руководство по масштабированию] |
Пресеты размера кластера, тюнинг и HA-развёртывание |
docs/guides/canary-rollout.md[Canary-rollout] |
Стратегия постепенного применения изменений |
docs/guides/startup-boost.md[Startup boost] |
Временный запас CPU для холодного старта |
docs/guides/upgrading.md[Обновление] |
Обновление версий и обновление CRD |
docs/reference/cli.md[Справочник CLI] |
Команды плагина kubectl |
docs/reference/api.md[Справочник API] |
Спецификация CRD |
docs/guides/troubleshooting.md[Устранение неполадок] |
Типичные проблемы и их решения |
examples/[Примеры] |
Готовые к использованию манифесты политик |
CONTRIBUTING.md[Вклад в проект] |
Настройка окружения для разработки и правила работы |
CHANGELOG.md[Changelog] |
История релизов и критические изменения |
ADOPTERS.md[Пользователи] |
Организации, использующие Attune |
Лицензия
Apache License 2.0. Подробности — в файле LICENSE[LICENSE].