Docker swarm запускает задачи только в воркерах

Допустим, мы работаем в режиме роя и у нас есть три узла:

  • менеджер1
  • рабочий1
  • рабочий2

Можно ли создать службу и указать, что задачи должны выполняться только у рабочих (worker1 и worker2), а не у менеджеров (manager1)

Я запускаю следующую команду для создания службы:

docker-machine ssh manager1 "docker service create --network dognet --name dog-db redis"

и когда я обслуживаю службу:

docker-machine ssh manager1 "docker service ps dog-db"

Я получил:

ID                         NAME      IMAGE  NODE      DESIRED STATE  CURRENT STATE            ERROR
3kvfpbhl6fj0qwtglc5k7sbkw  dog-db.1  redis  manager1  Running        Preparing 4 seconds ago  

person niqui    schedule 25.11.2016    source источник


Ответы (2)


Хотя вы можете использовать ограничения--constraint node.role=worker) для устранения подмножества узлов в зависимости от их роли (менеджера или работника), я бы дошел до отключения менеджера(ов) от действия как Работник(и) с:

# Disables the Manager as a Worker node

docker node update --availability drain manager1

Идея состоит в том, что диспетчер должен быть защищен от перегрузки ресурсов (ЦП, ОЗУ, fds), которая может произойти, если ресурсы, используемые развернутыми службами, превышают ресурсы, доступные в диспетчере. Это может вызвать сценарий каскадного отказа, и кластер может стать крайне нестабильным (или перестать отвечать на запросы).

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

Связанные вопросы:

Источник: я был сопровождающим Docker Swarm и написал Руководство по администрированию для режима Swarm.

person abronan    schedule 25.11.2016
comment
Это прекрасно работает, чтобы мои сервисы развертывались только на рабочих узлах, никаких ограничений не требуется! - person Cotton; 18.08.2017
comment
Он пропустит назначение какой-либо задачи диспетчеру роя. Но я хочу управлять своим роем с помощью Portainer, который можно использовать для управления менеджером роя. Это также не позволит развернуть portainer. - person Nitul; 21.11.2017
comment
Если вы используете --contraint, обратите внимание, что это должно быть node.role==worker, а не только node.role=worker. - person TJ Biddle; 14.05.2020

Да, вы можете ограничить службу на основе роли узла. Измените свою команду на:

docker service create --network dognet --constraint node.role==worker --name dog-db redis

person johnharris85    schedule 25.11.2016
comment
Хотя мой способ работает нормально, теперь я предпочитаю ответ Абронана. - person johnharris85; 10.01.2018