Что такое Deployment в Kubernetes?

«Что такое Deployment в Kubernetes?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Deployment — это объект Kubernetes API уровня рабочей нагрузки (workload), который обеспечивает декларативное управление жизненным циклом набора идентичных подов (Pods). Он является основным способом развертывания и обновления stateless-приложений.

Основные обязанности Deployment:

  1. Создание и поддержание указанного количества реплик подов (через управление ReplicaSet).
  2. Обновление версии приложения с выбранной стратегией (rolling update по умолчанию).
  3. Откат (rollback) к предыдущей стабильной версии при неудачном обновлении.
  4. Масштабирование количества реплик вручную или автоматически (с HorizontalPodAutoscaler).

Пример манифеста deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
  labels:
    app: backend-api
spec:
  replicas: 3 # Желаемое количество подов
  selector: # Как Deployment находит свои Pods
    matchLabels:
      app: backend-api
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1 # Макс. недоступных подов при обновлении
      maxSurge: 1 # Макс. новых подов сверх replicas
  template: # Шаблон для создания Pods
    metadata:
      labels:
        app: backend-api
    spec:
      containers:
      - name: api-container
        image: my-registry/api:v1.2.3
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"

Типичные операции:

# Применить/обновить конфигурацию
kubectl apply -f deployment.yaml

# Просмотреть статус развертывания
kubectl get deployments
kubectl describe deployment api-deployment

# Обновить образ контейнера
kubectl set image deployment/api-deployment api-container=my-registry/api:v1.3.0

# Отследить процесс обновления (rolling update)
kubectl rollout status deployment/api-deployment

# Откатиться на предыдущую ревизию
kubectl rollout undo deployment/api-deployment

# Масштабировать количество реплик
kubectl scale deployment api-deployment --replicas=5

Стратегии обновления:

  • RollingUpdate (по умолчанию): Постепенная замена старых подов новыми, обеспечивает нулевое время простоя.
  • Recreate: Удаляет все старые поды перед созданием новых — приводит к простою.

Важно: Deployment идеально подходит для stateless-приложений. Для stateful-приложений используйте StatefulSet, а для задач, выполняемых один раз — Job или CronJob.