При оновленні веб-застосунку на продакшені користувачі часто втрачають доступ або отримують помилки 503. Уявіть: викотили нову версію, а половина запитів впала з таймаутом — база не встигла переключитися. Стандартний підхід «зупинити → замінити → запустити» не підходить для сервісів з вимогами SLA 99.9%. Ми налаштовуємо Rolling Update — стратегію, що виключає простій при мінімальних витратах ресурсів. Наш досвід — 10+ років у DevOps, впровадження rolling update для fintech та e-commerce з мільйонною аудиторією.
Чому Rolling Update — найкращий вибір для zero-downtime деплою?
Rolling Update замінює інстанси поступово: спочатку оновлюється 1–2 pod, перевіряється їхнє здоров'я, потім наступні. На відміну від 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. Якщо проба не включає перевірку БД, новий pod може почати приймати трафік до того, як база ініціалізована, що призведе до помилок 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 та повної сумісності.







