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

Модуль 24 / 24

Финальный проект и failure drill

DOCKER SWARM

Содержание
01

1. Цели финального проекта

Финальный drill объединяет quorum, reconciliation, routing mesh, reverse proxy, observability и recovery: один manager и дополнительный service instance теряются под непрерывным трафиком.

  • зафиксировать условия успеха
  • провести два перекрывающихся отказа
  • получить ноль HTTP errors
  • вернуть кластер в baseline
02

2. Заявленные условия доступности

Лаборатория использует три manager nodes, которые также запускают workloads, три replicas, два surviving voters, минимум один здоровый task и внешний Traefik с active health checks и тремя retry attempts.

Результат относится только к этим условиям и простым idempotent GET. Retry небезопасен для каждого non-idempotent request без application-level semantics.

03

3. Failure model и критерии

Остановка Engine на manager-1 одновременно удаляет voter и локальный instance. Затем kill task на manager-2 создаёт второй отказ service instance, пока manager-1 ещё недоступен. Quorum сохраняют manager-2 и manager-3.

Успех: 180 запросов, 0 non-200, service снова 3/3, все managers Ready/Active, временные files удалены.

04

4. Почему нужен retry

Первый контрольный прогон без retry дал 3 ответа 502 из 180: health check ещё не успел исключить внезапно умерший endpoint. Retry middleware повторяет connection failure через другой backend и закрыл это окно.

Retry дополняет health checks, а не заменяет capacity, readiness и корректные timeouts. Метрики retries и 5xx должны оставаться наблюдаемыми.

05

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

  • Не начинайте без 3/3 и quorum
  • Держите recovery command готовой
  • Запускайте traffic до fault
  • Не останавливайте второй manager
  • Фиксируйте task history и exit 137
  • Проверяйте числовой критерий, а не впечатление
06

6. Лабораторная работа: preflight

Подтвердите baseline, маршрут, health checks, retry и публичный HTTPS.

terminal
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ls
ssh swarm-manager-3 docker service ps swarm-ingress-demo
sed -n '1,80p' /home/goreckii_ai/traefik/dynamic/swarm.yaml
curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/
07

7. Лабораторная работа: двойной отказ

Запустите 180 requests, потеряйте manager-1 и завершите один task на manager-2. Верните manager-1 и выполните контролируемый rollout.

terminal
rm -f /tmp/swarm-m24-http.log
started=$(date +%s)
( for n in $(seq 1 180); do code=$(curl --connect-timeout 2 --max-time 5 -sS -o /dev/null -w '%{http_code}' https://swarm-demo.goretskiy.pro/ || printf 000); printf '%s %s\n' "$n" "$code"; sleep 0.2; done ) > /tmp/swarm-m24-http.log &
load_pid=$!
sleep 2
ssh swarm-manager-1 sudo systemctl stop docker
sleep 5
ssh swarm-manager-2 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-ingress-demo | head -1); test -n "$id"; docker kill "$id"'
sleep 8
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ps --no-trunc swarm-ingress-demo
ssh swarm-manager-1 sudo systemctl start docker
sleep 18
ssh swarm-manager-3 docker service update --detach=false --force swarm-ingress-demo
wait "$load_pid"
08

8. Проверка результата

Отчёт должен показать requests=180 и failures=0. Пустой вывод awk подтверждает отсутствие non-200.

terminal
ended=$(date +%s)
total=$(wc -l < /tmp/swarm-m24-http.log)
failed=$(awk '$2 != 200 {count++} END {print count+0}' /tmp/swarm-m24-http.log)
printf 'requests=%s failures=%s duration_seconds=%s\n' "$total" "$failed" "$((ended-started))"
awk '$2 != 200 {print}' /tmp/swarm-m24-http.log
test "$total" -eq 180
test "$failed" -eq 0
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ls
curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/
09

9. Диагностика и эксплуатационный runbook

  • 502 в первые секунды — proxy health interval, retry и endpoints
  • нет quorum — немедленно вернуть исходный voter
  • replicas не 3/3 — capacity, constraints, image pull и Engine logs
  • task exit 137 — проверить deliberate kill или OOM
  • manager Down после start — service, socket, time и 2377/TCP
  • HTTP 200 при degraded state — продолжать recovery до baseline
10

10. Защита проекта, критерии освоения и cleanup

  • Какие два отказа перекрываются?
  • Почему quorum сохраняется?
  • Что гарантирует retry и чего не гарантирует?
  • Почему 3/3 проверяется после HTTP test?
  • Какие evidence войдут в incident report?
  • Как изменить drill при отдельных workers?

Курс освоен, если вы объясняете архитектуру, выполняете drill с нулём ошибок в заявленных условиях и возвращаете три managers и replicas. Cleanup удаляет traffic log и принудительно возвращает manager-1 в started/Active.

terminal
rm -f /tmp/swarm-m24-http.log
ssh swarm-manager-1 sudo systemctl start docker
ssh swarm-manager-3 docker node update --availability active swarm-manager-1
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ls