Создание кластера контейнеров Docker с помощью Docker Swarm в Ubuntu 16.04

Docker Swarm – это средство для развертывания кластера хостов Docker. Вы можете использовать его для быстрого развертывания кластера хостов на вашем локальном компьютере, либо на поддерживаемых облачных платформах.

До Docker 1.12 для настройки и развертывания кластера Docker и для обнаружения сервисов необходимо было использовать внешнее хранилище типа «ключ-значение», например, etcd или Consul. Однако благодаря Docker 1.12 внешние средства обнаружения больше не нужны, поскольку Docker из коробки поставляется с хранилищем «ключ-значение».

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

Требования

  • Локальная машина с предустановленной платформой Docker. Локальная машина может использовать один из дистрибутивов Linux или же Windows или macOS. Установить Docker на Windows или macOS вам поможет официальный инсталлятор. Если на локальной машине используется Ubuntu 16.04, установить Docker вам поможет мануал Установка и использование Docker в Ubuntu 16.04.
  • API-токен хостинга (read-write).
  • Docker Machine на локальном компьютере. Для Windows и macOS официальный инсталлятор по умолчанию устанавливает Docker Machine вместе с Docker. Чтобы установить Docker Machine на локальную машину Ubuntu 16.04, читайте мануал Управление удалёнными хостами Docker с помощью Docker Machine в Ubuntu 16.04.

1: Оркестровка нод

Создайте несколько нод Docker для кластера. Чтобы следовать примерам в мануале, вам понадобится 3 ноды.

Когда машины будут созданы, убедитесь, что все прошло успешно:

docker-machine ls

Команда вернет список доступных нод:

NAME     ACTIVE   DRIVER         STATE     URL                          SWARM   DOCKER    ERRORS
node-1   -        my-provider   Running   tcp://111.111.111.111:2376             v1.12.2
node-2   -        my-provider   Running   tcp://111.111.111.112:2376             v1.12.2
node-3   -        my-provider   Running   tcp://111.111.222.222:2376             v1.12.2

На каждой ноде должен быть Docker 1.12.x. пока что ноды еще не собраны в кластер. Далее нужно настроить правила брандмауэра, которые заставят ноды функционировать как единый кластер, выбрать одну из нод и сделать ее менеджером Docker Swarm и настроить остальные ноды как рабочие.

2: Настройка брандмауэра

Кластер должен иметь хотя бы одну ноду, которая работает в качестве менеджера.

Примечание: Для среды производства рекомендуется три менеджера.

Для этой настройки выделите первую ноду и сделайте ее менеджером Swarm. Другие две ноды станут рабочими.

На нодах, которые будут частью кластера, нужно открыть определенные сетевые порты. Для этого нужно изменить настройки брандмауэра. Поскольку для выполнения этой задачи можно использовать три разных приложения брандмауэра, все необходимые команды описаны в отдельной статье, Настройка брандмауэра Linux для Docker Swarm в Ubuntu 16.04. Повторите этот мануал и на двух рабочих нодах.

3: Инициализация менеджера кластера

Предположим, node-1 будет менеджером кластера; войдите на ноду с локального компьютера:

docker-machine ssh node-1

Командная строка изменится и вы увидите, что подключились к нужной ноде. Чтобы сделать ноду менеджером Swarm, введите:

docker swarm init --advertise-addr node_ip_address

Примечание: Вместо node_ip_address укажите IP-адрес вашей ноды.

Вы увидите такой вывод:

Swarm initialized: current node (a35hhzdzf4g95w0op85tqlow1) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3k7ighcfs9352hmdfzh31t297fd8tdskg6x6oi8kpzzszznffx-6kovxm3akca2qe3uaxtu07fj3 \
111.111.111.111:2377

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

В выводе вы найдете ID ноды (a35hhzdzf4g95w0op85tqlow1 в этом примере) и инструкции, как добавить другие ноды в кластер.

Итак, теперь у вас есть менеджер Docker Swarm. Настройте остальные ноды.

4: Добавление нод в кластер

На этом этапе можно открыть другой терминал и оставить вкладку или окно терминала, с помощью которого вы раньше подключились к менеджеру Swarm.

Сначала подключитесь к node-2 с локальной машины:

docker-machine ssh node-2

Затем выполните эту команду, где your_swarm_token – это токен, который вы получили при создании кластера, а manager_node_ip_address – это IP-адрес менеджера Swarm.

docker swarm join \
--token your_swarm_token \
manager_node_ip_address:2377

Если команда выполнена успешно, вы увидите:

This node joined a swarm as a worker.

Выйдите с node-2 и повторите этот раздел на ноде node-3.

Итак, вы добавили в кластер две рабочие ноды. Если брандмауэр настроен правильно, теперь у вас есть функционирующий кластер Docker Swarm, где все ноды синхронизированы.

5: Управление кластером

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

docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
2qhg0krj00i4d3as2gpb0iqer    node-2    Ready   Active
6yqh4bjki46p5uvxdw6d53gc0    node-3    Ready   Active
a35hhzdzf4g95w0op85tqlow1 *  node-1    Ready   Active        Leader

Согласно выводу, в кластере Docker Swarm есть 3 ноды – один менеджер и две рабочие ноды. Чтобы просмотреть список доступных команд для управления кластером, введите:

docker node --help

Для получения подробной информации о кластере вы можете использовать следующую команду (это общая команда Docker, ее можно запускать на менеджере или на рабочих нодах):

docker info

Команда сообщает статус кластера (active или pending), количество нод в кластере и роль ноды, с которой она запущена (менеджер или рабочая нода).

...
Network: bridge host null overlay
Swarm: active
NodeID: a35hhzdzf4g95w0op85tqlow1
Is Manager: true
ClusterID: f45u0lh7ag4qsl4o56yfbls31
Managers: 1
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Node Address: 104.236.239.4
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
...

Если вы запустите эту команду на рабочих нодах, строка Is Manager будет показывать false.

Примечание: Вы можете добавлять или удалять ноды из кластера в любое время. Кроме того, вы можете менять роли нод: сделать рабочую ноду менеджером и наоборот.

6: Запуск сервиса в кластере Docker Swarm

Теперь, когда у вас есть запущенный кластер Docker Swarm и запущен, попробуйте запустить тестовый контейнер и посмотрите, как менеджер справится с этой задачей. На машинах Docker Engine 1.12+ контейнеры развертываются как сервисы с помощью команды docker service. Подобно команде docker node, команда docker service может выполняться только на ноде-менеджере.

Итак, для примера разверните сервис веб-сервера, используя официальный образ контейнера Nginx:

docker service create -p 80:80 --name webserver nginx

Эта команда соединяет порт 80 в контейнере Nginx с портом 80 кластера, благодаря чему вы можете получить доступ к приветственной странице Nginx из любой точки.

Чтобы убедиться, что сервисы работают, введите:

docker service ls

Команда должна вернуть такой вывод. Столбец REPLICAS показывает, сколько экземпляров сервиса запущено:

ID            NAME       REPLICAS  IMAGE  COMMAND
0ymctkanhtc1  webserver  1/1       nginx

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

docker service ps webserver
ID                         NAME         IMAGE         NODE    DESIRED STATE  CURRENT STATE                ERROR

39yprxsaaekuif951cl0o4wau  webserver.1  nginx         node-1  Running        Running 7 hours ago

В этом примере сервис webserver работает на node-1. Поскольку веб-сервер запущен на портах по умолчанию, вы можете получить к нему доступ в браузере по ссылке http://node-1_ip_address. Вы увидите страницу Nginx по умолчанию.

Благодаря ячеистой топологии доступ к сервису, запущенному на одной ноде, можно получить на любой другой ноды кластера. Например, доступ к сервису Nginx можно также получить, указав в браузере IP-адрес любой другой ноды.

Еще одна особенность Docker Swarm – это возможность масштабирования сервиса, то есть разворачивания его дополнительных экземпляров. Предположим, что вам нужно масштабировать сервис webserver до пяти экземпляров. Для этого просто введите следующую команду, и система создаст еще четыре экземпляра:

docker service scale webserver=5

Введите команду docker service ps, и вы увидите, на каких нодах запущены новые экземпляры сервиса:

ID                         NAME         IMAGE  NODE    DESIRED STATE  CURRENT STATE               ERROR

39yprxsaaekuif951cl0o4wau  webserver.1      nginx  node-1  Running        Running 8 hours ago


1er2rbrnj6ltanoe47mb653wf  webserver.2      nginx  node-3  Running        Running 14 seconds ago


evassgyvruh256ebv5pj3bqcz  webserver.3      nginx  node-3  Running        Running 14 seconds ago


d453agrdpgng47klbl6yfjnka  webserver.4      nginx  node-1  Running        Running 18 seconds ago


2hsdevx178rg15gqxhzrsnmg6  webserver.5      nginx  node-2  Running        Running 14 seconds ago

Вывод показывает, что два из четырех новых экземпляров были запущены на node-3, один был запущен на node-1, а другой – на node-2.

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

Заключение

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

docker swarm --help

Для получения дополнительной информации о Docker Swarm посетите страницу официальной документации. Другие наши мануалы по Docker можно найти здесь.

Tags: , , ,

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