У меня есть кластер docker swarm с 2 узлами на AWS. Я остановил оба экземпляра и сначала запустил менеджер роя, а затем рабочий. Перед остановкой экземпляров у меня была служба, работающая с 4 репликами, распределенными между менеджером и работником.
Когда я сначала запустил узел менеджера роя, все контейнеры реплик запускались на самом менеджере и вообще не переходили на работника.
Пожалуйста, скажите мне, как для балансировки нагрузки?
Менеджер роя не отвечает за то, что должен делать при запуске worker?
docker swarm - как сбалансировать уже запущенные контейнеры в кластере роя?
Ответы (4)
В настоящее время Swarm (18.03) не перемещает и не заменяет контейнеры при запуске новых узлов, если службы находятся в "реплицированном режиме" по умолчанию. Это сделано намеренно. Если бы мне пришлось добавить новый узел, я не обязательно хочу останавливать кучу других контейнеров и создавать новые на моем новом узле. Swarm только останавливает контейнеры для «перемещения» реплик, когда это необходимо (в реплицированном режиме).
docker service update --force <servicename>
перебалансирует службу по всем узлам, которые соответствуют ее требованиям и ограничениям.
Дальнейший совет: как и другим оркестраторам контейнеров, вам необходимо предоставить емкость на своих узлах, чтобы справиться с рабочими нагрузками любых реплик служб, перемещающихся во время простоев. Ваша свободная мощность должна соответствовать уровню резервирования, который вы планируете поддерживать. Например, если вы хотите обрабатывать емкость для двух узлов, которые выходят из строя одновременно, вам потребуется минимальный процент ресурсов на всех узлах, чтобы эти рабочие нагрузки переместились на другие узлы.
Swarm не выполняет автобалансировку после создания контейнеров. Вы можете масштабировать вверх / вниз, когда все ваши воркеры будут включены, и он будет распределять контейнеры в соответствии с вашими требованиями конфигурации / ролями / и т. Д.
см. https://github.com/moby/moby/issues/24103
Возникают проблемы с "ограблением" новых узлов по мере их добавления. Мы также избегаем упреждения здоровыми задачами. Ребалансировка выполняется с течением времени, а не убивает рабочие процессы. На будущее рассматривается возможность преимущественной покупки.
В качестве обходного пути масштабирование службы вверх и вниз должно перебалансировать задачи. Вы также можете запустить непрерывное обновление, так как это приведет к изменению расписания новых задач.
Вот сценарий 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
В 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, чтобы заставить службу перераспределить свои задачи по доступным рабочим узлам.