docker swarm - как сбалансировать уже запущенные контейнеры в кластере роя?

У меня есть кластер docker swarm с 2 узлами на AWS. Я остановил оба экземпляра и сначала запустил менеджер роя, а затем рабочий. Перед остановкой экземпляров у меня была служба, работающая с 4 репликами, распределенными между менеджером и работником.
Когда я сначала запустил узел менеджера роя, все контейнеры реплик запускались на самом менеджере и вообще не переходили на работника.
Пожалуйста, скажите мне, как для балансировки нагрузки?
Менеджер роя не отвечает за то, что должен делать при запуске worker?


person Bukkasamudram    schedule 27.03.2018    source источник
comment
вы можете перезапустить службу? они, вероятно, все были назначены на менеджера до того, как другой работник встал   -  person avigil    schedule 27.03.2018
comment
Мне нужно перезапустить службу докеров или стек докеров?   -  person Bukkasamudram    schedule 27.03.2018
comment
Я попытался перезапустить службу докеров, а затем попытался повторно развернуть стек. Не повезло.   -  person Bukkasamudram    schedule 27.03.2018
comment
Я надеюсь, что ручная остановка контейнеров из диспетчера роя, новые контейнеры могут переместиться на рабочий процесс для балансировки нагрузки, но есть ли другой способ автоматически балансировать самим диспетчером роя?   -  person Bukkasamudram    schedule 27.03.2018
comment
я не думаю, что рой будет перемещать контейнеры, которые уже существуют и активно работают, потому что он не может знать, приведет ли это к нарушению вашего приложения   -  person avigil    schedule 27.03.2018


Ответы (4)


В настоящее время Swarm (18.03) не перемещает и не заменяет контейнеры при запуске новых узлов, если службы находятся в "реплицированном режиме" по умолчанию. Это сделано намеренно. Если бы мне пришлось добавить новый узел, я не обязательно хочу останавливать кучу других контейнеров и создавать новые на моем новом узле. Swarm только останавливает контейнеры для «перемещения» реплик, когда это необходимо (в реплицированном режиме).

docker service update --force <servicename> перебалансирует службу по всем узлам, которые соответствуют ее требованиям и ограничениям.

Дальнейший совет: как и другим оркестраторам контейнеров, вам необходимо предоставить емкость на своих узлах, чтобы справиться с рабочими нагрузками любых реплик служб, перемещающихся во время простоев. Ваша свободная мощность должна соответствовать уровню резервирования, который вы планируете поддерживать. Например, если вы хотите обрабатывать емкость для двух узлов, которые выходят из строя одновременно, вам потребуется минимальный процент ресурсов на всех узлах, чтобы эти рабочие нагрузки переместились на другие узлы.

person Bret Fisher    schedule 28.03.2018
comment
Вы бы знали, идет ли это обновление? Это вызовет простой? - person Altus; 07.04.2021
comment
Чтобы ответить на свой вопрос: docs.docker.com/engine/reference/commandline/service_update/ - person Altus; 11.06.2021

Swarm не выполняет автобалансировку после создания контейнеров. Вы можете масштабировать вверх / вниз, когда все ваши воркеры будут включены, и он будет распределять контейнеры в соответствии с вашими требованиями конфигурации / ролями / и т. Д.

см. https://github.com/moby/moby/issues/24103

Возникают проблемы с "ограблением" новых узлов по мере их добавления. Мы также избегаем упреждения здоровыми задачами. Ребалансировка выполняется с течением времени, а не убивает рабочие процессы. На будущее рассматривается возможность преимущественной покупки.

В качестве обходного пути масштабирование службы вверх и вниз должно перебалансировать задачи. Вы также можете запустить непрерывное обновление, так как это приведет к изменению расписания новых задач.

person ldg    schedule 27.03.2018

Вот сценарий bash, который я использую для ребалансировки:

#!/usr/bin/env bash

set -e

EXCLUDE_LIST="(_db|portainer|broker|traefik|prune|logspout|NAME)"

for service in $(docker service ls | egrep -v $EXCLUDE_LIST | 
                 awk '{print $2}'); do
  docker service update --force $service
done
person Clintm    schedule 15.01.2021

В docker-compose.yml вы можете определить:

version: "3"

services:

  app:
    image: repository/user/app:latest
    networks:
      - net
    ports:
      - 80
    deploy:
      restart_policy:
        condition: any
      mode: replicated
      replicas: 5
      placement:
        constraints: [node.role == worker]
      update_config:
        delay: 2s

Примечание: ограничение - node.role == worker

Использование флага «- replicas» подразумевает, что нас не волнует, на каком узле они размещены. Если нам нужна одна служба на узел, мы можем вместо этого использовать «- mode = global».

В Docker 1.13 и более поздних версиях вы можете использовать флаг --force или -f с командой docker service update, чтобы заставить службу перераспределить свои задачи по доступным рабочим узлам.

person abv2014    schedule 27.03.2018
comment
Но я хочу загрузить контейнеры баланса, включая диспетчер. Я обновил свой docker-compose.yml с помощью ограничений: [node.role == worker]. Все контейнеры перемещены в рабочий. - person Bukkasamudram; 27.03.2018