Модуль 16 / 24
Rolling updates и rollback
Содержание
1. Цели и результат модуля
После модуля вы сможете проектировать rolling update, выбрать start-first/stop-first, настроить failure threshold и доказать автоматический rollback под HTTP-нагрузкой.
- читать UpdateStatus и task history
- задавать parallelism, delay и monitor
- различать pause, continue и rollback
- измерять клиентский результат
2. Теория: rolling update
Изменение TaskTemplate создаёт новые tasks по UpdateConfig. parallelism ограничивает одновременную замену, delay разделяет batches, monitor задаёт окно наблюдения, max failure ratio — допустимую долю отказов.
Convergence команды и доступность приложения — разные метрики. Проверяйте service state и непрерывный внешний трафик.
3. Теория: update order
stop-first освобождает ресурсы и порт перед запуском replacement, но временно уменьшает capacity. start-first сначала запускает новый task, затем останавливает старый; он требует headroom и совместимости двух версий.
Start-first не гарантирует zero downtime при одной replica без healthcheck и готовности приложения.
4. Теория: failure action и rollback
При отказе monitored task действие pause сохраняет состояние для оператора, continue продолжает рискованное обновление, rollback возвращает предыдущую service spec. RollbackConfig отдельно задаёт порядок и monitor.
Rollback возвращает orchestrator spec, но не откатывает миграции базы, внешние side effects и несовместимые данные.
5. Методические указания
- Используйте immutable image reference в production
- Фиксируйте исходный spec и 3/3
- Запускайте load generator вне Swarm service
- Считайте HTTP 000 отдельно от HTTP errors
- Вносите одну контролируемую неисправность
- После rollback проверяйте UpdateStatus и старый spec
6. Лабораторная работа: update policy
Создайте три replicas на отдельном ingress port 18082. Политика заменяет по одному task, использует start-first и автоматически откатывается при первой monitored failure.
ssh swarm-manager-3 docker service create --detach=true --name swarm-m16-web --replicas 3 --publish published=18082,target=80,mode=ingress --update-parallelism 1 --update-delay 2s --update-monitor 5s --update-failure-action rollback --update-max-failure-ratio 0 --update-order start-first --rollback-parallelism 1 --rollback-monitor 5s --rollback-order stop-first nginx:1.29-alpine
ssh swarm-manager-3 docker service inspect swarm-m16-web --pretty
ssh swarm-manager-3 docker service ps swarm-m16-webcurl --fail --silent http://10.77.0.11:18082/ >/dev/null
curl --fail --silent http://10.77.0.12:18082/ >/dev/null
curl --fail --silent http://10.77.0.13:18082/ >/dev/null7. Лабораторная работа: непрерывные запросы
Запустите цикл в отдельном терминале перед update. Он записывает конечный код каждой попытки; ошибка curl должна учитываться, а не скрываться retry.
rm -f /tmp/swarm-m16-statuses
for n in $(seq 1 120); do
curl --max-time 2 --silent --output /dev/null --write-out '%{http_code}\n' http://10.77.0.11:18082/ >> /tmp/swarm-m16-statuses
sleep 0.2
done8. Лабораторная работа: broken update и rollback
Замените command на немедленный exit 42. Первый новый task упадёт, update перейдёт в rollback, исходные nginx tasks останутся или восстановятся.
ssh swarm-manager-3 docker service update --detach=false --args 'sh -c "exit 42"' swarm-m16-web
ssh swarm-manager-3 docker service inspect swarm-m16-web --pretty
ssh swarm-manager-3 docker service ps swarm-m16-web --no-trunc
sort /tmp/swarm-m16-statuses | uniq -cПроверенный результат: rollback_completed и 120 ответов HTTP 200.
9. Диагностика
Свяжите UpdateStatus.Message с первым Failed task, exit code и клиентской временной шкалой. Не объявляйте успех только по 3/3 после rollback.
ssh swarm-manager-3 docker service inspect swarm-m16-web --format '{{json .UpdateStatus}}'
ssh swarm-manager-3 docker service ps swarm-m16-web --no-trunc
ssh swarm-manager-3 docker service logs --raw swarm-m16-web
curl --max-time 5 --fail --show-error http://10.77.0.11:18082/- updating — процесс ещё идёт
- paused — требуется решение оператора
- rollback_started — возврат не завершён
- rollback_completed — spec возвращён, данные проверяются отдельно
10. Контроль, критерии освоения и cleanup
- Что ограничивает parallelism?
- Зачем monitor?
- Как start-first влияет на capacity?
- Чем rollback spec отличается от rollback данных?
- Почему 3/3 недостаточно?
- Какие запросы не покрывает этот тест?
Модуль освоен, если вы вызываете failure, получаете rollback_completed и сопоставляете 120 клиентских результатов с task history.
ssh swarm-manager-3 docker service rm swarm-m16-web
rm -f /tmp/swarm-m16-statuses
ssh swarm-manager-3 docker service ls
ssh swarm-manager-3 docker node ls