Деплой это момент, когда новая версия начинает обслуживать пользователей. Стратегия деплоя отвечает на три вопроса: будет ли простой, сколько пользователей увидят ошибку новой версии и как быстро откатиться.
Recreate
Остановили все старые экземпляры, запустили новые. Просто, но есть простой. Годится для внутренних инструментов или когда две версии физически не могут работать одновременно (например, единственный воркер, который держит эксклюзивную блокировку).
Rolling update
Экземпляры заменяются порциями: поднять несколько новых, дождаться готовности, убрать столько же старых. Стратегия по умолчанию в Kubernetes (RollingUpdate).
spec:
replicas: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25% # сколько подов сверх replicas можно поднять
maxUnavailable: 25% # сколько может быть недоступно
При 10 репликах maxSurge: 25% округляется вверх (3 пода сверху, максимум 13), maxUnavailable: 25% вниз (не больше 2 недоступных, минимум 8 готовых). Для сервиса, где важна каждая реплика, ставят maxUnavailable: 0.
Rolling работает только при правильной readiness probe: под получает трафик, когда готов, а не когда процесс стартовал. Плюс graceful shutdown: старый под должен доработать начатые запросы после SIGTERM.
Особенность: во время выкатки одновременно работают старая и новая версии. Значит, API и схема базы должны быть совместимы в обе стороны.
Blue-green
Две полные копии окружения: blue (текущая) и green (новая). Новую версию поднимают в green, проверяют, затем переключают трафик целиком (балансировщик, DNS, Service). Откат это переключение обратно, секунды.
Плюсы: мгновенное переключение и откат, можно проверить green до трафика. Минусы: двойные ресурсы на время выкатки, общая база всё равно одна, и миграции должны подходить обеим версиям.
Canary
Новую версию получает небольшая доля трафика: 1%, 5%, 25%, 100%. На каждом шаге сравнивают метрики канарейки со стабильной версией: доля ошибок, задержка, бизнес-метрики. Если хуже, откат, и пострадала только малая доля пользователей.
Автоматизируют через Argo Rollouts, Flagger, сервис-меш (Istio, Linkerd) или веса в балансировщике (split_clients в nginx, weighted target groups в облаке).
Важно: канарейке нужен достаточный трафик, иначе за 5 минут на 1% просто нечего сравнивать.
Feature flags
Флаг отделяет выкатку кода от включения функции. Код уже в проде, а функцию включают для сотрудников, затем для 5% пользователей, затем всем. Выключить флаг быстрее любого отката. Минус: флаги копятся, их надо удалять после полного включения.
Откат
- В Kubernetes:
kubectl rollout undo deployment/appвернёт предыдущую ревизию,--to-revision=Nконкретную. История:kubectl rollout history. - В blue-green: переключить трафик обратно.
- Откат невозможен, если новая версия уже необратимо изменила данные. Поэтому миграции делают отдельно и совместимыми.
Миграции и совместимость: expand / contract
Переименовать колонку name в full_name без простоя:
- Expand: добавить
full_name, код пишет в обе колонки. - Заполнить
full_nameдля старых строк (бэкфилл пачками). - Код читает из
full_name. - Contract: когда старая версия кода нигде не работает, удалить
name.
Каждый шаг отдельный деплой, и на любом можно откатиться на шаг назад.
Как выбрать
| Стратегия | Простой | Риск для пользователей | Ресурсы | Откат |
|---|---|---|---|---|
| Recreate | есть | все | x1 | новый деплой |
| Rolling | нет | постепенно все | чуть больше x1 | новый rolling |
| Blue-green | нет | все сразу, но после проверки | x2 | мгновенный |
| Canary | нет | малая доля | чуть больше x1 | быстрый |
Частые ошибки
- Rolling без readiness probe: трафик идёт в под, который ещё не готов.
- Удаление колонки в том же релизе, где код перестал её использовать: старые поды ещё работают и падают.
- Канарейка без автоматического сравнения метрик: «посмотрели глазами, вроде нормально».
- Считать, что blue-green решает проблему базы данных.
Что спросят на собесе
- Чем blue-green отличается от canary, плюсы и минусы.
- Как Kubernetes делает rolling update, что такое maxSurge и maxUnavailable.
- Как выкатить миграцию, которая удаляет или переименовывает колонку.
- Как откатиться и когда откат невозможен.
- Зачем feature flags, если есть canary.