Index
Документация по установке и использованию PostgreSQL через Crunchy PGO (PostgreSQL Operator).
Оглавление
- Описание
- Быстрый старт
- Архитектура
- Команды
- Конфигурация
- Подключение
- Инициализация сервисных БД
- Автоматическое использование в CI/CD
- Мониторинг
- Troubleshooting
Описание
Crunchy PGO (PostgreSQL Operator) - оператор Kubernetes для управления PostgreSQL кластерами с автоматическим failover, backup и restore.
Возможности
- ✅ Автоматический failover
- ✅ Connection pooling (PgBouncer)
- ✅ Backup и restore (pgBackRest)
- ✅ Репликация (read replicas)
- ✅ Мониторинг и логирование
- ✅ Интеграция с Prometheus
Текущая конфигурация
- Operator namespace:
tech-postgres-operator - Databases namespace:
tech-postgres-databases - Storage: Longhorn (60Gi per instance, StorageClass:
longhorn-postgres) - Placement: Operator на masters, PostgreSQL на workers
Быстрый старт
1. Подготовка нод
Подготовка нод выполняется автоматически через Ansible playbook:
1 | |
Это добавит:
- На master нодах: label node-role.kubernetes.io/control-plane=true и taint node-role.kubernetes.io/control-plane:NoSchedule
- На worker нодах: label node-role.kubernetes.io/worker=true
Или вручную (замените <masterX> и <workerX> на реальные имена нод):
1 2 3 4 5 6 7 8 | |
2. Установка Operator
1 | |
3. Создание кластера
1 | |
4. Проверка статуса
1 | |
Архитектура
Компоненты
| Компонент | Namespace | Расположение | Описание |
|---|---|---|---|
| PGO Operator | tech-postgres-operator |
Control-plane ноды | Управляет кластерами |
| PostgreSQL Pods | tech-postgres-databases |
Worker ноды | Основные инстансы БД |
| PgBouncer | tech-postgres-databases |
Worker ноды | Connection pooler |
| pgBackRest | tech-postgres-databases |
Worker ноды | Backup и restore |
Кластер pg-public
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Команды
Управление
1 2 3 4 5 6 | |
Сервисные БД
1 2 3 | |
Мониторинг
1 | |
Примечание: Мониторинг встроен в PostgresCluster через monitoring.pgmonitor.exporter.
ServiceMonitor и PrometheusRule должны быть настроены отдельно в namespace tech-monitoring.
Справка
1 | |
Конфигурация
Кластер pg-public
Конфигурация в manifests/cluster/pg-public.yaml:
- Instances: 2 (1 primary + 1 replica)
- Version: PostgreSQL 17
- Storage: 60Gi per instance (Longhorn, StorageClass:
longhorn-postgres) - Resources: 200m-1 CPU, 512Mi-1Gi RAM
- Connection poolers: PgBouncer (2 replicas, transaction mode)
- Node placement: Только worker ноды
- Pod anti-affinity: Разные worker ноды
- Backup: pgBackRest (20Gi storage)
Подключение
Connection Strings
1 2 3 4 5 6 7 8 | |
Пользователи
- postgres - суперпользователь (по умолчанию)
- pgpublic_app - приложение (SUPERUSER, CREATEDB)
- pgpublic_readonly - только чтение (NOLOGIN, для внутренних целей)
- pgpublic_monitoring - мониторинг (LOGIN, CREATEDB)
Подключение через kubectl
1 2 3 4 5 6 7 8 9 | |
Подключение из приложения
1 2 3 4 5 6 7 8 9 10 11 12 | |
Для получения пароля:
1 | |
Инициализация сервисных БД
Для каждого сервиса, использующего PostgreSQL, необходимо создать отдельную базу данных, пользователя и K8s секрет с credentials.
Создание БД для сервиса
1 | |
Команда:
1. Создаёт базу данных my-service и пользователя my-service в PostgreSQL
2. Генерирует безопасный пароль (или использует существующий, если секрет уже создан)
3. Создаёт Kubernetes секреты в namespace tech-postgres-databases:
- pg-user-my-service-stage
- pg-user-my-service-pre
- pg-user-my-service-prod
Каждый секрет содержит:
- host - хост PostgreSQL (pg-public-primary или pg-public-pgbouncer)
- port - порт (5432)
- database - имя базы данных
- user - имя пользователя
- password - пароль
- uri - полная connection string
Ротация паролей
Для ротации пароля используйте флаг ROTATE=true:
1 | |
Генерация переменных для GitLab CI/CD (опционально)
Если вы хотите использовать старый способ с GitLab CI/CD Variables (не рекомендуется), можно сгенерировать переменные:
1 | |
Команда выведет переменные в трёх форматах: - Base64 (для Masked Variable в GitLab) - File content (для File Variable в GitLab) - Plain string (для обычной переменной)
Автоматическое использование в CI/CD
После инициализации базы данных сервиса, GitLab CI/CD автоматически использует созданные credentials для миграций.
Новое поведение (рекомендуется)
Не нужно добавлять MIGRATION_ENV_VARS_* в GitLab CI/CD Variables!
Credentials автоматически читаются из K8s секретов при выполнении миграций.
Как это работает:
- В CI/CD pipeline job
migrate-database-{env}проверяет наличие переменнойMIGRATION_ENV_VARS_{ENV} - Если переменная не указана, система автоматически:
- Определяет окружение из
CI_ENVIRONMENT_NAME(stage/pre/production) - Читает секрет
pg-user-{SERVICE}-{env}из namespacetech-postgres-databasesчерез kubectl - Извлекает credentials и создаёт
.env.migrationдля docker
Требования:
- Секрет должен существовать:
make postgres-init-service-db SERVICE=your-service - RBAC должен быть применён:
cd ../gitlab-runner && make gitlab-runner-apply-rbac - KUBECONFIG настроен в CI jobs (уже есть через
KUBECONFIG_STAGE/PRE/PROD)
Подробнее см. GitLab Runner RBAC.
Старое поведение (deprecated, но работает)
Можно вручную добавить переменные через make postgres-get-migration-vars SERVICE=name и прописать их в GitLab CI/CD Variables:
{SERVICE}_MIGRATION_ENV_STAGE{SERVICE}_MIGRATION_ENV_PRE{SERVICE}_MIGRATION_ENV_PROD
Это полезно для: - Специальных случаев (кастомные настройки подключения) - Override стандартных настроек - Отладки проблем с миграциями
Пример: Инициализация для нового сервиса
1 2 3 4 5 6 7 8 9 | |
В логах CI/CD вы увидите:
1 2 3 | |
Troubleshooting
Operator не запускается
1 2 3 4 5 | |
PostgreSQL pods не создаются
1 2 3 4 5 6 7 8 | |
Pods не распределяются по нодам
1 2 3 4 5 | |
Проблемы с подключением
1 2 3 4 5 6 7 8 | |
Ошибка "permission denied for schema public"
В PostgreSQL 15+ схема public по умолчанию не имеет прав для обычных пользователей. Если приложение получает ошибку [42501] ERROR: permission denied for schema public, нужно выдать права вручную.
Выдача прав для всех пользователей приложений:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
Проверка прав:
1 2 3 4 5 6 7 | |
Ожидаемый результат: has_usage = true и has_create = true.
Примечание: Для новых баз данных права можно настроить автоматически через databaseInitSQL в конфигурации PostgresCluster (см. manifests/cluster/pg-public.yaml).
Мониторинг
PostgreSQL кластер мониторится через встроенный postgres-exporter, который настраивается в PostgresCluster CR через секцию monitoring.pgmonitor.exporter.
Компоненты мониторинга
- Встроенный экспортер - автоматически создается Crunchy PGO для каждого инстанса PostgreSQL
- ServiceMonitor - конфигурация для Prometheus (должен быть настроен в namespace
tech-monitoring) - PrometheusRule - алерты для PostgreSQL (должен быть настроен в namespace
tech-monitoring)
Важно: Экспортер встроен в кластер и автоматически собирает метрики с primary и replica инстансов.
Конфигурация мониторинга
Мониторинг настраивается в манифесте кластера (manifests/cluster/pg-public.yaml):
1 2 3 4 5 6 7 8 9 10 11 | |
Настройка ServiceMonitor и PrometheusRule
ServiceMonitor и PrometheusRule должны быть настроены отдельно в namespace tech-monitoring для сбора метрик из встроенного экспортера.
Проверка статуса
1 2 3 4 5 6 | |
Метрики
Встроенный экспортер собирает следующие метрики:
- pg_up - доступность PostgreSQL (1 = доступен, 0 = недоступен)
- pg_stat_database_* - статистика по базам данных
- pg_stat_activity_* - активные подключения и запросы
- pg_replication_* - метрики репликации
- pg_stat_statements_* - статистика выполнения запросов
- pg_settings_* - настройки PostgreSQL
Алерты
Настроены следующие алерты:
Доступность:
- PostgresDown - PostgreSQL недоступен (5 min)
- PostgresExporterDown - экспортер не может подключиться (5 min)
Подключения:
- PostgresTooManyConnections - используется >80% подключений (5 min)
- PostgresMaxConnectionsReached - используется >95% подключений (2 min)
Репликация:
- PostgresReplicationLag - отставание репликации >30s (5 min)
- PostgresReplicationLagCritical - отставание репликации >300s (5 min)
- PostgresReplicationNotRunning - репликация не работает (10 min)
Производительность:
- PostgresSlowQueries - медленные запросы (avg >1s, 10 min)
- PostgresHighCPUUsage - высокое использование CPU (10 min)
- PostgresHighMemoryUsage - высокое использование памяти (10 min)
Хранилище:
- PostgresDatabaseSize - размер БД >50GB (5 min)
- PostgresDatabaseSizeCritical - размер БД >55GB (5 min)
Backups (pgBackRest):
- NoRecentBackup - нет бэкапа за 24 часа (15 min)
- PostgresBackupRecoveryWindowLow - recovery window <1 часа (5 min)
- PostgresWALArchiveStale - WAL архив устарел >1 часа (5 min)
Мониторинг PgBouncer
Текущая реализация:
Мониторинг PgBouncer реализован через sidecar exporter в каждом PgBouncer pod. Это обеспечивает: - Автоматическое масштабирование: каждый PgBouncer pod имеет свой exporter - Устойчивость к рестартам: Service выбирает pods по лейблам, а не по именам - Простоту управления: exporter управляется PGO вместе с PgBouncer
Архитектура:
- Feature Gate:
PGBouncerSidecars=trueвключен в операторе - Sidecar контейнер:
pgbouncer-exporterдобавлен в каждый PgBouncer pod черезspec.proxy.pgBouncer.containers - Service:
pg-public-pgbouncer-metricsселектит все PgBouncer pods по лейблам - ServiceMonitor: Prometheus скрейпит все endpoints сервиса
Установка pgbouncer_exporter
1 2 | |
Эта команда:
- Создает Service pg-public-pgbouncer-metrics для метрик
- Создает ServiceMonitor для Prometheus
- Ожидает перезапуска PgBouncer pods с sidecar exporter'ом
Важно: Sidecar exporter добавляется автоматически при применении PostgresCluster с секцией containers. Убедитесь, что feature gate PGBouncerSidecars=true включен в операторе.
Проверка работы:
1 2 3 4 5 6 7 8 9 10 | |
Метрики pgbouncer_exporter:
pgbouncer_pools_*- статистика пулов (client_active, server_active, и т.д.)pgbouncer_stats_*- общая статистика (total_requests, total_received, и т.д.)pgbouncer_databases_*- статистика по базам данныхpgbouncer_lists_*- списки подключений
Удаление:
1 | |
Для включения OpenTelemetryMetrics (альтернатива):
- Обновите оператор до версии 5.8.6+ (UBI9)
- Включите feature gate: PGO_FEATURE_GATES="OpenTelemetryMetrics=true"
- Добавьте instrumentation: {} в PostgresCluster spec
- Примените PodMonitor для PgBouncer (см. monitoring/manifests/monitors/pgbouncer-exporter.yaml)
- PostgresHighWALUsage - WAL файлы >4GB (10 min)
Deadlocks:
- PostgresDeadlocks - обнаружены deadlocks (5 min)
- PostgresHighDeadlockRate - высокая частота deadlocks >1/s (5 min)
Grafana Dashboard
Рекомендуется импортировать дашборд для PostgreSQL:
1 2 3 4 5 6 7 8 9 | |
Популярные дашборды: - 9628 - PostgreSQL Database (рекомендуется) - 11159 - PostgreSQL Overview - 6742 - PostgreSQL Database & Table Statistics
Troubleshooting мониторинга
Экспортер не запускается:
1 2 3 4 5 6 7 8 | |
Метрики не собираются:
1 2 3 4 5 6 7 | |
Алерты не работают:
1 2 3 4 5 | |