Что такое Deployment и зачем он нужен?

Что такое Deployment

Deployment — это контроллер в Kubernetes, который описывает желаемое состояние для набора однотипных Pod-ов (сколько реплик, какой образ, какие переменные окружения и т. п.) и автоматически приводит кластер к этому состоянию. Он создаёт и управляет ReplicaSet-ами, а те уже создают/удерживают Pod-ы.
Проще: вы описываете что должно работать, а Deployment заботится как это развернуть, масштабировать, обновлять и откатить при необходимости.

Зачем нужен Deployment (ключевые задачи)

  • Декларативное управление количеством реплик и конфигурацией Pods.

  • Rolling updates — безопасное обновление образов/конфигурации без простоев (создаётся новый ReplicaSet, постепенно заменяющий старый).

  • Self-healing — если Pod падает или нода умирает, Deployment пересоздаст нужное количество копий.

  • История версий и rollback — хранит ревизии (ReplicaSet-ы) и позволяет откатиться к предыдущей версии.

  • Поддержка масштабирования (ручного или через HPA) и интеграция с CI/CD.

Как это работает (кратко)

  1. Вы создаёте Deployment с шаблоном Pod (podTemplate) и числом реплик.

  2. Kubernetes создаёт ReplicaSet, который поддерживает указанное число Pod.

  3. При изменении шаблона Deployment создаёт новый ReplicaSet и плавно переводит трафик: увеличивает новый RS, уменьшает старый — согласно стратегии обновления.

  4. Контроллеры постоянно «реконcилируют» состояние — если что-то уходит, они восстанавливают.

Важные поля и пример манифеста

apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels: { app: web }
spec:
containers:
\- name: web
image: myrepo/web:1.2.3
ports: \[{ containerPort: 80 }\]
readinessProbe: ...
resources:
requests: { cpu: "100m", memory: "128Mi" }
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1

Пояснения: selector должен соответствовать меткам в template. strategy управляет поведением при обновлении.

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

  • RollingUpdate (по умолчанию) — плавная замена: maxSurge контролирует, сколько дополнительных Pod может появиться, maxUnavailable — сколько может быть недоступно во время обновления.

  • Recreate — сначала удаляются все старые Pod, затем создаются новые (иногда нужна, если приложение не поддерживает одновременно старую и новую версии).

Команды и операции

  • kubectl apply -f deploy.yaml — применить/обновить Deployment.

  • kubectl get deploy, kubectl describe deploy web — состояние.

  • kubectl rollout status deploy/web — ждать окончания rollout.

  • kubectl rollout history deploy/web — посмотреть ревизии.

  • kubectl rollout undo deploy/web — откат к предыдущей ревизии.

  • kubectl scale deploy/web --replicas=5 — быстрое масштабирование (или HPA).

Best practices

  • Держите image immutably (всегда подтягивать по digest, не по latest).

  • Всегда задавайте readinessProbe и livenessProbe — чтобы Deployment не направлял трафик в нездоровые Pod.

  • Указывайте resources.requests/limits — для корректного планирования и QoS.

  • Не меняйте selector у существующего Deployment — это приводит к ошибкам; для изменения селектора создайте новый Deployment.

  • Используйте PodDisruptionBudget чтобы предотвратить чрезмерные одновременные отключения.

  • Интегрируйте Deployment в CI/CD (git → cluster), проверяйте kubectl rollout status и делайте автоматический rollback при деградации (canary/observability).

Расширенные паттерны

  • Canary: создать отдельный Deployment с меньшим трафиком (или использовать traffic-splitting через ingress/Service Mesh).

  • Blue-Green: два Deployment (blue/green) и переключение Service селектора между ними.

  • Pause/Resume: kubectl rollout pause для контроля последовательности изменений из CI.

Deployment — основной инструмент для безопасного, воспроизводимого и автоматизированного управления статeless-приложениями в Kubernetes: масштабирование, обновления и откаты становятся управляемыми и предсказуемыми.