Короткий ответ
Однозначного правила нет: StatefulSet в Kubernetes даёт больше контроля и может снизить стоимость/избежать vendor lock-in, но перекладывает на команду всю операционную сложность (бэкапы, репликация, failover, патчинг, мониторинг специфичных метрик СУБД), тогда как managed-сервис (RDS, Cloud SQL и т.п.) стоит дороже и может иметь свои ограничения, но снимает значительную часть этой операционной нагрузки — выбор зависит от зрелости команды в эксплуатации конкретной технологии БД, требований к контролю и бюджета.
Как это работает подробнее
Kubernetes StatefulSet решает только часть задач эксплуатации БД — устойчивую идентичность и привязку хранилища к конкретному поду; но сама логика failover, резервного копирования с проверкой восстановимости, обновления минорных/мажорных версий без потери данных, мониторинга репликационного лага и прочих специфичных для конкретной СУБД операций либо должна быть реализована через Kubernetes-оператор (например, для PostgreSQL — Zalando/CloudNativePG, для Kafka — Strimzi), либо вручную. Managed-сервис берёт эту ответственность на себя, предоставляя SLA на доступность и часто встроенные инструменты для point-in-time recovery, но ограничивает возможность тонкой настройки и может быть дороже при большом объёме данных или интенсивном трафике.
- Компромисс. решение должно явно взвешивать стоимость managed-сервиса против стоимости времени инженеров на поддержку self-hosted решения (включая риск редких, но дорогостоящих инцидентов), доступность зрелого Kubernetes-оператора именно для нужной технологии и версии, требования к задержке и совместному размещению с остальными компонентами в том же кластере, и регуляторные ограничения (например, требование физического размещения данных, которое managed-сервис может не поддерживать в нужном регионе) — это решение стоит принимать совместно с владельцами продукта и архитекторами, а не как изолированный выбор DevOps-команды.
Пример кода
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata: { name: orders-db }
spec:
instances: 3
storage: { size: 100Gi }Что использовать на практике
- Практика. для команд без глубокой экспертизы в конкретной технологии (например, нет опыта эксплуатации Kafka-кластера под нагрузкой) запуск в Kubernetes без зрелого оператора создаёт реальный риск потери данных или длительных простоев при первом же серьёзном инциденте; наличие качественного оператора для конкретной технологии существенно снижает этот риск, но не устраняет его полностью — оператор не заменяет понимание, как работает сама СУБД под капотом. Managed-сервис также не освобождает от ответственности полностью: команде всё равно нужно настраивать правильные параметры, мониторинг использования и собственные процессы восстановления на уровне приложения (например, тестирование процедуры восстановления из бэкапа managed-сервиса).
Подводные камни
- Риски. частая ошибка — считать наличие зрелого Kubernetes-оператора достаточной гарантией безопасной эксплуатации без понимания внутреннего устройства самой СУБД; также кандидаты нередко переоценивают managed-сервис, забывая, что он не избавляет команду от необходимости собственного мониторинга и тестирования процедур восстановления.