В Kubernetes не все приложения одинаковы. Если stateless-сервису обычно всё равно, на каком Pod он запустится, то базе данных, очереди или кластерному хранилищу важны стабильные имена, порядок запуска и постоянные диски. Именно для таких задач и нужен StatefulSet.
Что такое StatefulSet
StatefulSet — это контроллер Kubernetes для приложений, которым требуется:
- постоянная идентичность Pod
- привязка к своему хранилищу
- предсказуемый порядок создания, остановки и обновления
Каждый Pod в StatefulSet получает уникальное имя:
db-0, db-1, db-2
Даже после перезапуска номер сохраняется, а вместе с ним — и логика кластера.
Где используется
StatefulSet подходит для:
- PostgreSQL, MySQL, MongoDB
- Redis, Kafka, ZooKeeper
- Elasticsearch
- любых stateful-приложений, где важны данные и сетевые идентификаторы
Чем StatefulSet отличается от Deployment
Deployment хорош для stateless-нагрузки:
- веб-приложения
- API
- фронтенд
- воркеры без локального состояния
StatefulSet нужен, когда нельзя просто удалить Pod и поднять новый “любой” экземпляр. Например, если postgres-0 хранит свои данные на отдельном томе, его замена должна быть контролируемой.
Ключевые особенности StatefulSet
- Стабильные имена Pod — удобно для репликации и discovery
- Persistent Volume Claim на каждый Pod — данные не теряются при пересоздании
- Порядок запуска и остановки — сначала
pod-0, потомpod-1 - Ordered rolling update — обновления идут последовательно, что важно для БД
Почему это важно для баз данных
База данных в Kubernetes без сохранения состояния — риск потери данных и проблем с кластеризацией. StatefulSet помогает:
- закрепить диск за конкретным Pod
- сохранить адресуемость нод кластера
- безопаснее выполнять масштабирование и обновления
- упростить работу master/replica или quorum-систем
Что важно учесть на практике
StatefulSet — не “магическое решение” для любой БД в K8s 🚨 Нужно отдельно продумать:
- backup и restore
- anti-affinity, чтобы реплики не жили на одном узле
- StorageClass и производительность дисков
- readiness/liveness probes
- отказоустойчивость на уровне самой СУБД
Когда точно стоит брать StatefulSet
- если приложению нужен свой постоянный том
- если важен фиксированный network identity
- если есть репликация между экземплярами
- если порядок старта и остановки влияет на работоспособность
Итог
StatefulSet — базовый инструмент Kubernetes для запуска баз данных, брокеров сообщений и других stateful-систем. Он не заменяет архитектуру отказоустойчивости, но даёт фундамент: постоянное хранилище, стабильные Pod и управляемый lifecycle. Для production-нагрузки это не опция, а необходимость 🔐💾
Подборку каналов про IT стоит посмотреть тем, кто следит за Kubernetes, DevOps, архитектурой и инфраструктурой в проде 📚