Как работать с Deployment в Kubernetes?

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

Ответ

Deployment — основной объект Kubernetes для управления жизненным циклом stateless-приложений. Я использую его для декларативного описания желаемого состояния приложения и автоматизации развертываний.

Пример манифеста Deployment для веб-приложения:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-app
  namespace: production
  labels:
    app: frontend
spec:
  replicas: 3  # Желаемое количество подов
  selector:
    matchLabels:
      app: frontend
      tier: web
  strategy:
    type: RollingUpdate  # Стратегия обновления по умолчанию
    rollingUpdate:
      maxSurge: 1        # Можно создать на 1 под больше желаемого количества
      maxUnavailable: 0  # Минимум 3 пода должны оставаться доступными
  template:
    metadata:
      labels:
        app: frontend
        tier: web
        version: v1.2.0  # Метка версии для канареечных развертываний
    spec:
      containers:
      - name: web-container
        image: my-registry/frontend:v1.2.0
        ports:
        - containerPort: 8080
        envFrom:
        - configMapRef:
            name: frontend-config
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080

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

# Деплой или обновление
kubectl apply -f frontend-deployment.yaml

# Мониторинг процесса обновления
kubectl rollout status deployment/frontend-app -n production

# Масштабирование вручную (обычно это делает HPA)
kubectl scale deployment frontend-app --replicas=5 -n production

# Откат к предыдущей ревизии, если что-то пошло не так
kubectl rollout undo deployment/frontend-app -n production

# История изменений
kubectl rollout history deployment/frontend-app -n production

Почему это важно: Deployment обеспечивает самовосстановление (если под падает, ReplicaSet создаст новый), позволяет проводить безопасные обновления без простоя (rolling update) и легко масштабировать приложение. В production это всегда используется вместе с Service и Ingress для маршрутизации трафика.