Резервное копирование на базе снимков диска

Создание снапшотов диска зависит от отдельного модуля snapshot-controller.
Модуль snapshot-controller должен быть включен, и так же настроен один из CSI-драйверов из списка.
Например, sds-local-volume в режиме LVM Thin

Создание Postgres Snapshot

Убедитесь, что выбранный spec.instanse.persistentVolumeClaim.storageClassName поддерживает снапшотинг. Если storageClassName не был указан явно, убедитесь, что storageClassName по умолчанию в кластере DKP поддерживает эту функцию.

Для создания снимка диска достаточно применить ресурс:

apiVersion: managed-services.deckhouse.io/v1alpha1
kind: PostgresSnapshot
metadata:
  name: my-first-snapshot
spec:
  postgresName: my-postgres

Результат снимка диска можно увидеть в статусе ресурса

➜  kubectl get postgressnapshot -n postgres-ek my-first-snapshot -oyaml | yq .status
completedAt: "2025-12-04T19:00:31Z"
phase: completed
postgres:
  cluster:
    replication: Availability
    topology: Ignored
  configuration:
    maxConnections: 300
  databases:
    - name: test
  instance:
    cpu:
      coreFraction: 50
      cores: 1
    memory:
      size: 1Gi
    persistentVolumeClaim:
      size: 1Gi
      storageClassName: thin-local-storage-class
  postgresClassName: default
  type: Cluster
startedAt: "2025-12-04T19:00:16Z"
volumeSnapshotName: d8ms-pg-my-first-snapshot

Восстановление из снапшота

Чтобы восстановить Postgres из снимка диска, нужно применить новый ресурс Postgres, указав параметр spec.dataSource

Обратите внимание, что операция практически идентична созданию нового кластера Postgres. То есть при создании такого ресурса будет проведены все валидации для соответствующего PostgresClass.
Это дает преимущество в том, что конфигурация для восстанавливаемого кластера может быть изменена на этом этапе.
Важное условие касается поля databases, так как мы используем декларативное описание логических баз данных, отсутствие имени какой-либо базы данный в списке будет означать,
что после восстановления - в итоговом кластере такая логическая база данных будет отсутствовать, даже если она существует в снапшоте. То же самое справедливо и для пользователей users.

kubectl apply -f managed-services_v1alpha1_postgres.yaml -n postgres
apiVersion: managed-services.deckhouse.io/v1alpha1
kind: Postgres
metadata:
  name: my-restored-postgres
spec:
  dataSource:
    objectRef:
      kind: PostgresSnapshot
      name: my-first-snapshot
  users:
    - name: test-rw
      hashedPassword: >-
        SCRAM-SHA-256$4096:8LTjDsWOlQ7fnvr0DqRQx0TXMTh6LIyQJow2UnNlsJE=$ZjQi5diDTvn0g7is1ez9qPSGm6SoGezF0FVCZXssDKw=:IEzN8Dz5KcGd1r47thky5XFRhXlIMeoNLNfZtIlGv/8=
      role: rw
    - name: test-ro
      password: '123'
      storeCredsToSecret: test-ro-creds
      role: ro
  databases:
    - name: "test"
  postgresClassName: default
  instance:
    memory:
      size: 1Gi
    cpu:
      cores: 1
      coreFraction: 50
    persistentVolumeClaim:
      size: 1Gi
      storageClassName: thin-local-storage-class
  configuration:
    maxConnections: 300
  type: Cluster
  cluster:
    topology: Ignored
    replication: Availability

Успех восстановления будет отражен в статусе создаваемого ресурса Postgres

  kubectl get postgres my-restored-postgres -n postgres -o wide -w