Чем отличаются Deployment, StatefulSet и DaemonSet? Когда вы выберете каждый из них?
Короткий ответ
- Deployment — взаимозаменяемые stateless-реплики со rolling update
- StatefulSet — стабильные имена, порядок запуска и личные тома
- DaemonSet — по одному поду на каждой подходящей ноде
- StatefulSet использует headless Service и volumeClaimTemplates
- DaemonSet — для агентов: логи, мониторинг, CNI
- Выбор определяется тем, нужна ли подам идентичность
Deployment — для stateless-сервисов, StatefulSet — для нагрузок с идентичностью и данными, DaemonSet — для агентов на каждой ноде.
Как сказать вслух
пример ответаDeployment подходит для обычных приложений без состояния: все реплики одинаковы, их можно свободно пересоздавать и масштабировать. StatefulSet нужен, когда подам важна идентичность — стабильное имя, свой диск, порядок запуска, — например для баз данных или Kafka. DaemonSet запускает по одному поду на каждой ноде и используется для агентов вроде сборщика логов или node-exporter. Выбираю по простому критерию: есть ли у реплик состояние и различимость.
Подробный ответ
Основной ответ
Deployment управляет ReplicaSet и даёт декларативные rolling-обновления с параметрами maxSurge/maxUnavailable; поды анонимны и взаимозаменяемы. StatefulSet даёт каждому поду стабильное имя (app-0, app-1), стабильную DNS-запись через headless Service, персональный PersistentVolumeClaim из volumeClaimTemplates и упорядоченные запуск, обновление и удаление; при пересоздании под получает тот же том. Это нужно базам данных, брокерам и всему, где реплики различимы. DaemonSet гарантирует под на каждой ноде (или подмножестве по селекторам и tolerations) — агенты логирования, node-exporter, CSI/CNI-компоненты. Отдельно стоят Job и CronJob для конечных и периодических задач.
Ключевые моменты
- Идентичность пода. Главный критерий выбора: если реплики неразличимы — Deployment; если у каждой своё имя и данные — StatefulSet.
- Хранилище. В StatefulSet каждый под получает собственный PVC, который переживает пересоздание пода.
- Порядок операций. StatefulSet по умолчанию раскатывает и обновляет поды последовательно — важно для кворумных систем.
- DaemonSet и ноды. Привязан к жизненному циклу нод: новая нода — автоматически новый под агента.
Практический контекст
Практический вопрос на понимание, а не на заучивание: часто дают сценарий «нужно развернуть PostgreSQL/Kafka/сборщик логов — что выберете и почему». В работе ошибка выбора дорого стоит: база данных в Deployment с общим томом — классическая авария. Интервьюер также ценит оговорку, что серьёзные stateful-системы в Kubernetes чаще разворачивают операторами, а не голым StatefulSet.
Частые ошибки
- Говорят «StatefulSet — это просто Deployment с томами», игнорируя идентичность и порядок
- Предлагают разворачивать базу данных как Deployment с несколькими репликами и одним PVC
- Не знают про headless Service и стабильные DNS-имена подов StatefulSet