При обновлении веб-приложения на продакшене пользователи часто теряют доступ или получают ошибки 503. Представьте: выкатили новую версию, а половина запросов упала с таймаутом — база не успела переключиться. Стандартный подход «остановить → заменить → запустить» не подходит для сервисов с требованиями SLA 99.9%. Мы настраиваем Rolling Update — стратегию, исключающую простой при минимальных затратах ресурсов. Наш опыт — 10+ лет в DevOps, внедрение rolling update для fintech и e-commerce с миллионной аудиторией.
Почему Rolling Update — лучший выбор для zero-downtime деплоя?
Rolling Update заменяет инстансы постепенно: сначала обновляется 1–2 пода, проверяется их здоровье, затем следующие. В отличие от Blue-Green, не требует двойных ресурсов, а в сравнении с Recreate — не останавливает все поды одновременно. Это даёт баланс между затратами и отказоустойчивостью. Rolling Update в 2 раза быстрее Blue-Green по времени развёртывания, а при правильной конфигурации downtime отсутствует полностью.
| Параметр | Rolling Update | Blue-Green | Recreate |
|---|---|---|---|
| Дополнительные ресурсы | 0 | 2× | 0 |
| Downtime | Нет | Нет | Есть |
| Время деплоя | Среднее | Быстрое | Быстрое |
| Сложность настройки | Средняя | Высокая | Низкая |
| Риск несовместимости | Выше | Ниже | Ниже |
Rolling Update даёт наилучшее соотношение цены и надёжности для большинства продакшен-систем. Подтверждение — Rolling release в Wikipedia, где rolling update рекомендуется как default-стратегия.
Как настроить Rolling Update в Kubernetes?
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 6
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 2
maxUnavailable: 1
minReadySeconds: 30
selector:
matchLabels: { app: myapp }
template:
metadata:
labels: { app: myapp }
spec:
containers:
- name: myapp
image: registry.example.com/myapp:v1.1.0
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 3
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
terminationGracePeriodSeconds: 60
kubectl set image deployment/myapp myapp=registry.example.com/myapp:v1.2.0
kubectl rollout status deployment/myapp
kubectl rollout history deployment/myapp
kubectl rollout undo deployment/myapp
kubectl rollout undo deployment/myapp --to-revision=3
Что такое graceful shutdown и зачем он нужен?
Корректное завершение процессов — критично для zero-downtime. При получении SIGTERM приложение должно завершить активные запросы, закрыть соединения и освободить ресурсы. Если приложение не успевает завершиться за терминационный период, Kubernetes принудительно убивает его, что приводит к потере запросов.
// Node.js/Express — корректное завершение при SIGTERM
process.on('SIGTERM', async () => {
console.log('SIGTERM received, shutting down gracefully');
server.close(() => {
console.log('HTTP server closed');
});
await new Promise(resolve => setTimeout(resolve, 30_000));
await db.destroy();
process.exit(0);
});
Как проверить готовность приложения?
Readiness-проба должна проверять зависимые сервисы: БД, кеш, очередь. Пример на Laravel:
// Laravel — health check routes
Route::get('/health/live', function () {
return response()->json(['status' => 'ok']);
});
Route::get('/health/ready', function () {
try {
DB::connection()->getPdo();
Cache::store()->get('health-check');
} catch (\Exception $e) {
return response()->json(['status' => 'not ready', 'error' => $e->getMessage()], 503);
}
return response()->json(['status' => 'ready']);
});
Как обеспечить совместимость базы данных при Rolling Update?
При сосуществовании двух версий схема БД должна быть совместима с обеими. Жёсткое правило — миграции запускаются до деплоя нового кода и только backward-compatible. Запрещено сразу переименовывать или удалять колонки, менять типы данных без промежуточных шагов.
Рекомендуется трёхэтапный деплой: сначала добавить новую колонку (nullable) или новую таблицу. Затем заполнить новые поля, переключить код на их использование. И только в третьей итерации удалить старые колонки или таблицы. Такой подход исключает ошибки совместимости при одновременной работе двух версий.
Типичные проблемы при настройке Rolling Update
Одна из частых ошибок — слишком маленький maxSurge или maxUnavailable, что затягивает деплой. Например, если maxSurge=1, а реплик 10, то обновление займёт 10 раундов. Правильно выбирать эти параметры исходя из общего числа реплик и допустимой скорости развёртывания. Другая проблема — некорректные readiness-пробы: они должны проверять реальную готовность приложения, а не просто возвращать 200. Если проба не включает проверку БД, новый под может начать принимать трафик до того, как база инициализирована, что приведёт к ошибкам 500. Также часто забывают настроить terminationGracePeriodSeconds: если приложение не успевает завершиться до принудительного SIGKILL, активные запросы теряются. Рекомендуется устанавливать значение не менее 30 секунд.
Что входит в настройку Rolling Update?
- Анализ текущей инфраструктуры и архитектуры приложения
- Конфигурация Kubernetes Deployment или Docker Swarm service
- Написание корректных readiness- и liveness-проб
- Доработка graceful shutdown (SIGTERM, завершение запросов)
- Разработка стратегии backward-compatible миграций
- Тестирование на staging-окружении с нагрузкой
- Документация настроек и регламентов
- Обучение команды работе с Rolling Update
Процесс работы
- Аналитика: изучаем текущий стэк, инфраструктуру, процессы деплоя
- Проектирование: выбираем параметры Rolling Update, health checks
- Реализация: настраиваем оркестратор, пишем пробы, graceful shutdown
- Тестирование: проверяем на staging с нагрузочным тестированием
- Деплой: катим на production, мониторим первые 24 часа
Сроки реализации
| Этап | Длительность |
|---|---|
| Базовая настройка Rolling Update (Kubernetes + health checks) | 2–3 дня |
| Docker Swarm rolling update | 1–2 дня |
| Разработка backward-compatible миграций | 1–2 дня |
| Полный цикл с обучением | 3–5 дней |
Свяжитесь с нами для консультации — оценим ваш проект за 2 дня. Закажите настройку Rolling Update у профессионалов. Получите готовое решение с гарантией нулевого downtime и полной совместимости.







