Можно ли удалить задачу в Docker (Docker Swarm)? - PullRequest
0 голосов
/ 29 августа 2018

Предположим, у меня было 3 реплицированных изображения:

docker service create --name redis-replica --replicas=3 redis:3.0.6

Учтите, что подключены два узла (включая диспетчер), и при запуске команды docker service ps redis-replica выдается следующее:

ID                  NAME                  IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
x1uumhz9or71        redis-replica.1       redis:3.0.6         worker-vm            Running             Running 9 minutes ago                        
j4xk9inr2mms        redis-replica.2       redis:3.0.6         manager-vm       Running             Running 8 minutes ago                                    
ud4dxbxzjsx4        redis-replica.3       redis:3.0.6         worker-vm       Running             Running 9 minutes ago  

Как видите, все задачи выполняются.

У меня есть сценарий, который я хочу исправить:

Предположим, я хочу удалить контейнер redis на worker-vm. В настоящее время их два, но я хочу сделать это одним.

Я мог бы сделать это, войдя в worker-vm, удалив контейнер на docker rm. Это создает проблему, однако:

Как только рой докер увидит, что одна из задач завершилась, он немедленно выплюнет другое изображение redis на другой узел (менеджер или работник). В результате у меня всегда будет 3 задания.

Это не то, что я хочу. Предположим, я хочу заставить docker не перезагружать другое изображение, если оно удалено.

Возможно ли это в настоящее время?

1 Ответ

0 голосов
/ 30 августа 2018

В режиме Swarm, это оркестратор, который планирует задачи для вас. Задача - это единица планирования, и каждая задача вызывает ровно один контейнер.

На практике это означает, что вы не должны управлять задачами вручную. Рой позаботится об этом за вас.

Вам нужно описать желаемое состояние вашего сервиса, если у вас есть настройки размещения, вы можете использовать команды --placement-pref, в docker service. Вы можете указать количество реплик и т. Д. Например,

docker service create \
  --replicas 9 \
  --name redis_2 \
  --placement-pref 'spread=node.labels.datacenter' \
  redis:3.0.6

Вы можете ограничить набор узлов, в которые будет помещена задача, используя ограничения размещения (https://docs.docker.com/engine/reference/commandline/service_create/#specify-service-constraints---constraint. Вот пример из документации Docker:

$ docker service create \
  --name redis_2 \
  --constraint 'node.labels.type == queue' \
  redis:3.0.6

Я думаю, что это самое близкое решение для управления задачами.

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

Если вы измените фактическое состояние, например, убив контейнер, Swarm перенастроит состояние вашего сервиса, чтобы оно снова соответствовало вашему желаемому состоянию. Это то, что произошло, когда вы удалили свой контейнер.

Чтобы изменить желаемое состояние, вы можете использовать команду docker service update.

Ключевым моментом является то, что задачи не равны контейнерам. Технически они вызывают ровно один контейнер, но они не равны. Задача похожа на слот планирования, в который планировщик помещает контейнер.

Планировщик Swarm управляет задачами (не вы), поэтому нет такой команды, как docker task. Вы управляете механизмом, описывая желаемое состояние.

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

...