Стоит ли запускать PostgreSQL в Kubernetes?
Если у вас нет времени читать статью, то краткий ответ: да! Запуск кластера базы данных PostgreSQL в Kubernetes — это жизнеспособный и готовый к использованию в продакшене способ хостинга баз данных. Но так было не всегда. Раньше, когда единственным примитивом Kubernetes для этого были StatefulSets, управление базами данных в кластере Kubernetes было задачей не из простых. Сейчас, благодаря зрелости специализированных операторов для Kubernetes, таких как CloudNativePG, настоящие ограничения чаще связаны с навыками и опытом инженеров, управляющих кластером.
Тем не менее, запуск PostgreSQL в Kubernetes не гарантирует повышения уровня безопасности или автоматического решения проблем с отказоустойчивостью. Однако он открывает большие возможности для автоматизации и расширяемости, которых было бы крайне сложно достичь другими средствами.
Почему именно PostgreSQL?
Да, рабочие нагрузки баз данных не ограничиваются одной PostgreSQL. MySQL, MongoDB и другие СУБД тоже имеют зрелые Kubernetes-операторы с полезными возможностями и интересными сценариями использования — про многие из них можно написать отдельные статьи. Но в этой публикации мы сосредоточимся на PostgreSQL.
Чем хороша PostgreSQL?
Вот лишь некоторые преимущества PostgreSQL:
- Долговечность: Более 25 лет инноваций и развития. PostgreSQL — стабильный и проверенный временем выбор, которому доверяют многие.
- Открытость и универсальность: Это многозадачная СУБД с открытым исходным кодом, которая подходит для самых разных типов нагрузок и сценариев использования.
- Высокая доступность: Поддерживает архитектуру "основной–реплики" (primary–replica), где есть один ведущий (primary) и несколько реплик только для чтения. Это повышает время безотказной работы и доступность данных.
- Продвинутый протокол репликации: Возможности вроде синхронной репликации (контроль на уровне транзакций) и каскадной репликации обеспечивают согласованность данных и стабильную производительность при чтении — даже между кластерами Kubernetes.
- Восстановление после сбоев: Непрерывное резервное копирование и восстановление до определённой точки во времени (PITR) позволяют надёжно восстановить данные с любого момента, обеспечивая отказоустойчивость и безопасность операций.
- Сильное сообщество и популярность: PostgreSQL широко используется и стабильно входит в число самых уважаемых и популярных СУБД, что делает её надёжным выбором для множества команд и проектов.
PostgreSQL в Kubernetes — хорошая ли это идея?
Если бы вы проспали десять лет и очнулись только после выхода Kubernetes v1.14, вас бы удивило, насколько изменилось мнение сообщества по поводу размещения баз данных в Kubernetes. С выходом версии v1.14 в статусе General Availability появились локальные постоянные тома (Local Persistent Volumes), и паттерн операторов и контроллеров начал активно развиваться. Этот сдвиг вызвал переоценку того, насколько уместно запускать базы данных в Kubernetes. Но прежде чем перейти к тому, почему теперь это может быть действительно хорошим решением, стоит разобраться, почему ещё недавно запуск баз в Kubernetes считался рискованным, мягко говоря.
Изначально в Kubernetes были доступны только два примитива для работы с ворклоадами: Deployments и StatefulSets. Deployments довольно быстро оказались непригодны для баз данных: они создают поды непредсказуемо, назначают случайные сетевые идентификаторы и не могут гарантировать, что конкретная реплика останется ведущей (primary). StatefulSets улучшили ситуацию: они индексируют поды, обеспечивают предсказуемое масштабирование, закрепляют постоянные сетевые имена и позволяют каждой реплике использовать собственное постоянное хранилище. Это значит, что если реплика выйдет из строя, новая сможет подключиться к тому же хранилищу, что и её предшественник.
Но как выразился Виктор Фарчич:
«Тот факт, что StatefulSet — лучшее решение по сравнению с Deployment, не делает его хорошим решением.»
Для действительно production-ready рабочих нагрузок с базами данных, StatefulSets всё ещё не обеспечивают ключевые функции, такие как:
- Резервное копирование (Backups)
- Автоматическое переключение в случае сбоя (Automated Failovers)
- Повышение роли реплик (Replica Promotions)
- Наблюдаемость (Observability)
И поскольку StatefulSets были недостаточны, многие пришли к выводу, что Kubernetes не подходит для баз данных.
Так зачем вообще запускать базы данных PostgreSQL в Kubernetes?
Потому что всё изменилось. StatefulSet — больше не единственный инструмент в арсенале. Сегодня Kubernetes воспринимается не как готовое решение «из коробки», а как высоко расширяемая платформа. Его настоящая сила именно в расширяемости.
Теперь вы можете не ограничиваться только нативным Kubernetes-хранилищем — его возможности можно расширить с помощью CSI-плагинов (Container Storage Interface). И самое главное — вместо использования только StatefulSet мы теперь имеем в распоряжении специализированные операторы, предназначенные для управления сложными, состояниезависимыми рабочими нагрузками. Эти операторы не только выполняют всё то, что раньше делал StatefulSet, но и предоставляют полный набор функций на уровне базы данных, необходимых для продакшена.
Крис Милстед из Akamai хорошо выразился:
«Когда вы переносите данные в Kubernetes, ваши проблемы с отказоустойчивостью никуда не исчезают. Вам всё так же нужно думать об этих проблемах. Но теперь делать это проще — благодаря множеству автоматизаций, которые происходят либо со стороны самого Kubernetes, либо через такие инструменты, как CloudNativePG. Это сильно упрощает путь к автоматизации — не нужно тратить на всё месяцы.»
Интегрируя слой данных в ваш кластер Kubernetes, вы получаете единое пространство для сетей и вычислений, а также доступ к Kubernetes-фичам вроде:
- самовосстановления (self-healing),
- распределения по зонам доступности и регионам,
- и других преимуществ из коробки.
Габриэле Бартолини, вице-президент по Cloud Native в EDB и уважаемый член сообщества PostgreSQL, рекомендует запускать PostgreSQL в Kubernetes, чтобы достичь следующих ключевых преимуществ:
- Репликация на уровне приложения: Использование встроенной репликации PostgreSQL для синхронизации данных внутри и между кластерами Kubernetes, вместо репликации на уровне хранилища. Такой подход нативен для Kubernetes и идеально подходит для обеспечения устойчивости приложений и согласованности состояния.
- Оптимизация по зонам доступности: Использование зон доступности Kubernetes вместо разнесённых дата-центров в отдельных кластерах. Это позволяет обеспечить автоматическую высокую доступность без потерь данных и с минимальным временем восстановления (RTO) — прямо из коробки, в пределах одного региона.
Какие есть альтернативные способы?
Запуск напрямую на виртуальной машине
Конечно, так можно сделать. Особенно когда StatefulSet в Kubernetes был единственным вариантом — никто бы вас за это не осудил.
Использование управляемого сервиса баз данных вне кластера
Во многих случаях выбор между запуском PostgreSQL в Kubernetes и использованием полностью управляемого сервиса напоминает классическую дилемму: SaaS против self-hosted решений. Для многих, включая меня и нашу команду, расширяемость и гибкость, которые даёт Kubernetes, в сочетании с относительной простотой использования оператора вроде CloudNativePG, делают самостоятельный хостинг очевидным выбором.
Кроме того, высокая стоимость управляемых сервисов только облегчает решение в пользу самостоятельного размещения PostgreSQL в Kubernetes.
На сабреддите r/kubernetes это хорошо подметили в одном из комментариев:
Что нужно, чтобы запускать PostgreSQL в Kubernetes?
В целом, для эффективного управления PostgreSQL в Kubernetes требуются три основных компонента:
- Экспертиза в Kubernetes: Ваша команда или организация должна хорошо разбираться в Kubernetes, чтобы уметь управлять кластером и устранять возможные проблемы.
- Экспертиза в PostgreSQL: Глубокое понимание PostgreSQL необходимо для настройки, оптимизации и поддержки базы данных в среде Kubernetes.
- Надёжный оператор: Используйте проверенного оператора, способного управлять полным жизненным циклом кластера PostgreSQL — обеспечивать высокую доступность, масштабирование и другие ключевые функции.
Обратите внимание:
Если вы уже запускаете приложения в Kubernetes, но храните данные вне кластера, прежде чем “перетаскивать” базу данных внутрь, обязательно проконсультируйтесь с опытным специалистом. Этот процесс далеко не тривиальный.
Точно так же, если вы только начинаете с Kubernetes и строите архитектуру с нуля, разумно будет обратиться за помощью к профессионалу, который поможет принять решения, о которых вы не пожалеете в будущем.
Кстати, об операторе: что такое CloudNativePG?
CloudNativePG — это оператор с открытым исходным кодом, предназначенный для управления кластерами баз данных PostgreSQL в Kubernetes. Он обладает широким набором функций, которые делают его готовым к использованию в продакшене и отлично подходящим для сценариев с высокой доступностью.
Некоторые ключевые возможности CloudNativePG:
- Готовность к продакшену: Разработан для работы с реальными рабочими нагрузками.
- Kubernetes-оператор: Полностью интегрирован с API Kubernetes.
- Автоматическое переключение при сбое: Обеспечивает высокую доступность, автоматически переключаясь на реплику при сбое основной инстанции.
- Полностью декларативный подход: Управление кластерами PostgreSQL через декларативные конфигурации.
- Открытый исходный код: Бесплатный и поддерживаемый сообществом.
- Самовосстановление: Обнаруживает сбои инстансов и автоматически восстанавливает базу данных.
- Управление кластерами: Выполняет роль менеджера PostgreSQL-кластера в Kubernetes.
- Повышенная безопасность: Поддерживает mTLS для безопасной связи между компонентами.
- Оптимизированное хранилище: Разделяет хранилище для WAL-файлов.
- Резервное копирование и восстановление: Встроенные функции для бэкапа и восстановления после сбоев.
- Rolling-обновления: Минимизирует простои во время обновлений.
- Расширенный контроллер Kubernetes: Добавляет функциональность, специфичную для PostgreSQL.
- Экспорт в Prometheus: Лёгкая интеграция с системами мониторинга.
- Прямое управление PVC: Использует PersistentVolumeClaims напрямую для поддержки различных типов хранилищ.
- Репликация на уровне приложения: Обеспечивает согласованную репликацию данных на уровне PostgreSQL.
- Плагин для kubectl: Удобное управление через CLI Kubernetes.
CloudNativePG — мощный инструмент, и как видно, он закрывает все те функциональные пробелы, которых не хватало в чистом StatefulSet.
Какое хранилище использовать?
В Kubernetes существуют два основных типа доступа к хранилищу:
- Сетевое хранилище (Network Storage): Обычно реализуется через NFS, CSI-плагины или другие варианты сетевого подключения. Это наиболее часто используемый подход в Kubernetes, но он может вызывать проблемы с пропускной способностью и задержками, особенно в общих средах, где несколько приложений конкурируют за I/O ресурсы.
- Локальное хранилище (Local Storage): Начиная с версии Kubernetes 1.14, стало возможным использовать локальное хранилище, напрямую подключенное к узлу, включая bare-metal-сценарии. Локальное хранилище отлично подходит для нагрузок с высокой транзакционной активностью или для очень больших баз данных (VLDB). Оно обеспечивает архитектуру «shared-nothing» с более высокой и предсказуемой производительностью, что особенно важно для приложений, требующих быстрого и стабильного доступа к данным.
Для продакшен-нагрузок наиболее предпочтительным и рекомендованным вариантом является использование локального хранилища, подключённого к хосту, где работает база данных PostgreSQL. CloudNativePG обладает высокой гибкостью: он позволяет использовать разные типы хранилищ, подключаемых через PVC (Persistent Volume Claims) — как для активных данных, так и для резервного копирования.