Автомасштабирование сервисов Compose
Автоматическое масштабирование числа реплик сервиса стека Swarm на основе текущего использования CPU/памяти (только для self-hosted).
Автомасштабирование сервисов Compose доступно только в self-hosted режиме и только для compose-стеков, развёрнутых в Swarm.
Требования
- Сервис compose должен быть частью стека (compose, развёрнутый в Swarm), а не обычного развёртывания Docker Compose.
- Для организации должен быть включён Swarm Monitoring — автомасштабирование использует те же метрики CPU/памяти по репликам.
- Runtime-сервис Swarm (
${appName}_${serviceName}) должен быть replicated сервисом; global- и job-сервисы пропускаются.
Настройка
Откройте вкладку Advanced compose-стека. Карточка Autoscaling появляется, когда выполнены оба требования выше. Выберите сервис и задайте:
- Enable autoscaling — пока включено, число реплик управляется автоматически; ручные изменения числа реплик, сделанные где-либо ещё, будут перезаписаны на следующем тике.
- Min / Max Replicas — значения по умолчанию
2/15. - CPU Scale-Up (%) / CPU Scale-Down (%) — по умолчанию
85/25. - Memory Scale-Up (%) / Memory Scale-Down (%) — по умолчанию
85/25.
sustainedChecks (по умолчанию 3), cooldownMinutes (по умолчанию 5) и
stepSize (по умолчанию 1) в этой форме не показаны — используются
значения по умолчанию, если не заданы напрямую через API (см. ниже).
Чтение конфигураций требует права autoscaler.read в кастомной роли;
сохранение требует autoscaler.update. Оба эндпоинта также проверяют, что
compose-стек принадлежит вашей активной организации.
Логика принятия решения о масштабировании
Фоновая задача запускается каждую минуту для каждой включённой конфигурации (compose, сервис). Она читает среднее значение CPU/памяти за последние 5 минут и принимает решение:
- Масштабирование вверх на
stepSizeреплик (не вышеmaxReplicas), когда CPU вышеtargetCpuMaxили память вышеtargetMemMax, превышение держитсяsustainedChecksподряд идущих тиков, и с последнего действия масштабирования прошлоcooldownMinutes. - Масштабирование вниз на
stepSizeреплик (не нижеminReplicas), когда CPU нижеtargetCpuMinи память нижеtargetMemMin(память игнорируется при отсутствии данных по ней), и cooldown истёк. - В остальных случаях — в «мёртвой зоне» между порогами, во время cooldown или уже на границе — ничего не происходит.
Сервис масштабируется на месте через живой docker service update, а не
полный docker stack deploy, поэтому остальная часть спецификации compose не
затрагивается. Итоговое число реплик сохраняется и повторно применяется при
следующем реальном docker stack deploy, так что редеплой не затирает
автоматически подобранное число реплик. Если для сервиса нет свежих метрик,
сервис отсутствует, или масштабирование завершилось ошибкой — это логируется,
и тик переходит к следующему сервису, не прерываясь целиком.
API
POST /api/trpc/autoscaler.list
POST /api/trpc/autoscaler.upsertlist возвращает все конфигурации сервисов для compose-стека:
{ "composeId": "compose_123" }upsert создаёт или обновляет конфигурацию одного сервиса:
{
"composeId": "compose_123",
"serviceName": "web",
"enabled": true,
"minReplicas": 2,
"maxReplicas": 10,
"targetCpuMax": 80,
"targetCpuMin": 20,
"targetMemMax": 80,
"targetMemMin": 20,
"sustainedChecks": 3,
"cooldownMinutes": 5,
"stepSize": 1
}Все поля, кроме composeId и serviceName, опциональны и патчат только
переданные значения. API отклоняет патч, где minReplicas > maxReplicas,
targetCpuMin >= targetCpuMax или targetMemMin >= targetMemMax (проверяется,
только когда обе стороны пары присутствуют). minReplicas/maxReplicas
принимают 1–100, цели по CPU/памяти — 1–100, sustainedChecks —
1–60, cooldownMinutes — 0–1440, stepSize — 1–10. Каждый upsert
записывается в журнал аудита организации как обновление autoscaler-config.