Что такое Deployment и зачем он нужен?
Что такое Deployment
Deployment — это контроллер в Kubernetes, который описывает желаемое состояние для набора однотипных Pod-ов (сколько реплик, какой образ, какие переменные окружения и т. п.) и автоматически приводит кластер к этому состоянию. Он создаёт и управляет ReplicaSet-ами, а те уже создают/удерживают Pod-ы.
Проще: вы описываете что должно работать, а Deployment заботится как это развернуть, масштабировать, обновлять и откатить при необходимости.
Зачем нужен Deployment (ключевые задачи)
-
Декларативное управление количеством реплик и конфигурацией Pods.
-
Rolling updates — безопасное обновление образов/конфигурации без простоев (создаётся новый ReplicaSet, постепенно заменяющий старый).
-
Self-healing — если Pod падает или нода умирает, Deployment пересоздаст нужное количество копий.
-
История версий и rollback — хранит ревизии (ReplicaSet-ы) и позволяет откатиться к предыдущей версии.
-
Поддержка масштабирования (ручного или через HPA) и интеграция с CI/CD.
Как это работает (кратко)
-
Вы создаёте Deployment с шаблоном Pod (podTemplate) и числом реплик.
-
Kubernetes создаёт ReplicaSet, который поддерживает указанное число Pod.
-
При изменении шаблона Deployment создаёт новый ReplicaSet и плавно переводит трафик: увеличивает новый RS, уменьшает старый — согласно стратегии обновления.
-
Контроллеры постоянно «рекон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: масштабирование, обновления и откаты становятся управляемыми и предсказуемыми.