Как развернуть PostgreSQL в Kubernetes?

«Как развернуть PostgreSQL в Kubernetes?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Развертывание stateful-приложений, таких как PostgreSQL, в Kubernetes требует особого подхода, так как им необходимо устойчивое хранилище и стабильные сетевые идентификаторы.

Ключевые концепции и ресурсы:

  1. StatefulSet: Вместо Deployment. Гарантирует порядок развертывания и уникальные, постоянные идентификаторы подов (postgres-0, postgres-1).
  2. PersistentVolume (PV) / PersistentVolumeClaim (PVC): Для хранения данных, которые должны сохраняться при перезапуске пода.
  3. 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 (от облачного провайдера или сторонний сервис), чтобы отделить данные от оркестратора приложений.