Ответ
Прямого встроенного автоскейлинга в Docker Swarm нет, но его можно реализовать через комбинацию мониторинга и внешних скриптов, использующих Docker API. Основной подход — мониторинг метрик контейнеров и управление количеством реплик сервиса.
Практическая реализация:
- Сбор метрик: Используем
docker statsили интегрируемся с системой мониторинга (Prometheus, cAdvisor) для получения CPU, памяти и сетевой нагрузки. - Логика масштабирования: Пишем скрипт (например, на Python или Bash), который анализирует метрики и принимает решение.
- Вызов масштабирования: Скрипт выполняет команду
docker service scale <service_name>=<new_replica_count>через Docker API или CLI.
Пример простого bash-скрипта для горизонтального скейлинга на основе CPU:
#!/bin/bash
SERVICE_NAME="my_web_app"
MAX_CPU=80
MIN_REPLICAS=2
MAX_REPLICAS=10
# Получаем среднюю загрузку CPU по всем репликам сервиса
CPU_LOAD=$(docker service ps $SERVICE_NAME --format "{{.Name}}" | xargs -I {} docker stats {} --no-stream --format "{{.CPUPerc}}" | awk -F'%' '{sum+=$1} END {print sum/NR}')
CURRENT_REPLICAS=$(docker service inspect $SERVICE_NAME --format '{{.Spec.Mode.Replicated.Replicas}}')
if (( $(echo "$CPU_LOAD > $MAX_CPU" | bc -l) )); then
if [ $CURRENT_REPLICAS -lt $MAX_REPLICAS ]; then
NEW_REPLICAS=$((CURRENT_REPLICAS + 1))
echo "High CPU load ($CPU_LOAD%). Scaling $SERVICE_NAME from $CURRENT_REPLICAS to $NEW_REPLICAS replicas."
docker service scale $SERVICE_NAME=$NEW_REPLICAS
fi
elif (( $(echo "$CPU_LOAD < 30" | bc -l) )) && [ $CURRENT_REPLICAS -gt $MIN_REPLICAS ]; then
NEW_REPLICAS=$((CURRENT_REPLICAS - 1))
echo "Low CPU load ($CPU_LOAD%). Scaling down $SERVICE_NAME from $CURRENT_REPLICAS to $NEW_REPLICAS replicas."
docker service scale $SERVICE_NAME=$NEW_REPLICAS
fi
Ограничения и замечания:
- Swarm-сервисы: Такой подход масштабирует только реплики сервисов (контейнеры), но не сами ноды кластера.
- Масштабирование нод: Для автоматического добавления/удаления воркер-нод в кластер необходимо использовать возможности облачного провайдера (AWS Auto Scaling Groups, GCP Instance Groups) в связке с Docker Machine или аналогичными инструментами.
- Готовые решения: Для продакшена лучше рассмотреть более надежные инструменты, такие как Orchestrator от Docker (для облачных сред) или настроить связку Prometheus + Alertmanager + custom webhook, которая будет запускать скрипты масштабирования.