docker swarm: create cluster (3 nodes)


Для начала необходимо обзавестись тремя хостами на которые мы установим docker. Это могут быть любые vds от хостинг/облачных провайдеров, к примеру digitalocean, hetzner…

На первом хосте включаем swarm режим:

docker swarm init
Swarm initialized: current node (mlpfbwwrei5r4ch8qa498kc21) is now a manager.

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

    docker swarm join --token SWMTKN-1-0iziu7wz2le08fplg4dcx6mos25a9d1dt04cn4qn0uih5yggwg-7da47fvhqgvqg3kgu3ekbemg0 ВАШ_IP_АДРЕС:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Смотрим:

docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
mlpfbwwrei5r4ch8qa498kc21 *   mainnode         Ready               Active              Leader              18.05.0-ce

Наш первый хост стал менеджером и имеет статус Leader.

Можно воспользоваться уже сгенерированным токеном для добавления ноды-воркер к нашму swarm кластеру, либо сгенерировать новый командой:

docker swarm join-token worker

если нужен токен для менеджера то команда соответственно:

docker swarm join-token manager

Заходим на второй хост и выполняем команду для доваления ноды-воркера в наш кластер:

docker swarm join --token SWMTKN-1-0iziu7wz2le08fplg4dcx6mos25a9d1dt04cn4qn0uih5yggwg-7da47fvhqgvqg3kgu3ekbemg0 ВАШ_IP_АДРЕС_ЛИДЕРА:2377
This node joined a swarm as a worker.

Воркеры имеют достаточно ограниченный набор команд.
К примеру docker node ls на воркере не работает.
Поэтому смотрим доступный список нод на менеджере:

docker node  ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
mlpfbwwrei5r4ch8qa498kc21 *   mainnode         Ready               Active              Leader              18.05.0-ce
rofzw0hfr3evnzhelhf5zpgl9     node1               Ready               Active                                  18.03.1-ce

MANAGER STATUS второго хоста пуст — это означает, что это воркер.

Сгенерируем токен для добваления третьего хоста,как менеджера:

docker swarm join-token manager

Выполним команду на третьем хосте:

docker swarm join --token SWMTKN-1-0iziu7wz2le08fplg4dcx6mos25a9d1dt04cn4qn0uih5yggwg-9mlvlkgine3jodt142bebs3vw ВАШ_IP_АДРЕС_ЛИДЕРА:2377
This node joined a swarm as a manager.

На этом же хосте смотрим список нод:

docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
mlpfbwwrei5r4ch8qa498kc21     mainnode         Ready               Active              Leader              18.05.0-ce
rofzw0hfr3evnzhelhf5zpgl9     node1               Ready               Active                                  18.03.1-ce
vx1zxdobvg4cd7qljr4snv4kg *   node2               Ready               Active              Reachable           18.03.1-ce

Обратите внимание, что node2 в поле MANAGER STATUS имеет статус Reachable.

Чтобы менять роли нод можно использовать слежующие команды:
Меняем роль на менеджера:

docker node update --role manager ИМЯ/ID_ноды
или
docker node promote ИМЯ/ID_ноды

Меняем роль на воркера:

docker node update --role worker ИМЯ/ID_ноды
или
docker node demote ИМЯ/ID_ноды

Поменяем роль нашего воркера на менеджера, на любом из менеджеров выполяем команду:

docker node update --role manager node1

Смортим теперь:

docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
mlpfbwwrei5r4ch8qa498kc21     mainnode         Ready               Active              Leader              18.05.0-ce
rofzw0hfr3evnzhelhf5zpgl9     node1               Ready               Active              Reachable           18.03.1-ce
vx1zxdobvg4cd7qljr4snv4kg *   node2               Ready               Active              Reachable           18.03.1-ce

В качестве примера запустим сервис с тремя репликами

docker service create --replicas 3 alpine ping -n 1.1.1.1

Проверяем:
docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
ax21nfpyhir2        adoring_johnson     replicated          3/3                 alpine:latest       
Видим все наши три реплики запущены и работают - REPLICAS 3/3

Смотрим где запущены таски сервиса:
docker service ps adoring_johnson
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
nukma6nyypd3        adoring_johnson.1   alpine:latest       node2               Running             Running 4 minutes ago                       
rgdzw1uv7s4x        adoring_johnson.2   alpine:latest       mainnode         Running             Running 4 minutes ago                       
lvii53oo5ko7        adoring_johnson.3   alpine:latest       node1               Running             Running 5 minutes ago

Смотрим таски на отдельной ноде:
docker node ps node1
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
lvii53oo5ko7        adoring_johnson.3   alpine:latest       node1               Running             Running 6 minutes ago                       

docker node ps node2
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
nukma6nyypd3        adoring_johnson.1   alpine:latest       node2               Running             Running 6 minutes ago                       

Существует два типа развертывания служб:
replicated — для данного типа самостоятельно указывается число запускаемых реплик/тасков
global — при данном типе развертывания сервисов на каждой ноде swarm кластера запускается по одному экземпляру реплики/таска. При добавлении новой ноды в кластер, на нём автоматически будет запускаться реплика/таск сервиса. Пример таких сервисов — агенты мониторинга, антивирусы.

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

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