Bin-Packing — консолидация нагрузки и освобождение нод

Поиск нод, которые можно безопасно освободить: pods переезжают на оставшиеся ноды, а Cluster Autoscaler уменьшает autoscaling node group.

Обзор

Bin-Packing уменьшает расходы на VM, а не ускоряет приложение и не подбирает requests/limits. Например, если в группе из четырёх нод одна стабильно почти не занята, а requests её pods помещаются на трёх остальных с запасом, Oopps.ai предложит освободить эту ноду. Kubernetes Scheduler разместит пересозданные pods, а Cluster Autoscaler уменьшит группу. Если хотя бы одно из условий не выполнено, рекомендации не будет.

Что делает и чего не делает

  • Делает: находит безопасные кандидаты на drain и оценивает экономию одной или нескольких VM.
  • Не делает: не меняет requests/limits и не удаляет ноду напрямую. В режиме Auto выполняет drain только после нового live preflight.
  • Результат: экономия появляется только после того, как Cluster Autoscaler действительно удалит пустую ноду.

Когда анализ готов

  • Включена оптимизация нод и есть минимум 50 срезов метрик на каждой ноде (примерно 50 минут после подключения).
  • В node group минимум две ноды; одну ноду или всю группу сервис не убирает.
  • Для анализа нужны Kubernetes API nodes, pods и metrics.k8s.io. Сверьте прямой доступ и вариант с агентом.
  • Для apply node group должна быть autoscaling, а сервисный аккаунт должен иметь k8s.cluster-api.editor для cordon/eviction. Без этих условий можно только смотреть рекомендации.

Метрики собираются раз в минуту, а новый анализ запускается раз в час. Экран покажет отдельно: сбор данных, отсутствие доступа и кандидатов, которые не проходят проверку вместимости.

Средняя загрузка нод

Как читать показатель

avg(max(cpu_util, mem_util)) по всем нодам группы. Значение от 0 до 1 показывает среднюю фактическую загрузку наиболее занятого ресурса на ноде.

  • Это не показатель равномерности и не самостоятельная рекомендация.
  • Низкое значение означает возможный запас, но pods могут не поместиться из-за requests или ограничений планирования.
  • Высокое значение означает, что освобождать ноду небезопасно; это не оценка «хорошо» или «плохо» для производительности.

Интерпретация

Средняя загрузка Сигнал Что это значит
< 0.4 Запас Можно проверять вместимость; рекомендация появится только после feasibility check.
0.4 – 0.7 Наблюдение Само по себе не означает, что ноду можно освободить.
> 0.7 Мало запаса Bin-Packing не предлагается, чтобы не создавать риск дефицита ресурсов.

Анализ кандидатов на drain

Условия

  • Средний CPU < 30% И средний MEM < 30% за 14 дней.
  • Минимум данных: MIN_DATA_POINTS = 50 (нужно достаточно метрик для достоверного анализа).
  • Минимум нод: MIN_NODES_IN_GROUP = 2 — если после drain останется 0 нод, кандидат исключается.

Feasibility Check

Ключевая защита от потери работоспособности при drain.

Проверка вместимости

Перед drain каждого кандидата платформа суммирует resource requests подов и проверяет, поместятся ли они на оставшихся нодах:

total_requested_on_others + candidate_requested ≤ 85% × total_allocatable_on_others

Если ресурсов на оставшихся нодах недостаточно — кандидат исключается из плана drain. Проверка выполняется отдельно для CPU и Memory. Pods с неподтверждёнными scheduling-ограничениями (например, affinity или topology spread) блокируют apply, а PodDisruptionBudget соблюдается Kubernetes Eviction API.

Apply

Режим применения

  • Monitor — показывает рекомендации, но не применяет их.
  • Approval — рекомендацию применяет пользователь с ролью approver.
  • Auto — после часового анализа Oopps автоматически применяет каждый безопасный план bin-packing; отдельное подтверждение не требуется.

Auto не пропускает проверку безопасности: непосредственно перед cordon и drain выполняется новый live preflight.

Повторный preflight

Перед drain платформа заново читает live-утилизацию, requests pods, их scheduling-ограничения и autoscaling policy node group. Если данные изменились или безопасность нельзя доказать, операция отменяется до cordon.

Drain

Cordon ноды (запрет на размещение новых подов) + evict подов через Kubernetes Eviction API с уважением PodDisruptionBudget.

Уменьшение группы

После успешного drain платформа помечает операцию как завершённую: это означает, что eviction прошёл. Пустую ноду позже обнаруживает Cluster Autoscaler и уменьшает autoscaling node group. Платформа не удаляет ноду напрямую; если autoscaler не уменьшил группу, экономия не наступит.

Действие записывается как action_kind = bin_pack_drain.

Проверка доступности

В проверенном изолированном сценарии доступность контролировалась внешними и внутренними запросами с начала операции Bin-Packing до удаления освобождённой ноды. Все запросы завершились без ошибок и без повторных попыток.

Это подтверждает поддерживаемый сценарий с проверенной топологией и нагрузкой, но не является гарантией доступности для любого кластера, сети или workload. Перед применением рекомендации платформа выполняет preflight, а команда должна учитывать собственные требования к доступности и ограничения планирования.

Настройки

Параметр Значение Описание
cpu_threshold 0.30 Порог средней утилизации CPU для кандидата на drain (30%)
mem_threshold 0.30 Порог средней утилизации MEM для кандидата на drain (30%)
max_packing_score 0.40 Верхняя граница средней загрузки для начала проверки консолидации
excluded_node_groups [] Список ID node groups, исключённых из анализа

Что дальше?