Как правильно развернуть (deploy) приложение с длительным временем перезапуска?

«Как правильно развернуть (deploy) приложение с длительным временем перезапуска?» — вопрос из категории Архитектура и DevOps-практики, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При работе с stateful-приложениями (базы данных, кэши) или монолитами с долгой инициализацией я применяю стратегии, исключающие простой (downtime) и минимизирующие риск.

Ключевые практики:

  1. Точная настройка проверок готовности (Readiness Probe) в Kubernetes: Это самый важный элемент. Probe должна проверять, что приложение полностью инициализировалось и готово принимать трафик.

    readinessProbe:
      httpGet:
        path: /health/ready # Эндпоинт должен проверять все зависимости
        port: 8080
      initialDelaySeconds: 45 # Даем время на долгий старт
      periodSeconds: 10
      failureThreshold: 3
  2. Использование стратегии обновления RollingUpdate с правильными таймаутами:

    strategy:
      type: RollingUpdate
      rollingUpdate:
        maxUnavailable: 0 # Никогда не убирать старый pod, пока новый не готов
        maxSurge: 1       # Запускать новый pod заранее
  3. Стратегия Blue-Green Deployment:

    • Я разворачиваю новую версию (green) параллельно со старой (blue) в отдельном наборе ресурсов (например, новый Deployment и Service).
    • После полной готовности green-окружения (проверяю логи, метрики) переключаю трафик, обновляя селектор основного Service.
    • Это дает мгновенное переключение и возможность быстрого отката.
  4. Feature Flags (функциональные флаги): Я встраиваю в приложение систему флагов. Новая функциональность деплоится в выключенном состоянии. После деплоя и проверки я включаю её для пользователей через конфигурацию, без перезапуска приложения. Это полностью отделяет процесс развертывания кода от активации фичи.

Пример из опыта: При обновлении кластера Elasticsearch с долгим перестроением индексов я использовал подход blue-green на уровне всего StatefulSet, переключая DNS-запись после полной готовности нового кластера.