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

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

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

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

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

manager1: 192.168.56.104

worker1: 192.168.56.105

worker2: 192.168.56.102
Чтобы инициализировать режим Swarm в Docker, выполните команду, показанную ниже на узле менеджера.
Флаг –advertise-addr используется для добавления самого узла, который может присоединиться к кластеру.
itisgood@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.
Приведенная выше команда сгенерирует токен, который будет использоваться другими узлами для присоединения к этому кластеру.
Скопируйте команду с созданным токеном и запустите ее на рабочих узлах.
itisgood@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377

This node joined a swarm as a worker.

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

itisgood@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377

This node joined a swarm as a worker.
Теперь на узле менеджера вы можете проверить, какие узлы работают в кластере.
itisgood@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        
Давайте создадим образ докера geekflare_mongodb, который мы использовали в Учебном пособии по Dockerfile:
docker build -t geekflare_mongodb .
Запустите контейнер образа Docker MongoDB, используя службу Swarm.
27017 – это номер порта, на котором работает MongoDB.
itisgood@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 Sworm.
MODE replicated означает, что контейнер был реплицирован на все узлы кластера, а REPLICAS 1/1 означает, что в настоящий момент работает только одна служба Swarm.
itisgood@manager1:~$ docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                      PORTS

kok58xa4zi05        Mongo-Container     replicated          1/1                 geekflare_mongodb:latest   *:27017->27017/tcp
Давайте проверим, на каком узле в кластере работает этот единственный сервис. Он работает на узле manager1.
itisgood@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.
itisgood@manager1:~$ docker ps

CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS               NAMES

05d77e7b4850        geekflare_mongodb:latest   "/bin/sh -c usr/bin/…"   2 minutes ago 
Вы можете запустить службу Swarm в режиме “global”  вместо режима «default»

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

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

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

Mongo-Container
Запустите службу swarm внутри докер-контейнера в режиме global, используя флаг –mode.
itisood@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 manager, 2 worker), поэтому количество реплик равно 3.
itisgood@manager1:~$ docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                      PORTS

mfw8dp0zylff        Mongo-Container     global              3/3                 geekflare_mongodb:latest   *:27017->27017/tcp
3 службы теперь работают на 3 узлах, проверьте это, выполнив приведенную ниже команду.
itisgood@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
Далее позвольте мне показать, как вы можете определить количество реплик.
Перед этим я удалю текущий контейнер, который работает.
itisgood@manager1:~$ docker service rm Mongo-Container

Mongo-Container
Используйте флаг –replicas в команде и укажите количество реплик, которые вы хотите использовать.
Например, я хочу иметь две копии службы swarm:
itisgood@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
Проверьте сервисы Swarm, в настоящее время работающие.
Вы можете видеть, что одна реплика работает на узле manager1, а другая – на узле worker1.
itisgood@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 
Перейдите на узел worker1 и проверьте, работает ли в док-контейнере служба swarm.
itisgood@worker1:~$ docker ps

CONTAINER ID        IMAGE                      COMMAND                  CREATED              STATUS              PORTS               NAMES

5042b7f161cb        geekflare_mongodb:latest   "/bin/sh -c usr/bin/…"   About a minute ago
Чтобы остановить этот контейнер, выполните команду приведенную ниже.
itisgood@worker1:~$ docker stop 5042b7f161cb

5042b7f161cb
Теперь с узла manager1, если вы проверите, на каких узлах запущена служба, вы увидите, что она работает на узле manager1 и worker2.

CURRENT STATE узла worker1 – это завершение работы (так как мы остановили контейнер, на котором запущен сервис). Но так как для этой службы должны работать две реплики, на worker 2 была запущена другая служба.

Вот как вы достигаете высокой доступности с помощью Docker Swarm.

itisgood@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   
Очень легко масштабировать докер контейнеры.
Команда, показанная ниже увеличит контейнер Монго до 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
Проверьте, сколько реплик контейнера mongo запущено сейчас, должно быть 5.
itsigood@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 реплики на обоих нодах worker.

itisgood@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     
В вашем кластере, если вы не хотите, чтобы ваши службы работали на узлах manager, и хотите, чтобы они оставались только для управления узлами, вы можете исключить узел manager.
itisgood@manager1:~$ docker node update --availability drain manager1

manager1
Проверьте доступность узла manager.
it@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         
Вы увидите, что сервисы больше не работают на узле manager; они распределены по узлам workers в кластере.
itisgood@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           
Пока это все о Docker Swarm и о том, как организовать контейнеры в режиме Docker Swarm.
Попробуйте это в своей непроизводственной среде, чтобы понять, как это работает.

You may also like

Leave a Comment