← Назад к вопросам

Что определяет Deployment в Kubernetes?

2.2 Middle🔥 172 комментариев
#Kubernetes

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Развертывание (Deployment) в Kubernetes: Основная концепция

В Kubernetes Deployment — это объект API уровня абстракции (apps/v1), который определяет желаемое состояние (desired state) для набора однотипных Pod'ов (реплик) и управляет их жизненным циклом. Это ключевой инструмент для декларативного обновления приложений, обеспечения их доступности и масштабируемости. По сути, Deployment — это контроллер, который действует как "обертка" вокруг ресурса ReplicaSet, предоставляя продвинутые возможности оркестрации.

Ключевые аспекты, определяемые Deployment

1. Желаемое состояние приложения

Deployment в своем манифесте YAML явно описывает, какое приложение должно работать. Это включает:

  • Шаблон Pod (Pod Template): Конфигурация контейнеров, образы, переменные среды, volumes и т.д.
  • Количество реплик (Replicas): Сколько идентичных Pod'ов должно работать одновременно для обеспечения нагрузки и отказоустойчивости.
  • Стратегия обновления (Update Strategy): Как применять изменения к запущенным Pod'ам.

2. Стратегии развертывания и обновления

Одна из главных функций Deployment — управление обновлениями без простоя. Определяются стратегией spec.strategy.type:

  • RollingUpdate (По умолчанию): Постепенная замена Pod'ов старых версий на новые. Параметры maxUnavailable и maxSurge контролируют скорость и доступность.
    spec:
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxUnavailable: 25%   # Максимум 25% Pod'ов могут быть недоступны во время обновления
          maxSurge: 1           # Допустимо на 1 Pod больше желаемого количества
    
  • Recreate: Все старые Pod'ы уничтожаются перед созданием новых. Приводит к кратковременному простою, но полезно для приложений, не поддерживающих две версии одновременно.

3. Управление версиями и откат (Rollback)

Deployment автоматически отслеживает историю ревизий всех своих конфигураций. Это позволяет легко откатиться к предыдущей стабильной версии.

# Просмотр истории изменений Deployment
kubectl rollout history deployment/my-app

# Откат к предыдущей ревизии
kubectl rollout undo deployment/my-app

# Откат к конкретной ревизии
kubectl rollout undo deployment/my-app --to-revision=2

4. Проверка здоровья и готовности

Deployment полагается на Probes (проверки) из Pod Template для корректного управления обновлениями:

  • Readiness Probe: Определяет, когда Pod готов принимать трафик. Новый Pod добавляется в балансировку нагрузки только после успешной проверки.
  • Liveness Probe: Определяет, когда контейнер необходимо перезапустить. Deployment будет заменять "неживые" Pod'ами.

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3  # Желаемое количество идентичных Pod'ов
  selector:    # Deployment использует этот селектор для поиска управляемых Pod'ов
    matchLabels:
      app: nginx
  template:    # Шаблон для создания новых Pod'ов
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.1
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1

Практическое значение для DevOps-инженера

С точки зрения инженера, Deployment — это фундаментальный строительный блок для реализации CI/CD в Kubernetes, потому что он:

  • Декларативен: Вы описываете "что" (желаемое состояние), а не "как". Kubernetes сам приводит систему к этому состоянию.
  • Обеспечивает самоисцеление (Self-healing): Если Pod падает или удаляется (на узле возникла проблема), контроллер Deployment через ReplicaSet немедленно создаст новый Pod для поддержания заданного количества реплик.
  • Позволяет масштабировать приложение в один клик: Изменение числа реплик (kubectl scale deployment/nginx --replicas=5) — тривиальная операция.
  • Интегрируется с системами мониторинга и логирования: Метки (Labels), управляемые Deployment, используются Service и Ingress для маршрутизации трафика, а также для сбора метрик и логов по всему набору Pod'ов.

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