Ответ
Развертывание stateful-приложений, таких как PostgreSQL, в Kubernetes требует особого подхода, так как им необходимо устойчивое хранилище и стабильные сетевые идентификаторы.
Ключевые концепции и ресурсы:
- StatefulSet: Вместо
Deployment. Гарантирует порядок развертывания и уникальные, постоянные идентификаторы подов (postgres-0,postgres-1). - PersistentVolume (PV) / PersistentVolumeClaim (PVC): Для хранения данных, которые должны сохраняться при перезапуске пода.
- Headless Service: Для стабильного DNS-имени каждого пода в StatefulSet (например,
postgres-0.postgres.default.svc.cluster.local).
Пример минимального StatefulSet для PostgreSQL:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: "postgres-hl" # Имя headless service
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:15
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates: # PVC создается для каждого пода автоматически
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
Рекомендации для production:
- Используйте операторы: Например, Zalando Postgres Operator или CloudNativePG, которые автоматизируют репликацию, бэкапы и отказоустойчивость.
- Рассмотрите managed-сервисы: Для production-нагрузок часто надежнее использовать внешний managed PostgreSQL (от облачного провайдера или сторонний сервис), чтобы отделить данные от оркестратора приложений.