Настройка кластера 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

Читайте также

Другая полезная информация по теме:

1. Установка Docker на Linux.

2. Установка и настройка кластера Kubernetes на Ubuntu Server.

3. Создание собственного образа Docker.

4. Шпаргалка по работе с docker-compose.

# Linux # Серверы # Виртуализация # DevOps
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет