Что такое поэтапное внедрение (rolling deployment) в DevOps?

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

Ответ

Поэтапное внедрение (Rolling Deployment) — это стратегия развертывания, при которой новая версия приложения заменяет старую постепенно, экземпляр за экземпляром, что позволяет избежать полного простоя (downtime) и минимизировать риск.

Как это работает на практике:

  1. Новый образ приложения (например, myapp:v2) собирается и помещается в реестр (Docker Registry).
  2. Оркестратор (Kubernetes, Nomad) начинает заменять поды (pods) или ноды с версией v1 на v2 по одному или небольшими группами.
  3. После каждого шага выполняются проверки здоровья (health checks). Если новый экземпляр v2 не проходит проверку, развертывание приостанавливается или откатывается.
  4. Процесс продолжается, пока все экземпляры не будут обновлены.

Пример манифеста Kubernetes, определяющего стратегию Rolling Update:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1  # Гарантирует, что во время обновления будет недоступно не более 1 пода
      maxSurge: 1        # Позволяет создать не более 1 дополнительного пода сверх желаемого количества
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myregistry.com/myapp:v2.0.0
        readinessProbe:
          httpGet:
            path: /health
            port: 8080

Преимущества:

  • Нулевой downtime: Приложение остается доступным для пользователей.
  • Быстрый откат: В случае проблем можно остановить развертывание или откатиться, отменив лишь несколько последних шагов.
  • Плавная нагрузка: Инфраструктура не испытывает резкого скачка нагрузки, связанного с одновременным запуском всех новых экземпляров.

Недостатки и сложности:

  • Совместимость данных: На время развертывания одновременно работают две версии приложения. Это требует обеспечения обратной и прямой совместимости API и схем баз данных.
  • Мониторинг: Необходим тщательный мониторинг метрик (латентность, ошибки, потребление ресурсов) для быстрого выявления проблем в новой версии.