← К программе курса

Модуль 3 / 24

Создание кластера и жизненный цикл узлов

DOCKER SWARM

Содержание
01

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
02

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.

03

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
04

4. Теория: безопасный вывод manager

Сначала подтверждают три здоровых manager и выбирают follower. Затем demote уменьшает Raft membership с трёх до двух, но оба оставшихся manager должны быть доступны. После demote узел выходит уже как worker, а manager удаляет его запись.

leave --force на manager и force-new-cluster являются аварийными инструментами. Они не заменяют demote и проверку quorum. Одновременно изменяют только один manager.

05

5. Методические указания

  • Зафиксируйте leader и выбирайте follower
  • Не печатайте join token и не сохраняйте его в файл или shell history
  • Перед demote проверьте доступность двух остающихся managers
  • После каждого шага выполняйте node ls
  • Не применяйте node rm --force к доступному узлу
  • После rejoin сравните старый и новый node ID и дождитесь Ready/Reachable
06

6. Лабораторная работа: исходное состояние

Проверьте membership и локальное состояние manager‑1 и manager‑2. Убедитесь, что manager‑2 не является leader и что все три nodes Ready.

terminal
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 info
07

7. Лабораторная работа: demote, leave и remove

Выведите только manager‑2. Demote выполняется через manager‑1, leave — локально на manager‑2, remove — снова через manager‑1.

terminal
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.

08

8. Лабораторная работа: безопасный повторный join

Token передаётся по pipe в stdin удалённой shell, не появляется в выводе и аргументах join на devops-vm. Узел использует стабильные control и data-path адреса cluster0.

terminal
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.

09

9. Диагностика и guardrails

Ошибка о manager leave без --force защищает Raft membership. Ошибка удаления manager требует сначала demote. При зависшем join разделите доступность TCP 2377, локальное состояние Engine, сертификаты и существующую membership.

terminal
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

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-файлы.

terminal
ssh swarm-manager-1 docker node ls
ssh swarm-manager-1 docker service ls
ssh swarm-manager-2 docker info