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

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.

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:16-alpine
ports:
- containerPort: 5432
envFrom:
- secretRef:
name: postgres-credentials
volumeMounts:
- name: pgdata
mountPath: /var/lib/postgresql/data
readinessProbe:
exec:
command: ["pg_isready", "-U", "app"]
initialDelaySeconds: 10
periodSeconds: 5
volumeClaimTemplates:
- metadata:
name: pgdata
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: fast-ssd
resources:
requests:
storage: 100Gi

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 — псевдо):

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: app-db
spec:
instances: 3
storage:
size: 100Gi
bootstrap:
initdb:
database: app
owner: app
backup:
barmanObjectStore:
destinationPath: s3://backups/app-db/

Несколько 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).

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


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").