Чем Deployment отличается от ReplicaSet, и зачем нужны оба?
ReplicaSet поддерживает заданное число Pod, а Deployment управляет ReplicaSet как версиями rollout: создает новые ReplicaSet, масштабирует старые и новые, хранит историю и позволяет rollback.
Суть
ReplicaSet отвечает за простую инварианту: должно быть N Pod, подходящих под selector. Deployment находится уровнем выше. Он описывает rollout приложения: template Pod, количество реплик, стратегию обновления, историю ревизий и rollback. В production обычно создают Deployment, а ReplicaSet появляется как управляемый дочерний объект. Поэтому вопрос не про два равноправных способа деплоя, а про иерархию контроллеров.
Как работает
Когда меняется template в Deployment, например image tag, Deployment controller создает новый ReplicaSet с новым pod-template-hash. Затем он постепенно увеличивает новый ReplicaSet и уменьшает старый согласно стратегии RollingUpdate, maxUnavailable и maxSurge. Старые ReplicaSet не удаляются сразу: они нужны для истории и rollback. ReplicaSet сам не знает про rollout и ревизии; если управлять им напрямую, можно поддерживать реплики, но нельзя получить штатный rolling update.
Пример
кода
kubectl create deployment api --image=nginx:1.27 --replicas=3
kubectl set image deployment/api nginx=nginx:1.28
kubectl rollout status deployment/api
kubectl get rs -l app=api
kubectl rollout undo deployment/api
Подводные камни
- Создавать ReplicaSet напрямую для обычного сервиса. Это лишает вас стандартного rollout и rollback.
- Менять selector Deployment после создания. Он должен стабильно совпадать с labels template, иначе контроллер потеряет связь с Pod.
- Думать, что каждый apply создает новый ReplicaSet. Новая ревизия появляется при изменении Pod template, а не любых metadata Deployment.
Что отличает сильный ответ
Хороший ответ объясняет ownership chain: Deployment владеет ReplicaSet, ReplicaSet владеет Pod. На follow-up часто спрашивают maxSurge, maxUnavailable, progressDeadlineSeconds и почему rollout может зависнуть на readinessProbe.
Common mistakes
- Говорить, что Deployment просто синоним ReplicaSet
- Не знать про rollback
- Не объяснять роль Pod template hash
What the interviewer is testing
- Понимает иерархию контроллеров
- Знает rolling update
- Умеет объяснить rollback