Для чего нужны Deployments в Kubernetes?

«Для чего нужны Deployments в Kubernetes?» — вопрос из категории Kubernetes, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Deployment — это основной объект Kubernetes для декларативного управления жизненным циклом stateless-приложений. Он абстрагирует ручное создание Pod'ов и ReplicaSet'ов, предоставляя мощные механизмы для развертывания и обновления.

Ключевые возможности, которые он дает:

  1. Бесперебойные обновления (Rolling Update): Позволяет обновить версию приложения без простоя. Kubernetes постепенно создает новые Pod'ы с новой версией, дожидается их готовности (readiness probe) и только затем удаляет старые. Это контролируется стратегией strategy.type: RollingUpdate.
  2. Мгновенный откат (Rollback): Если новая версия содержит ошибку, можно одной командой kubectl rollout undo deployment/<name> откатиться к предыдущей стабильной ревизии. История изменений хранится в kubectl rollout history.
  3. Гарантированная доступность и масштабирование: Deployment постоянно поддерживает заданное количество реплик Pod'ов (spec.replicas). Если Pod падает или узел выходит из строя, Deployment немедленно создает новый Pod на другом узле. Масштабирование выполняется одной командой kubectl scale.
  4. Декларативная конфигурация: Вы описываете желаемое состояние (образ контейнера, количество реплик, ресурсы) в YAML-манифесте, а Kubernetes самостоятельно приводит реальное состояние к этому виду.

Пример манифеста Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1  # Максимум 1 под может быть недоступен во время обновления
      maxSurge: 1        # Максимум на 1 под может быть больше желаемого количества
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: nginx
        image: nginx:1.21-alpine
        ports:
        - containerPort: 80
        readinessProbe:  # Проверка готовности для rolling update
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

Deployment создает и управляет объектом ReplicaSet, который, в свою очередь, напрямую контролирует Pod'ы. Это позволяет Deployment'у хранить историю ревизий для откатов.