Док рой с разнородными узлами: ограничить доступными ресурсами?

651
r2evans

В моем офисе работает небольшой док-рой: один 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 

Процесс работает индивидуально. Я не нашел указание веса присвоения или сродства на основе силы узла.

В идеале я бы хотел сказать что-то вроде этого:

  1. вступай в рой, занимай не больше nзадач (немного наивно)
  2. присоединяйся к рою, взвесь мою (cpu-) емкость как 0.2(или 5на более крупные)
  3. Запустите эту службу, назначьте не более одной задачи для каждого доступного ядра

Я сам регулирую общий масштаб сервиса docker service scale, но это не дает никакой детализации. Можно ли регулировать службы Docker Swarm для каждого узла доступными ресурсами?

(Это может быть еще большим стимулом для перехода на k8s, который, как я полагаю, обеспечивает функциональность в этом направлении. Есть трудности с обучением и переходом, который я усердно готовил.)

0

1 ответ на вопрос

1
Bret Fisher

Все это действительно возможно при создании или обновлении сервиса Swarm.

Это подпадает под опции «размещение контейнера» в этих командах. Если вас беспокоит только резервирование ресурсов, посмотрите на --reserve-cpuи --reserve-memory. Это будет гарантировать, что у узла будет свободная загрузка процессора или памяти на узле перед выполнением задач каждого контейнера.

Пример: если вам нужна служба swarm для развертывания двух реплик php, и каждая из них должна убедиться, что она находится на узле с 1 ГБ памяти и 1 ЦП, тогда service create --reserve-cpu 1 --reserve-memory 1GB phpпланируется только контейнеры на узлах, которые, как известно планировщику Swarm, имеют такое количество оборудования имеется в наличии. Если узел имеет только 2 логических ЦП, он никогда не развернет более 2 реплик этой службы на этом узле.

Существует множество других способов управления размещением задач, включая ограничение ЦП / памяти, «режим» (глобальный / замененный), сервисные ограничения (сопоставление меток), настройки размещения и доступность узла, но я упомяну, вероятно, ваш ответ. Bret Fisher 6 лет назад 0
Это было проще, чем я ожидал, не знаю, как я это пропустил. Спасибо, Брет! r2evans 6 лет назад 0
Будет ли другой вопрос, если вы предпочитаете: есть ли простой способ ограничить общее количество запущенных экземпляров? То есть «выполнить эту задачу 100 раз» (и распределить ее по разным гетерогенным работникам) «и затем остановить»? r2evans 6 лет назад 0
не встроен. Swarm предполагает, что Сервис работает долго. Два варианта: попытаться соединить что-то вместе с параметрами создания службы [поиск перезапуска] (https://docs.docker.com/engine/reference/commandline/service_create/), но обычно это не очень хороший опыт. Лучшим вариантом является проверка JaaS (Работа как услуга). Алекс Эллис https://github.com/alexellis/jaas, который работает поверх роя и может запускать одноразовые вещи. Bret Fisher 6 лет назад 0
Я подозревал столько же с роем (одна из причин, по которой k8s может быть привлекательной). Я еще не видел JaaS, проверю. Спасибо! r2evans 6 лет назад 0
Да, в Swarm есть встроенные функции, которых нет у K8, а у K8 - то же самое. Вот почему есть несколько успешных оркестровщиков (кочевник, мезос, рой, k8s и т. Д.) Bret Fisher 6 лет назад 0

Похожие вопросы