Настраивали ли вы автоскейлинг в Docker Swarm?

«Настраивали ли вы автоскейлинг в Docker Swarm?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, настраивал. Поскольку в Docker Swarm нет встроенного автоскейлера, подобного HPA в Kubernetes, реализация требует внешних инструментов или скриптов.

Основной подход — масштабирование реплик сервиса:

  1. Создание сервиса с начальным числом реплик:

    docker service create --name web_app --replicas 3 --publish published=8080,target=80 nginx:alpine
  2. Реализация логики автоскейлинга. Я использовал комбинацию 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.