Что такое Rolling Update и Recreate стратегия?
RollingUpdate и Recreate — что это и в чём разница
RollingUpdate и Recreate — это две стратегии развёртывания, которые описываются в spec.strategy у Deployment (и у некоторых других контроллеров). Они определяют, как контроллер будет заменять старые Pod'ы новой версией приложения.
RollingUpdate (по умолчанию)
Описание:
-
Контроллер создаёт новый ReplicaSet с обновлённым шаблоном Pod и постепенно заменяет старые Pod'ы новыми, соблюдая ограничения на количество одновременно созданных и недоступных Pod'ов.
Параметры: -
maxSurge — сколько дополнительных Pod'ов разрешено создать сверх .spec.replicas (можно задать абсолютным числом или процентом).
-
maxUnavailable — сколько Pod'ов может быть одновременно недоступно (также число или процент).
Формулы (упрощённо):
-
Максимальное число Pod'ов в кластере в процессе обновления = replicas + maxSurge.
-
Минимально доступных Pod'ов (Ready) во время обновления ≥ replicas - maxUnavailable.
Пример:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
При replicas: 5 в любой момент будет максимум 6 Pod'ов, и не менее 4 будут доступны (5 - 1).
Поведение:
-
Контроллер поднимает новые Pod'ы (в пределах maxSurge), ждёт readiness, затем удаляет старые, повторяет цикл.
-
Уменьшает простой сервиса — подходит для веб-сервисов, API и т.п.
-
Чувствителен к readinessProbe, scheduling/rsrc-ограничениям, проблемам с imagePull и CrashLoopBackOff — если новые Pod'ы не становятся Ready, rollout остановится.
Команды:
-
kubectl rollout status deployment/<name>
-
kubectl rollout pause|resume deployment/<name>
-
kubectl rollout undo deployment/<name>
Ограничения:
- При использовании PersistentVolume с ReadWriteOnce нужно учитывать, что maxSurge>0 может попытаться запустить новый Pod на другой ноде — монтирование RWO на второй ноде может быть невозможно. Для stateful-хранилищ лучше использовать StatefulSet или выставить maxSurge: 0.
Recreate
Описание:
- Контроллер удаляет все старые Pod'ы и только потом создаёт новые. Происходит явный простоj: старые инстансы завершаются перед созданием новых.
Пример:
strategy:
type: Recreate
Поведение и сценарии:
-
Гарантирует, что старые и новые Pod'ы никогда не работают одновременно — полезно если версия приложения не совместима с предыдущей, если оба экземпляра одновременно приведут к конфликтам (например, миграции схемы, блокировки ресурсов) или при необходимости гарантировать эксклюзивный доступ к локальным ресурсам.
-
Обеспечивает простой во время обновления — не годится для критичных по доступности приложений без компенсирующих мер (maintenance window, read-only режимы и т.д.).
Особенности:
-
Простая и предсказуемая стратегия, но с даунтаймом.
-
Для stateful-приложений с RWO томами поведение Recreate может быть безопаснее, чем RollingUpdate с maxSurge>0.
Как выбрать
-
Используйте RollingUpdate для большинства stateless-сервисов, когда важна непрерывная доступность.
-
Используйте Recreate если одновременная работа старой и новой версии недопустима (миграции, эксклюзивные ресурсы) или если приложение stateful и вы не можете обеспечить безопасный параллелизм.
-
Для сложных сценариев (canary, blue/green) лучше сочетать Deployments с traffic-routing (Ingress/Service mesh) или применять дополнительные контроллеры/инструменты.
Практические советы
-
Всегда настраивайте корректные readinessProbe, чтобы RollingUpdate не выводил в трафик неготовые Pod'ы.
-
Проверяйте ресурсы кластера перед масштабированием/обновлением (чтобы новые Pod'ы не остались в Pending).
-
Для PV с ограничениями доступа планируйте стратегию так, чтобы избежать конфликтов при одновременной попытке монтирования.