Докерский рой с разнородными узлами: лимит по доступным ресурсам?
В моем офисе работает небольшой док-рой: один 40-ядерный (128 ГБ ОЗУ) и два 8-ядерных (16 ГБ ОЗУ каждый). Когда я развертываю службу в рое, задания выполняются, но они распределяются равномерно, независимо от емкости каждой машины.
Я начал рой на менеджера с:
docker swarm init
docker swarm update --task-history-limit 2
и на каждом узле:
docker swarm join --token <token-string> <ipaddr:port>
Затем я начинаю службу с:
docker service create --detach \
--mount type=bind,src=/s/mypath,dst=/home/mypath \
--entrypoint "/home/mypath/myscript.sh arg1 arg2" \
--name "mystuff" -w /home/mypath myregistry.me.com:5433/myimage
Процесс работает индивидуально. Я не нашел указаний на вес присваивания или сходство, основанное на силе узла.
В идеале я бы хотел сказать что-то вроде этого:
- присоединяйся к рое, возьми не более
n
задачи (немного наивно) - присоединяйся к рою, веси мою (cpu-) мощность как
0.2
(или же5
на более крупные) - Запустите эту службу, назначьте не более одной задачи для каждого доступного ядра
Я саморегулируем общий масштаб обслуживания с docker service scale
, но это не обеспечивает никакой детализации. Можно ли регулировать службы Docker Swarm для каждого узла доступными ресурсами?
(Это может быть еще большим стимулом для перехода на k8s, который, как я полагаю, обеспечивает функциональность в этом направлении. Есть трудности с обучением и переходом, который я усердно готовил.)
1 ответ
Все это действительно возможно при создании или обновлении сервиса Swarm.
Это подпадает под опции "размещение контейнера" в этих командах. Если вас беспокоит только резервирование ресурсов, тогда посмотрите на --reserve-cpu
а также --reserve-memory
, Это обеспечит наличие у узла свободного процессора или памяти на узле перед выполнением задач каждого контейнера.
Пример: если вам нужен сервис swarm для развертывания двух реплик php, и каждый из них должен убедиться, что он находится на узле с 1 ГБ памяти и 1 ЦП, тогда service create --reserve-cpu 1 --reserve-memory 1GB php
будет только планировать контейнеры на узлах, которые, как знает планировщик Swarm, имеют такое количество доступного оборудования. Если узел имеет только 2 логических ЦП, он никогда не развернет более 2 реплик этой службы на этом узле.