Docker Swarm
Кластеризация приложений, упрощенный K8s.
Типы Nodes (хост Docker в Swarm кластере):
- manager: управление состоянием кластера и распределение задач по workers
- workers: получают и выполняют задачи
Конфигурация и состояние кластера хранится в распределенной хранимой в ОП БД, реплицированной по всем manager. Сервис (service) является атомарным элементом для управления. Сверху накручиваются фишки типа масштабирования, постоянного обновления и восстановления.
Для Node желательно настройка dns имен (в моем случае manager1, manager2, worker1, worker2)
Инициализация кластера
Инициализация первого manager - добавление остальных manager - добавление worker. Инициализация первого manager:
docker swarm init
Затем при помощи команд ... join-token смотрим инструкцию по подключению node.
Доступность кластера
Один manager активен в каждый момент времени. Это Leader manager. Остальные (Fallower managers) проксируют команды на лидера. Ситуации split-brain (в результате сбоя сети при котором одинаковое количество manager осталось в каждом сегменте и последующего восстановления связи) необходимо избеспгать. Желательно 3-5 manager.
Подключение manager после перезагрузки / сбоя сети может привести к проблемам. Поэтому желательно установить правило блокировки при перезагрузке.
docker swarm update --autolock=true
Она выдаст ключ разблокиройвки. После перезагрузки потребуется разблокировать
docker swarm unlock
Есть нюанс: для работы кластера требуется доступность более половины manager. Поэтому кластер из 2 manager точно плохой вариант)
Пользовательские приложения
По умолчанию исполняются на всех нодах. Для исключения manager нужно ввести команду
docker node update --availability drain mgr1
В списке node Active поменяется на Drain
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE
m1bhltzuvvzippoetl7b26m3j manager1.bobrobotirk.ru Ready Drain Leader 28.0.1
yjmubzqzvrvbhqaqw70rlorzk * manager2.bobrobotirk.ru Ready Drain Reachable 28.0.1
3s0jzf6fcw9ik5g9sqlrpmmgo worker1.bobrobotirk.ru Ready Active 28.0.1
Основные команды
Команда | Доп. пар. | Описание |
docker swam init | Инициализация первого manager кластера | |
--advertise-addr 10.0.0.1:2377 | Необязательный параметр. Нужен если есть внешний балансировщик нагрузки - тогда адрес балансировщика, и указать listen-addr. | |
--listen-addr 10.0.0.1:2377 | Необязательный параметр. Нужен если много ip адресов. | |
docker node ls | Список node в кластере | |
docker swarm join-token | worker | Инструкция по подключению worker |
manager | Инструкция по подключению manager | |
docker swarm leave | Исключение node из кластера | |
docker swarm update | --autolock=true | Блокировка после перезагрузки / потере связи |
--availability drain name_manager | Исключение manager из исполнения клиентских приложений. | |
docker swarm unlock | Разблокировка manager |