Ответ
Deployment — это абстракция более высокого уровня, которая управляет ReplicaSet и предоставляет механизмы для декларативного обновления приложений. ReplicaSet — это низкоуровневый контроллер, который просто гарантирует запуск заданного количества идентичных подов (реплик).
Ключевые отличия:
| Аспект | ReplicaSet | Deployment |
|---|---|---|
| Основная цель | Поддержание стабильного набора идентичных подов. | Управление жизненным циклом приложения: развертывание, обновление, откат. |
| Обновление | Не поддерживает стратегии обновления. Чтобы обновить образ, нужно создать новый ReplicaSet и удалить старый вручную. | Поддерживает стратегии обновления (RollingUpdate — по умолчанию, Recreate). Автоматически создает новый ReplicaSet при изменении Pod template. |
| Откат (Rollback) | Нет встроенного механизма. | Есть команда kubectl rollout undo, которая откатывается к предыдущему ReplicaSet. Хранит историю ревизий. |
| Использование | Редко используется напрямую. Обычно является строительным блоком для Deployment. | Основной ресурс для развертывания stateless-приложений. |
На практике: Вы почти всегда создаете Deployment. Он под капотом создаст ReplicaSet, который, в свою очередь, создаст нужные Pod'ы.
Пример Deployment, который создаст и будет управлять ReplicaSet:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-app
spec:
replicas: 3
selector:
matchLabels:
app: frontend
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # Максимум 1 под может быть недоступен во время обновления
maxSurge: 1 # Максимум на 1 под может быть больше желаемого количества
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: app
image: myregistry/frontend:v1.2.3
ports:
- containerPort: 8080
---
# Команда для обновления образа (Deployment создаст новый ReplicaSet)
kubectl set image deployment/frontend-app app=myregistry/frontend:v1.2.4