Модуль 24 / 24
Финальный проект и failure drill
Содержание
1. Цели финального проекта
Финальный drill объединяет quorum, reconciliation, routing mesh, reverse proxy, observability и recovery: один manager и дополнительный service instance теряются под непрерывным трафиком.
- зафиксировать условия успеха
- провести два перекрывающихся отказа
- получить ноль HTTP errors
- вернуть кластер в baseline
2. Заявленные условия доступности
Лаборатория использует три manager nodes, которые также запускают workloads, три replicas, два surviving voters, минимум один здоровый task и внешний Traefik с active health checks и тремя retry attempts.
Результат относится только к этим условиям и простым idempotent GET. Retry небезопасен для каждого non-idempotent request без application-level semantics.
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 удалены.
4. Почему нужен retry
Первый контрольный прогон без retry дал 3 ответа 502 из 180: health check ещё не успел исключить внезапно умерший endpoint. Retry middleware повторяет connection failure через другой backend и закрыл это окно.
Retry дополняет health checks, а не заменяет capacity, readiness и корректные timeouts. Метрики retries и 5xx должны оставаться наблюдаемыми.
5. Методические указания
- Не начинайте без 3/3 и quorum
- Держите recovery command готовой
- Запускайте traffic до fault
- Не останавливайте второй manager
- Фиксируйте task history и exit 137
- Проверяйте числовой критерий, а не впечатление
6. Лабораторная работа: preflight
Подтвердите baseline, маршрут, health checks, retry и публичный HTTPS.
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/7. Лабораторная работа: двойной отказ
Запустите 180 requests, потеряйте manager-1 и завершите один task на manager-2. Верните manager-1 и выполните контролируемый rollout.
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"8. Проверка результата
Отчёт должен показать requests=180 и failures=0. Пустой вывод awk подтверждает отсутствие non-200.
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/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. Защита проекта, критерии освоения и cleanup
- Какие два отказа перекрываются?
- Почему quorum сохраняется?
- Что гарантирует retry и чего не гарантирует?
- Почему 3/3 проверяется после HTTP test?
- Какие evidence войдут в incident report?
- Как изменить drill при отдельных workers?
Курс освоен, если вы объясняете архитектуру, выполняете drill с нулём ошибок в заявленных условиях и возвращаете три managers и replicas. Cleanup удаляет traffic log и принудительно возвращает manager-1 в started/Active.
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