Модуль 3 / 24
Создание кластера и жизненный цикл узлов
Содержание
1. Цели и результат модуля
После модуля вы сможете объяснить bootstrap Swarm, роли join token и node certificate, безопасно вывести follower manager, удалить его membership и вернуть с новым node ID без потери quorum.
- init создаёт первый manager и корневое состояние Swarm
- join token подтверждает роль при присоединении, но не заменяет node certificate
- advertise address задаёт адрес control plane узла
- data-path address задаёт transport overlay
- повторный join создаёт новую identity и новый node ID
2. Теория: init и join
docker swarm init создаёт новый cluster identity, локальный manager и Raft state. Параметр advertise-addr должен быть достижим всеми nodes; default address pool планируют до создания overlay networks. Дополнительные узлы получают роль worker или manager во время join.
Join token является чувствительным bootstrap credential. После join узел использует взаимную TLS-аутентификацию и автоматически обновляемый node certificate. Token можно ротировать без переподключения существующих nodes.
3. Теория: node identity и membership
Hostname помогает оператору, но identity задаёт node ID и сертификат. После leave/remove/rejoin тот же hostname получает новый ID. Старые Down-записи не следует путать с текущим узлом или удалять до выяснения причины.
- Ready описывает связь и состояние node
- Active, Pause и Drain управляют приёмом новых tasks
- Manager Status показывает Leader, Reachable или Unreachable
- demote удаляет manager из Raft membership
- node rm удаляет membership-запись, но не очищает удалённый Engine
4. Теория: безопасный вывод manager
Сначала подтверждают три здоровых manager и выбирают follower. Затем demote уменьшает Raft membership с трёх до двух, но оба оставшихся manager должны быть доступны. После demote узел выходит уже как worker, а manager удаляет его запись.
leave --force на manager и force-new-cluster являются аварийными инструментами. Они не заменяют demote и проверку quorum. Одновременно изменяют только один manager.
5. Методические указания
- Зафиксируйте leader и выбирайте follower
- Не печатайте join token и не сохраняйте его в файл или shell history
- Перед demote проверьте доступность двух остающихся managers
- После каждого шага выполняйте node ls
- Не применяйте node rm --force к доступному узлу
- После rejoin сравните старый и новый node ID и дождитесь Ready/Reachable
6. Лабораторная работа: исходное состояние
Проверьте membership и локальное состояние manager‑1 и manager‑2. Убедитесь, что manager‑2 не является leader и что все три nodes Ready.
ssh swarm-manager-1 docker node ls
ssh swarm-manager-1 docker node inspect swarm-manager-2 --pretty
ssh swarm-manager-1 docker info
ssh swarm-manager-2 docker info7. Лабораторная работа: demote, leave и remove
Выведите только manager‑2. Demote выполняется через manager‑1, leave — локально на manager‑2, remove — снова через manager‑1.
ssh swarm-manager-1 docker node demote swarm-manager-2
ssh swarm-manager-2 docker swarm leave
ssh swarm-manager-1 docker node rm swarm-manager-2
ssh swarm-manager-1 docker node lsПосле шага остаются два manager с quorum. Не продолжайте, если один из них Unreachable.
8. Лабораторная работа: безопасный повторный join
Token передаётся по pipe в stdin удалённой shell, не появляется в выводе и аргументах join на devops-vm. Узел использует стабильные control и data-path адреса cluster0.
ssh swarm-manager-1 docker swarm join-token -q manager | ssh swarm-manager-2 'read -r token; docker swarm join --token "$token" --advertise-addr 10.77.0.12 --data-path-addr 10.77.0.12 10.77.0.11:2377'
ssh swarm-manager-1 docker node ls
ssh swarm-manager-1 docker node inspect swarm-manager-2 --prettyОжидается новый node ID, Status Ready и Manager Status Reachable. Leader может оставаться на любом из двух других nodes.
9. Диагностика и guardrails
Ошибка о manager leave без --force защищает Raft membership. Ошибка удаления manager требует сначала demote. При зависшем join разделите доступность TCP 2377, локальное состояние Engine, сертификаты и существующую membership.
ssh swarm-manager-1 docker node ls
ssh swarm-manager-1 docker node inspect swarm-manager-2
ssh swarm-manager-2 docker info
ssh swarm-manager-2 journalctl -u docker --since today
ssh swarm-manager-2 ss -lntup
ssh swarm-manager-2 ping -c 2 10.77.0.11- This node is already part of a swarm — сначала inspect локальное состояние
- context deadline exceeded — проверяйте маршрут и TCP 2377
- node остаётся Down — сравните ID и удалите только подтверждённо старую запись
- Unreachable manager после join — проверьте advertise address и межузловые 2377/7946
10. Контроль, критерии освоения и cleanup
- Чем join token отличается от node certificate?
- Почему hostname не является identity?
- Зачем demote выполняют до leave?
- Когда допустим node rm --force?
- Почему нельзя печатать manager token?
- Какие адреса задают advertise-addr и data-path-addr?
Модуль освоен, если вы возвращаете follower manager с новым ID, сохраняете quorum на каждом шаге и можете объяснить каждый Docker guardrail.
Cleanup не удаляет кластер: восстановите три Ready manager, убедитесь в отсутствии тестовых services и не оставляйте token-файлы.
ssh swarm-manager-1 docker node ls
ssh swarm-manager-1 docker service ls
ssh swarm-manager-2 docker info