KubernetesJuniorTechnical

Чем 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

Sources

Related topics