Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Deployment и ReplicaSet?
Deployment и ReplicaSet — это объекты Kubernetes, которые управляют запущенными подами (контейнерами). Они оба используются для масштабирования и обновления приложений, но имеют разные уровни абстракции и возможности.
ReplicaSet — низкоуровневое управление репликами
ReplicaSet — это объект, который гарантирует, что определённое количество подов всегда работает.
Основные возможности:
- Поддерживает нужное число реплик подов
- Создаёт новые поды, если старые упали
- Удаляет лишние поды, если их больше, чем нужно
- Использует selector для идентификации подов
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:1.0
ports:
- containerPort: 8080
Deployment — высокоуровневое управление
Deployment — это более высокоуровневый объект, который управляет ReplicaSet и предоставляет декларативные обновления.
Основные возможности:
- Управляет ReplicaSet автоматически
- Декларативные обновления (rollout/rollback)
- История развёртываний
- Стратегии обновления (RollingUpdate, Recreate)
- Pausе и resume развёртыванием
- Автоматическое восстановление при ошибках
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:2.0
ports:
- containerPort: 8080
Ключевые различия
| Характеристика | ReplicaSet | Deployment |
|---|---|---|
| Управление репликами | ✅ | ✅ (через ReplicaSet) |
| Обновления | ❌ | ✅ (RollingUpdate, Recreate) |
| Rollback | ❌ | ✅ |
| История версий | ❌ | ✅ |
| Рекомендуется использовать | Редко | Да, по умолчанию |
| Абстракция | Низкая | Высокая |
Как Deployment управляет ReplicaSet
Kubernetes автоматически создаёт и управляет ReplicaSet:
# При создании Deployment
kubectl apply -f deployment.yaml
# Kubernetes создаёт ReplicaSet
kubectl get replicasets
# NAME DESIRED CURRENT READY
# my-app-7d8c5b8f4d 3 3 3
# И поды
kubectl get pods
# NAME READY STATUS RESTARTS
# my-app-7d8c5b8f4d-abc12 1/1 Running 0
# my-app-7d8c5b8f4d-def45 1/1 Running 0
# my-app-7d8c5b8f4d-ghi78 1/1 Running 0
Стратегии обновления Deployment
RollingUpdate (по умолчанию) — постепенное обновление:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # макс 1 подов больше, чем replicas
maxUnavailable: 0 # минимум 0 подов должны быть недоступны
Это обеспечивает zero-downtime развёртывание.
Recreate — удалить старые поды, создать новые:
strategy:
type: Recreate
Может привести к даунтайму, но используется для stateful приложений.
Откат при ошибке
# Просмотр истории развёртыванием
kubectl rollout history deployment/my-app
# Откат к предыдущей версии
kubectl rollout undo deployment/my-app
# Откат к конкретной версии
kubectl rollout undo deployment/my-app --to-revision=2
Практический совет
Всегда используйте Deployment, а не ReplicaSet напрямую. Deployment предоставляет более мощные инструменты управления и безопасности при обновлении приложений в production.