Развертывание сервисов режима Docker Swarm в нескольких отказоустойчивых доменах

Я новичок в режиме роя докеров (и я конкретно говорю о режиме роя в докере v1.12, и я не имею в виду более старый неинтегрированный «рой докеров»).

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

Мое понимание старого неинтегрированного роя докеров (не режима роя) заключается в том, что вы можете нацеливать узлы для развертывания в нескольких доменах отказа с помощью фильтров. Есть ли аналог в режиме Docker Swarm?

Например, в тестовой среде у меня есть 6 виртуальных машин — на всех работает докер.

Я запускаю ВМ 1 и 2 и называю их доменом отказа1
Я запускаю ВМ 3 и 4 и называю их доменом отказа2
Я запускаю ВМ 5 и 6 и называю их доменом отказа3

Все отказоустойчивые домены состоят из одного диспетчера роя и одного исполнителя роя. По сути, у меня есть 2 узла на домен, на которых могут размещаться сервисные контейнеры.

Я говорю докеру создать новую службу и запустить 3 контейнера на основе образа, содержащего простую веб-службу. Docker делает свое дело и запускает 3 контейнера, и моя служба работает; Я могу без проблем получить доступ к своему веб-сервису с балансировкой нагрузки. Ура!

Тем не менее, я хотел бы специально указать докеру распределить мои 3 контейнера по доменам1, домен2 и домен3.

Как я могу это сделать? (также - я пишу на правильном сайте - должно ли это быть на одном из других сайтов обмена стеками?)


person Jay    schedule 01.09.2016    source источник


Ответы (1)


Вы можете продолжать использовать метки двигателя, как и раньше. Или с новым роем вы можете определить метки узлов на узлах роя. Затем, с новым роем докеров, вы бы определили ограничение на свой сервис и создали 3 отдельных сервиса, каждый из которых должен работать в одном из ваших доменов отказа.

Для меток узлов вы должны использовать docker node update --label-add az=1 vm1, что добавит метку az1 к вашему vm1 узлу. Повторите этот процесс для других ваших AZ (зона доступности — это термин, который я обычно использую) и виртуальных машин.

Теперь при планировании своей работы вы добавляете ограничение, например

docker service create --constraint node.labels.az==1 \
  --name AppAZ1 yourimage

для метки узла или для метки двигателя:

docker service create --constraint engine.labels.az==1 \
  --name AppAZ1 yourimage

повторяя это для каждого из ваших AZ.

К сожалению, я не могу придумать способ принудительного распределения по каждой из AZ автоматически, когда вы используете что-то вроде --replicas 3, которое включает аварийное переключение на второй узел в каждом кластере vm. Однако, если вы выберете одну виртуальную машину на кластер для каждой задачи, вы можете пометить каждую из них одной и той же меткой (например, --label-add vm=a, а затем выполнить --mode global --constraint node.label.vm==a для запуска одной службы на каждом из ваших узлов A.

person BMitch    schedule 01.09.2016