Docker Swarm для оркестрации контейнеров

Опубликовано: 2019-08-08

Все о Docker Swarm и о том, как он управляет и организует все контейнеры в кластере.

Что такое Docker Swarm?

Docker swarm — это режим работы с кластером Docker Engines, отсюда и название Swarm. Кластер хостов Docker работает в режиме роя, состоящего из менеджеров и рабочих. Экземпляры движка докеров, которые участвуют в рое, называются узлами.

Развертывание роя на производственном уровне состоит из док-узлов, разбросанных по нескольким серверам.

Зачем это использовать? – Контейнерная оркестровка

Когда вы работаете в производственной среде, сотни контейнеров Docker будут запускать в ней несколько приложений. Управление всеми этими контейнерами может стать большой проблемой для всех инженеров DevOps; здесь вам поможет Docker Swarm. Он с легкостью управляет и организует кластер, на котором запущено несколько контейнеров Docker.

Ниже приведены некоторые из его особенностей:

  • Высокая доступность — направлена ​​на отсутствие простоев или простоев.
  • Балансировка нагрузки — автоматически распределяйте ресурсы и запросы на других узлах в кластере, если какой-либо узел выходит из строя.
  • Децентрализованный — несколько управляющих узлов работают в производственной среде; следовательно, кластер никогда не зависит от одного управляющего узла.
  • Масштабируемость — с помощью одной команды docker swarm вы можете легко увеличивать или уменьшать масштаб контейнеров в кластере.

Оркестрация контейнеров Docker

Теперь, когда вы знаете основы Docker Swarm, давайте рассмотрим пример его реализации.

В этом примере у меня есть три машины, работающие в кластере со следующими подробностями:

 manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102

Чтобы инициализировать режим роя в докере, выполните приведенную ниже команду на узле менеджера. Флаг --advertise-addr используется для объявления себя узлам, которые могут присоединиться к кластеру.

 geekflare@manager1:~$ docker swarm init --advertise-addr 192.168.56.104 Swarm initialized: current node (lssbyfzuiuh3sye1on63eyixf) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

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

Запуск токена на узле worker1.

 geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.

Запуск токена на узле worker2.

 geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.

Теперь на узле менеджера вы можете проверить, какие узлы работают в кластере.

 geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6

Давайте создадим образ докера geekflare_mongodb , который мы использовали в Dockerfile Tutorial.

 docker build -t geekflare_mongodb .

Запустите контейнер образа докера MongoDB, создав службу swarm. 27017 — это номер порта, на котором открыт доступ к MongoDB.

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. kok58xa4zi05psh3uy6s5x9e6 overall progress: 1 out of 1 tasks 1/1: running verify: Service converged

Проверьте, запущена ли служба docker swarm. MODE replicated означает, что контейнер был реплицирован на все узлы в кластере, а REPLICAS 1/1 означает, что в настоящее время работает только одна служба swarm.

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp

Давайте проверим, на каком узле в кластере работает этот единственный сервис. Он работает на узле manager1.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running Running about a minute ago

Запустите команду docker ps, чтобы получить более подробную информацию о контейнере, в котором запущена эта служба swarm.

 geekflare@manager1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05d77e7b4850 geekflare_mongodb:latest "/bin/sh -c usr/bin/…" 2 minutes ago Up 2 minutes 27017/tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx

Вы также можете запустить службу swarm в «глобальном» режиме вместо стандартного «реплицированного» режима. Глобальный режим запускает одну задачу службы swarm на всех узлах кластера.

Прежде чем запускать службу в глобальном режиме, позвольте мне удалить существующий работающий контейнер.

 geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container

Запустите службу swarm внутри док-контейнера в глобальном режиме, используя флаг –mode.

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. mfw8dp0zylffppkllkcjl8391 overall progress: 3 out of 3 tasks utdr3dnngqf1: running lssbyfzuiuh3: running xs6jqp95lw4c: running verify: Service converged

Проверьте, запущен ли сервис swarm в глобальном режиме. Так как в кластере работают три узла (1 управляющий, 2 рабочих), то количество реплик равно 3.

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017/tcp

Сейчас на 3 узлах запущено 3 службы, проверьте это, выполнив приведенную ниже команду.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running Running about a minute ago 3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1 Running Running about a minute ago yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running Running about a minute ago

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

 geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container

Используйте флаг –replicas в команде и укажите необходимое количество реплик службы swarm. Например, я хочу иметь две реплики службы роя:

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. 4yfl41n7sfak65p6zqwwjq82c overall progress: 2 out of 2 tasks 1/2: running 2/2: running verify: Service converged

Проверьте запущенные в данный момент сервисы роя. Вы можете видеть, что одна реплика работает на узле manager1, а другая — на узле worker1.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running Running 9 seconds ago e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 9 seconds ago

Перейдите к узлу worker1 и проверьте, работает ли в док-контейнере служба swarm.

 geekflare@worker1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5042b7f161cb geekflare_mongodb:latest "/bin/sh -c usr/bin/…" About a minute ago Up About a minute 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv

Чтобы остановить этот контейнер, выполните команду ниже.

 geekflare@worker1:~$ docker stop 5042b7f161cb 5042b7f161cb

Теперь из узла manager1, если вы проверите, на каких узлах запущена служба, вы увидите, что она работает на узле manager1 и узле worker2. ТЕКУЩЕЕ СОСТОЯНИЕ узла worker1 — Shutdown (поскольку мы остановили контейнер, на котором запущена служба). Но так как этой службы должны работать две реплики, на воркере 2 была запущена другая служба.

Вот как вы достигаете высокой доступности, используя docker swarm.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 30 seconds ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 38 seconds ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 3 minutes ago

Докер-контейнеры очень легко увеличивать или уменьшать. Приведенная ниже команда увеличит контейнер монго до 5.

 geekflare@manager1:~$ docker service scale Mongo-Container=5 Mongo-Container scaled to 5 overall progress: 5 out of 5 tasks 1/5: running 2/5: running 3/5: running 4/5: running 5/5: running verify: Service converged

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

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp

Проверьте, где в кластере работают эти 5 реплик. 1 реплика работает на узле manager1 и 2 реплики на обоих рабочих узлах.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 2 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 2 minutes ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 5 minutes ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 47 seconds ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 46 seconds ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 44 seconds ago

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

 geekflare@manager1:~$ docker node update --availability drain manager1 manager1

Проверьте доступность управляющего узла.

 geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6

Вы увидите, что службы больше не работают на узле менеджера; они распределены по рабочим узлам в кластере.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 5 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 5 minutes ago "task: non-zero exit (137)" qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running Running 41 seconds ago e66zllm0foc8 \_ Mongo-Container.2 geekflare_mongodb:latest manager1 Shutdown Shutdown 44 seconds ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 3 minutes ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 3 minutes ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 3 minutes ago

Это было все о Docker Swarm и о том, как организовать контейнеры в режиме docker swarm. Попробуйте их в своей непроизводственной среде, чтобы получить представление о том, как это работает.