Ответ
Deployment — это объект Kubernetes API уровня рабочей нагрузки (workload), который обеспечивает декларативное управление жизненным циклом набора идентичных подов (Pods). Он является основным способом развертывания и обновления stateless-приложений.
Основные обязанности Deployment:
- Создание и поддержание указанного количества реплик подов (через управление ReplicaSet).
- Обновление версии приложения с выбранной стратегией (rolling update по умолчанию).
- Откат (rollback) к предыдущей стабильной версии при неудачном обновлении.
- Масштабирование количества реплик вручную или автоматически (с 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.