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, исключённых из анализа |
Что дальше?
- Instance Type — подбор оптимального типа VM для node groups.
- Hibernation — расписание сна для dev/staging кластеров.
- Proactive Autoscaling — двухслойный автоскейлер на p95.
- Spot Management — preemptible ноды для stateless workloads.