Ответ
Нет, Deployment не может существовать или функционировать без ReplicaSet. Deployment — это абстракция более высокого уровня, которая управляет ReplicaSet'ами для реализации декларативных обновлений, откатов и масштабирования приложений.
Как это работает:
- Когда вы создаёте Deployment, Kubernetes сразу создаёт под капотом первый ReplicaSet для управления Pod'ами согласно заданной спецификации (
spec.template). - При обновлении образа (например,
kubectl set image deployment/nginx nginx=nginx:1.19) Deployment создаёт новый ReplicaSet с обновлённым Pod template и начинает постепенный rollout. - Старый ReplicaSet сохраняется (по умолчанию) для возможности быстрого отката (
kubectl rollout undo).
Практический пример:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: nginx
image: nginx:1.18-alpine
ports:
- containerPort: 80
После применения этого манифеста можно увидеть связь:
# Показать Deployment
kubectl get deployment frontend
# Показать управляемые ReplicaSet'ы (имя содержит хэш template)
kubectl get replicaset -l app=frontend
# Показать Pod'ы, созданные ReplicaSet'ом
kubectl get pods -l app=frontend
Что произойдёт, если удалить ReplicaSet вручную? Deployment немедленно заметит расхождение между желаемым состоянием (3 реплики) и фактическим (0 реплик) и автоматически создаст новый ReplicaSet, который, в свою очередь, создаст новые Pod'ы. Это демонстрирует принцип работы control loop'а в Kubernetes.
Альтернативы для прямого управления Pod'ами: Если вам нужен синглтон-под или специфическое управление жизненным циклом без стратегий обновления, можно использовать:
- StatefulSet — для stateful-приложений с устойчивыми идентификаторами и хранилищем.
- DaemonSet — для запуска пода на каждой (или группе) нод.
- Job/CronJob — для задач, которые должны завершиться.