Основы работы с Docker Swarm

Docker Swarm — инструмент для создания кластеров из Docker-ов, иначе говоря — кластер из нескольких Docker-хостов, на каждом из которых запущен Docker Engine, обрабатывающий контейнеры Docker. “Извне” Docker Swarm выглядит также как “большой запущенный Docker”.

Начиная с версии 1.12, Docker Swarm включен по-умолчанию в “коробочную поставку” Docker-а. Рассмотрим поближе принципы работы с ним.

 

Все ноды Docker-а, работающего в режиме Swarm, могут работать как manager либо worker. На самом деле, кластер Docker Swarm может работать исключительно с manager-нодами, поскольку каждый manager способен выполнять задачи worker-а.
Один из менеджеров выступает как лидер кластера. Управляющие команды, которые приходят на другие менеджеры, автоматически передаются лидеру.

2bf780f4c52942d3b2bced39b0b5083d

Чтобы инициализировать кластер (“рой” — Swarm), в консоли его лидера нужно выполнить команду

docker swarm init

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

$ docker swarm join-token manager

To add a manager to this swarm, run the following command:

docker swarm join \

--token SWMTKN-1-1yptom678kg6hryfufjyv1ky7xc4tx73m8uu2vmzm1rb82fsas-c12oncaqr8heox5ed2jj50kjf \

172.28.128.3:2377

Рабочий узел в кластер добавляется командой:

$ docker swarm join-token worker

To add a worker to this swarm, run the following command:

docker swarm join \

--token SWMTKN-1-1yptom678kg6hryfufjyv1ky7xc4tx73m8uu2vmzm1rb82fsas-511vapm98iiz516oyf8j00alv \

172.28.128.3:2377

Рабочие и управляющие узлы могут добавляться к Docker Swarm в любой момент времени.

 

Создание Docker-сервиса похоже на создание Docker-контейнера:

docker service create --name nginx --publish 8080:80 --replicas 2 nginx:stable-alpine

 

У Docker-сервиса в Docker Swarm, относительно автономно запущенного контейнера, есть большое преимущество — при наличии хотя бы 2х реплик этого сервиса (с контейнером), его можно обновить без остановки и, соответственно, простоя для пользователей.

Обновление сервиса на примере добавления новой метки выглядит так (наглядный суффикс -add):

docker service update --label-add foo=bar nginx

Чтобы удалить 80й порт, нужно выполнить

docker service update --publish-rm 80 nginx

 

Балансировка нагрузки

 

Запросы пользователей в Docker Swarm распределяет между узлами кластеров механизм под названием ingress load balacing.

00829a98db20465d817750d67a940cc5

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

Чтобы изменить масштабируемость в Docker Swarm, необходимо изменить количество реплик для определенного сервиса (в примере — 3 реплики):

docker service update --replicas 3 nginx

Желательно, чтобы количество узлов при это было большим, чем количество реплик — в этом случае Docker Swarm будет выполнять реплики на разных узлах.

Для обеспечения отказоустойчивости кластера используется алгоритм Raft — любой из manager-узлов в любой момент времени может заменить leader-узел.

 

Узнать и изучить все нюансы Docker и Docker Swarm на практике и получить твердые знания и опыт вы можете на наших авторских курсах «L3-DevOps» и «L3-Virtualization«.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *