PostgreSQL в облаке и Kubernetes
Раздел 8.11, шаг 8 из 12. Дальше — HA-кластеры.
On-premise, облако, Kubernetes — выбор
| Среда | Плюсы | Минусы |
|---|---|---|
| Bare metal / VM | Полный контроль GUC, I/O | Сами HA, бэкапы, patching |
| Managed (RDS, Azure DB, Cloud SQL, Yandex MDB) | HA, бэкапы, patching | Лимиты параметров, vendor lock-in |
| Self-hosted в Kubernetes | Единая платформа с приложением | Сложность stateful, нужен оператор |
| DBaaS в K8s (CloudNativePG, Zalando) | GitOps-friendly Postgres | Требует зрелого кластера и storage |
Общая модель shared responsibility в облаке — 3.08/3.
Managed PostgreSQL
Типовой набор возможностей:
- автоматические ежедневные snapshot + WAL/PITR;
- Multi-AZ / regional HA;
- read replicas в один клик;
- параметр-группы (часть GUC);
- Private endpoint — без публичного IP.
Подключение приложения в K8s:
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: app-db-credentials
key: url
Secret создаётся Terraform/External Secrets из vault провайдера — шаг 12.
StatefulSet — минимальный паттерн
PostgreSQL в Kubernetes stateful: нужны stable network ID и persistent disk.
Код ITЗагрузка примера кода…
Headless Service postgres даёт DNS postgres-0.postgres.default.svc.cluster.local.
StatefulSet с replicas: 1 без Patroni/оператора — single point of failure. Pod reschedule на другой node возможен (RWO volume attach), но failover и replication — ваши задачи (шаг 9).
Storage в Kubernetes
| Требование | Почему |
|---|---|
| ReadWriteOnce SSD | Latency WAL и random I/O |
| StorageClass с retain | Случайное удаление PVC не стирает prod |
| Достаточный IOPS | WAL sync — чувствителен к latency |
| Snapshots CSI | Бэкап на уровне volume — дополнение к pg_dump/Wal-G |
Local SSD (local-path-provisioner) даёт скорость, но привязку к node — complicates failover.
Операторы PostgreSQL
Вместо "голого" StatefulSet используют операторы:
| Оperator | Особенности |
|---|---|
| CloudNativePG | CNCF, backup Barman/Wal-G, failover |
| Zalando Postgres Operator | Patroni, Spilo образ, UI |
| Crunchy PGO | Enterprise-функции, pgBackRest |
Оператор создаёт CRD Cluster, управляет Patroni, backup jobs, connection pooler (PgBouncer sidecar).
Пример идеи (CloudNativePG — псевдо):
Код ITЗагрузка примера кода…
Несколько pod и сервисов
- postgres-rw — только primary (оператор выставляет label role=primary).
- postgres-ro — load balance SELECT на replicas.
Секреты и конфигурация
- Пароли — Kubernetes Secrets + rotation (External Secrets Operator).
postgresql.conf— ConfigMap + merge оператором или-cв spec.- NetworkPolicy — только namespace
app→ port 5432.
Anti-patterns
- Postgres в Deployment (не StatefulSet) с emptyDir.
- Horizontal Pod Autoscaler по CPU на primary — нельзя scale write master.
- Liveness probe, убивающая pod при long query.
- Общий NFS RWX для PGDATA — corruption risk; RWO на block storage.
- Запуск
VACUUM FULLна prod без окна.
Практика
- Minikube/kind — StatefulSet + PVC, проверка survive pod delete.
- Установите CloudNativePG или Zalando operator, кластер из 3 inst.
- Сравните latency managed vs self-hosted в том же регионе (pgbench).