Ответ
Да, настраивал. Поскольку в Docker Swarm нет встроенного автоскейлера, подобного HPA в Kubernetes, реализация требует внешних инструментов или скриптов.
Основной подход — масштабирование реплик сервиса:
-
Создание сервиса с начальным числом реплик:
docker service create --name web_app --replicas 3 --publish published=8080,target=80 nginx:alpine -
Реализация логики автоскейлинга. Я использовал комбинацию Prometheus для сбора метрик (CPU, memory, request rate) и простого bash- или Python-скрипта, который по расписанию (через cron) или триггеру (из Alertmanager) изменяет количество реплик.
Пример скрипта на основе средней загрузки CPU:
#!/bin/bash SERVICE_NAME="web_app" TARGET_CPU_PERCENT=70 # Получаем среднюю загрузку CPU по всем контейнерам сервиса CURRENT_CPU=$(docker stats --no-stream --format "table {{.CPUPerc}}" $(docker service ps -q $SERVICE_NAME) | tail -n +2 | sed 's/%//' | awk '{sum+=$1} END {print sum/NR}') CURRENT_REPLICAS=$(docker service inspect $SERVICE_NAME --format '{{.Spec.Mode.Replicated.Replicas}}') if (( $(echo "$CURRENT_CPU > $TARGET_CPU_PERCENT" | bc -l) )); then NEW_REPLICAS=$((CURRENT_REPLICAS + 1)) echo "CPU $CURRENT_CPU% > $TARGET_CPU_PERCENT%. Scaling up to $NEW_REPLICAS replicas." docker service scale $SERVICE_NAME=$NEW_REPLICAS elif (( $(echo "$CURRENT_CPU < $TARGET_CPU_PERCENT/2" | bc -l) && $CURRENT_REPLICAS > 1 )); then NEW_REPLICAS=$((CURRENT_REPLICAS - 1)) echo "CPU $CURRENT_CPU% < $TARGET_CPU_PERCENT/2%. Scaling down to $NEW_REPLICAS replicas." docker service scale $SERVICE_NAME=$NEW_REPLICAS fi
Выводы: Такой подход работал, но был менее надежным и гибким, чем нативные решения в Kubernetes. Для production-нагрузок, где критичен динамический скейлинг, я всегда рекомендую и выбираю Kubernetes с HPA.