Перейти к основному содержимому

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.

Один pod без оператора

StatefulSet с replicas: 1 без Patroni/оператора — single point of failure. Pod reschedule на другой node возможен (RWO volume attach), но failover и replication — ваши задачи (шаг 9).


Storage в Kubernetes

ТребованиеПочему
ReadWriteOnce SSDLatency WAL и random I/O
StorageClass с retainСлучайное удаление PVC не стирает prod
Достаточный IOPSWAL sync — чувствителен к latency
Snapshots CSIБэкап на уровне volume — дополнение к pg_dump/Wal-G

Local SSD (local-path-provisioner) даёт скорость, но привязку к node — complicates failover.


Операторы PostgreSQL

Вместо "голого" StatefulSet используют операторы:

ОperatorОсобенности
CloudNativePGCNCF, backup Barman/Wal-G, failover
Zalando Postgres OperatorPatroni, Spilo образ, UI
Crunchy PGOEnterprise-функции, 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

  1. Postgres в Deployment (не StatefulSet) с emptyDir.
  2. Horizontal Pod Autoscaler по CPU на primary — нельзя scale write master.
  3. Liveness probe, убивающая pod при long query.
  4. Общий NFS RWX для PGDATA — corruption risk; RWO на block storage.
  5. Запуск VACUUM FULL на prod без окна.

Практика

  1. Minikube/kind — StatefulSet + PVC, проверка survive pod delete.
  2. Установите CloudNativePG или Zalando operator, кластер из 3 inst.
  3. Сравните latency managed vs self-hosted в том же регионе (pgbench).

Связанные материалы