Настройка кластера Docker Swarm на Linux

Начиная с версии Docker 1.12.0, Docker Swarm был включен в движок Docker. Это значит, что для сборки кластера с контейнерами Docker нам не потребуются дополнительные средства и необходимые действия можно сделать не прибегая к установке других пакетов. Рассмотрим процесс подробнее. Мы будем работать на системе Linux.
Предварительная настройка
Инициализация кластера на хосте управления
Подключение к кластеру воркеров
Создание стека с сервисами
Пример полезных команд
Читайте также
Подготовка
Предварительно выполним несколько действий.
1. Установка Docker
Для начала работы достаточно установленного Docker Engine. Ниже на этой странице можно найти ссылку на подробную инструкцию, как это сделать.
2. Настройка DNS или hosts
Наши узлы должны видеть друг друга по имени. Для этого необходимо создать записи во внутреннем DNS или на каждом сервере открыть файл hosts:
vi /etc/hosts
И добавить записи такого вида:
192.168.100.12 manager
192.168.100.13 worker01
192.168.100.14 worker02
* предполагается, что мы разворачиваем кластер из трех серверов:
- 192.168.100.12 — управляющая нода. Имя manager.
- 192.168.100.13 — первая рабочая нода для размещения контейнеров.
- 192.168.100.14 — вторая рабочая нода.
Для продуктивной среды лучше не использовать файл hosts — при росте числа нод в кластере процесс управления будет становиться сложнее и менее удобным.
3. Настройка брандмауэра
На всех узлах кластера открываем следующие порты:
iptables -I INPUT -p tcp --dport 2376 -j ACCEPT
iptables -I INPUT -p tcp --dport 7946 -j ACCEPT
iptables -I INPUT -p udp --dport 7946 -j ACCEPT
iptables -I INPUT -p udp --dport 4789 -j ACCEPT
Дополнительно на менеджере открываем порт 2377:
iptables -I INPUT -p tcp --dport 2377 -j ACCEPT
* рассмотрим подробнее, за что они отвечают:
- 2376 — взаимодействие клиентов Docker, оркестровка хостов Docker.
- 7946 — для связи между нодами (обнаружение сети контейнера).
- 4789 — полезные данные, которые передаются по сети Docker.
- 2377 — для взаимодействия нод кластера Docker Swarm с управляющим узлом.
Настройка менеджера
На сервере, который будет выступать в роли менеджера вводим команду:
docker swarm init --advertise-addr 192.168.100.12
* где 192.168.100.12 — IP-адрес нашего сервера менеджера.
Команда отработает, довольно, быстро. Мы должны увидеть что-то на подобие:
Swarm initialized: current node (rl5gu1oysyqzjfh3h44cfpscv) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3r0wk9gxu2c3ttr0fjkp3c83qhfwt97h6doqx8n79a7yp1etlq-8vjglkkqmfdqmudi28qhm4k35 192.168.100.12:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Наш кластер создан. Токен для подключения новых нод SWMTKN-1-3r0wk9gxu2c3ttr0fjkp3c83qhfwt97h6doqx8n79a7yp1etlq-8vjglkkqmfdqmudi28qhm4k35. Его нужно скопировать и сохранить.
Настройка воркеров
После инициализации менеджера мы увидели команду для присоединения к кластеру нод. Введем ее на наших воркерах:
docker swarm join --token SWMTKN-1-3r0wk9gxu2c3ttr0fjkp3c83qhfwt97h6doqx8n79a7yp1etlq-8vjglkkqmfdqmudi28qhm4k35 192.168.100.12:2377
* где 192.168.100.12 — IP-адрес нашего сервера менеджера.
Мы должны увидеть:
This node joined a swarm as a worker.
Готово — кластер полностью настроен.
Смотрим состояние хостов:
docker node ls
Проверяем, чтобы STATUS был Ready и AVAILABILITY Active:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
rl5gu1zjfh3h44cfpscv * manager Ready Active Leader
42pae4wzqodipone24o5 worker01 Ready Active
jndx3jrbz7hyj7n16iaz worker02 Ready Active
Запуск сервисов
Давайте попробуем запустить веб-сервер nginx на нашем кластере. Для этого подготовим файл docker-compose с необходимым описанием состояния сервиса.
Для начала, создадим каталог, где будет храниться файл:
mkdir /opt/my_web
Создаем в нем docker-compose:
vi /opt/my_web/docker-compose.yml
version: "3.9"
services:
web_nginx:
image: nginx
container_name: web_nginx
hostname: web_nginx
restart: unless-stopped
environment:
TZ: "Europe/Moscow"
ports:
- 80:80
* в данном примере мы написали небольшое описание запуска сервиса на базе nginx. Подробнее про работу с docker-compose рассказано в одной из инструкций ниже на странице.
Запустим stack (набор контейнеров для осуществления сервиса) с применением файла compose:
docker stack deploy -c /opt/my_web/docker-compose.yml my_web
Мы должны увидеть что-то на подобие:
Creating network my_web_default
Creating service my_web_web_nginx
Посмотреть список запущенных стеков можно командой (запускаем на manager node):
docker stack ls
Мы увидим что-то на подобие:
NAME SERVICES ORCHESTRATOR
my_web 15 Swarm
Список запущенных в стеке сервисов можно получить командой:
docker stack services my_web
Полезные команды
Рассмотрим некоторые полезные команды по работе с Docker Swarm.
1. Удаление стека:
docker stack rm my_web
2. Просмотр журнала для конкретного сервиса:
docker service logs my_web_carts
3. Обновить деплой для конкретного сервиса:
docker service update my_web_carts
Читайте также
Другая полезная информация по теме:
2. Установка и настройка кластера Kubernetes на Ubuntu Server.