Снапшоты

Снапшот — снимок содержимого постоянного тома (Persistent Volume / PVC) в определённый момент времени без создания нового тома. Снапшоты создаются средствами хранилища через совместимые CSI-драйверы и используются для быстрого отката данных, клонирования томов и точек восстановления перед рискованными операциями (например, перед обновлением БД).

В платформе «Штурвал» поддержка снапшотов обеспечивается оператором shturval-snapshotter (CSI Snapshotter). Оператор критически важен для работы платформы (отключить его нельзя); по умолчанию он устанавливается во включённом состоянии в клиентские кластеры и в кластер управления. Подробнее о сервисе — shturval-snapshotter.

Для чего нужны снапшоты

  • Точка восстановления — перед обновлением приложения, миграцией БД или массовыми изменениями данных можно создать снапшот и при необходимости откатиться к нему.
  • Клонирование тома — из снапшота можно создать новый PVC с теми же данными (копирование без выноса данных из системы хранения).
  • Краткосрочное резервирование — быстрый «снимок» на той же платформе хранения без копирования во внешнее хранилище.

Снапшоты не заменяют полноценное резервное копирование кластера и данных во внешнее хранилище. О различиях снапшотов и бэкапов см. Чем отличаются бэкапы и снапшоты.

Объекты Kubernetes для снапшотов

Оператор snapshotter вводит в кластере CRD (Custom Resource Definitions):

ОбъектОписание
VolumeSnapshotClassКласс снимков: задаёт атрибуты для создания снапшотов; основной параметр — используемый CSI-драйвер (аналог StorageClass для снапшотов).
VolumeSnapshotContentФактическое содержимое снапшота в системе хранения, связанное с объектом VolumeSnapshot (часто создаётся автоматически).
VolumeSnapshotОбъект в Kubernetes, описывающий снимок PVC — запрос на снимок конкретного тома в неймспейсе.

Сценарий: пользователь создаёт VolumeSnapshot, указывая источник (PVC) и VolumeSnapshotClass. Контроллер snapshotter создаёт снимок через CSI-драйвер и при успехе создаёт или обновляет VolumeSnapshotContent. По готовности снапшота из него можно создать новый PVC (восстановление или клонирование).

Поддержка снапшотов CSI-драйверами

Снапшоты используются с совместимыми CSI-драйверами. Поведение зависит от драйвера: часть создаёт снимок без остановки нагрузки, часть — только с остановкой нагрузки (PVC не должен использоваться подами).

Тип хранилищаCSI / модульПоддержка снапшотов
Локальное (RawFile)shturval-local-csiДа, только с остановкой нагрузки
CephFSshturval-ceph-csiДа, без остановки нагрузки
Ceph RBDshturval-ceph-csiДа, без остановки нагрузки
NFSshturval-nfs-csiДа
VMware vSphereshturval-capvs-csiДа1
OpenStack Cindershturval-capos-csiДа
oVirtshturval-capov-csiНет
vCloud Directorshturval-capvcd-csiНет

1 Для VMware vSphere нужно включить sidecar снапшотера в customvalues CSI и назначить учётной записи vCenter права на работу со снапшотами томов (CNS Searchable, Datastore.FileManagement). См. требования к учётной записи VMware vSphere, вкладку vSphere в шаге 1 и шаге 2.

Перед использованием снапшотов убедитесь, что в кластере включены CRD оператора snapshotter (shturval-snapshotter-crds) и Оператор snapshotter (shturval-snapshotter), а также соответствующий CSI-модуль для вашего типа томов. Сначала должны быть развёрнуты CRD, затем оператор. VolumeSnapshotClass должен указывать на driver, совместимый с вашим StorageClass.

Где управлять снапшотами

  • Состояние оператора: Сервисы и репозитории → Установленные сервисы → найдите Оператор snapshotter (shturval-snapshotter) → Управлять.
  • Объекты снапшотов (CR): выберите кластер → Администрирование → Кастомные ресурсы. В поле поиска можно ввести, например, snap — в списке останутся CRD, связанные со снапшотами томов.

Кастомные ресурсы снапшотов в интерфейсе кластера

На странице Кастомные ресурсы в таблице отображаются API группа, кастомный ресурс и количество ресурсов в кластере. Для снапшотов отдельных томов используется группа snapshot.storage.k8s.io — VolumeSnapshot, VolumeSnapshotClass, VolumeSnapshotContent. Группа groupsnapshot.storage.k8s.io содержит типы для групповых снапшотов: VolumeGroupSnapshot, VolumeGroupSnapshotClass, VolumeGroupSnapshotContent. Нажмите на название ресурса в таблице, чтобы открыть список его экземпляров и выполнить создание или просмотр. Доступны сортировка, фильтр по API-группе и сброс фильтров (Очистить все фильтры).

Манифесты можно также применить через импорт манифестов или kubectl apply -f.

Как создать снапшот, восстановить и клонировать том

Команды в каждом шаге общие. Манифесты VolumeSnapshotClass, VolumeSnapshot и PVC — на вкладке нужного драйвера.

Шаг 1. Проверить VolumeSnapshotClass

kubectl get VolumeSnapshotClass

Если класса для нужного драйвера нет, создайте его как приведено далее для каждого csi-провайдера. Для этого загрузите манифест VolumeSnapshotClass через импорт манифестов: иконка импорта слева от имени пользователя → вставьте или загрузите YAML → Проверить → Сохранить.

Модуль shturval-local-csi (драйвер rawfile.csi.openebs.io). Поддержка снапшотов — с версии 2.14.0.

VolumeSnapshotClass rawfile-localpv создаётся платформой. Если класса нет:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: rawfile-localpv
driver: rawfile.csi.openebs.io
deletionPolicy: Delete
parameters: {}
ПараметрОписаниеТипПример
metadata.nameИмя VolumeSnapshotClassstringrawfile-localpv
driverCSI-драйвер. Должен совпадать с provisioner StorageClassstringrawfile.csi.openebs.io
deletionPolicyУдалять (Delete) или сохранять (Retain) содержимое снимка при удалении VolumeSnapshotstringDelete
parametersПараметры драйвера. Для RawFile не требуютсяobject{}

Модуль shturval-ceph-csi (драйвер cephfs.csi.ceph.com). VolumeSnapshotClass по умолчанию не создаётся. Параметры clusterID, fsName и секрет должны совпадать с StorageClass и CSI-модулем. Неймспейс секрета — ceph-csi-operator.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: cephfs
driver: cephfs.csi.ceph.com
deletionPolicy: Delete
parameters:
  clusterID: <clusterID>
  fsName: <имя-файловой-системы>
  csi.storage.k8s.io/snapshotter-secret-name: <имя-секрета>
  csi.storage.k8s.io/snapshotter-secret-namespace: ceph-csi-operator
ПараметрОписаниеТипПример
metadata.nameИмя VolumeSnapshotClassstringcephfs
driverCSI-драйвер CephFS. Должен совпадать с provisioner StorageClassstringcephfs.csi.ceph.com
deletionPolicyУдалять (Delete) или сохранять (Retain) содержимое снимка при удалении VolumeSnapshotstringDelete
parameters.clusterIDИдентификатор кластера Ceph. Должен совпадать со StorageClassstringmy-cluster-id
parameters.fsNameИмя файловой системы CephFSstringmyfs
parameters.csi.storage.k8s.io/snapshotter-secret-nameИмя Secret с учётными данными Ceph для snapshotterstringcsi-cephfs-secret
parameters.csi.storage.k8s.io/snapshotter-secret-namespaceНеймспейс Secretstringceph-csi-operator

Модуль shturval-ceph-csi (драйвер rbd.csi.ceph.com). VolumeSnapshotClass по умолчанию не создаётся. Параметры clusterID, pool и секрет должны совпадать с StorageClass и CSI-модулем. Неймспейс секрета — ceph-csi-operator.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: cephrbd
driver: rbd.csi.ceph.com
deletionPolicy: Delete
parameters:
  clusterID: <clusterID>
  pool: <имя-пула>
  csi.storage.k8s.io/snapshotter-secret-name: <имя-секрета>
  csi.storage.k8s.io/snapshotter-secret-namespace: ceph-csi-operator
ПараметрОписаниеТипПример
metadata.nameИмя VolumeSnapshotClassstringcephrbd
driverCSI-драйвер Ceph RBD. Должен совпадать с provisioner StorageClassstringrbd.csi.ceph.com
deletionPolicyУдалять (Delete) или сохранять (Retain) содержимое снимка при удалении VolumeSnapshotstringDelete
parameters.clusterIDИдентификатор кластера Ceph. Должен совпадать со StorageClassstringmy-cluster-id
parameters.poolПул Ceph, в котором лежат RBD-образыstringrbd
parameters.csi.storage.k8s.io/snapshotter-secret-nameИмя Secret с учётными данными Ceph для snapshotterstringcsi-ceph-secret
parameters.csi.storage.k8s.io/snapshotter-secret-namespaceНеймспейс Secretstringceph-csi-operator

Модуль shturval-capvs-csi (драйвер csi.vsphere.vmware.com).

Включите sidecar csi-snapshotter в контроллере CSI с помощью применения ShturvalServicePatch к shturval-capvs-csi:

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: capvs-csi-volume-snapshots
spec:
  shturvalServiceConfigName: shturval-capvs-csi
  customvalues:
    controller:
      config:
        block-volume-snapshot: true
ПараметрОписаниеТипПример
metadata.nameИмя ресурса ShturvalServicePatchstringcapvs-csi-volume-snapshots
spec.shturvalServiceConfigNameИмя SSC сервиса CSI vSpherestringshturval-capvs-csi
spec.customvalues.controller.config.block-volume-snapshotВключить sidecar csi-snapshotter в контроллере CSI. Без true sidecar не запускаетсяbooleantrue

Без этого параметра sidecar снапшотера в поде CSI-контроллера нет.

Затем создайте VolumeSnapshotClass:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: vspherecsi
driver: csi.vsphere.vmware.com
deletionPolicy: Delete
parameters: {}
ПараметрОписаниеТипПример
metadata.nameИмя VolumeSnapshotClassstringvspherecsi
driverCSI-драйвер vSphere. Должен совпадать с provisioner StorageClassstringcsi.vsphere.vmware.com
deletionPolicyУдалять (Delete) или сохранять (Retain) содержимое снимка при удалении VolumeSnapshotstringDelete
parametersПараметры драйвера. Для vSphere не требуютсяobject{}

Модуль shturval-capos-csi (драйвер cinder.csi.openstack.org).

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: cinder
driver: cinder.csi.openstack.org
deletionPolicy: Delete
parameters:
  force-create: "true"
ПараметрОписаниеТипПример
metadata.nameИмя VolumeSnapshotClassstringcinder
driverCSI-драйвер Cinder. Должен совпадать с provisioner StorageClassstringcinder.csi.openstack.org
deletionPolicyУдалять (Delete) или сохранять (Retain) содержимое снимка при удалении VolumeSnapshotstringDelete
parameters.force-createСоздавать снапшот без остановки нагрузки. Без "true" снимок используемого тома не создаётсяstring“true”

Модуль shturval-nfs-csi (драйвер nfs.csi.k8s.io).

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: nfs
driver: nfs.csi.k8s.io
deletionPolicy: Delete
parameters: {}
ПараметрОписаниеТипПример
metadata.nameИмя VolumeSnapshotClassstringnfs
driverCSI-драйвер NFS. Должен совпадать с provisioner StorageClassstringnfs.csi.k8s.io
deletionPolicyУдалять (Delete) или сохранять (Retain) содержимое снимка при удалении VolumeSnapshotstringDelete
parametersПараметры драйвера. Для NFS CSI не требуютсяobject{}

Шаг 2. Создать VolumeSnapshot

Выберите вкладку драйвера, укажите PVC-источник и примените манифест:

kubectl apply -f volumesnapshot.yaml

Снапшоты создаются только с остановкой нагрузки: PVC не должен использоваться подами. Перед созданием VolumeSnapshot остановите нагрузку:

kubectl scale statefulset <имя-statefulset> -n <неймспейс> --replicas=0
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: <имя-снапшота>
  namespace: <неймспейс>
spec:
  volumeSnapshotClassName: rawfile-localpv
  source:
    persistentVolumeClaimName: <имя-pvc>
ПараметрОписаниеТипПример
metadata.nameИмя снапшотаstringapp-snap-1
metadata.namespaceНеймспейс PVC-источникаstringapp-data
spec.volumeSnapshotClassNameVolumeSnapshotClass драйвера RawFilestringrawfile-localpv
spec.source.persistentVolumeClaimNamePVC, с которого делается снимокstringdata-app-0

Обратите внимание! Снапшоты RawFile — локальная физическая копия на узле. Для production-нагрузок предпочтительнее внешнее хранилище (Ceph, vSphere и др.) и полноценное резервное копирование.

Снапшоты создаются без остановки нагрузки. Поды, которые используют PVC, могут продолжать работать — уменьшать число реплик Deployment или StatefulSet до 0 не требуется.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: <имя-снапшота>
  namespace: <неймспейс>
spec:
  volumeSnapshotClassName: cephfs
  source:
    persistentVolumeClaimName: <имя-pvc>
ПараметрОписаниеТипПример
metadata.nameИмя снапшотаstringapp-snap-1
metadata.namespaceНеймспейс PVC-источникаstringapp-data
spec.volumeSnapshotClassNameVolumeSnapshotClass драйвера CephFSstringcephfs
spec.source.persistentVolumeClaimNamePVC, с которого делается снимокstringdata-app-0

Снапшоты создаются без остановки нагрузки. Поды, которые используют PVC, могут продолжать работать — уменьшать число реплик Deployment или StatefulSet до 0 не требуется.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: <имя-снапшота>
  namespace: <неймспейс>
spec:
  volumeSnapshotClassName: cephrbd
  source:
    persistentVolumeClaimName: <имя-pvc>
ПараметрОписаниеТипПример
metadata.nameИмя снапшотаstringapp-snap-1
metadata.namespaceНеймспейс PVC-источникаstringapp-data
spec.volumeSnapshotClassNameVolumeSnapshotClass драйвера Ceph RBDstringcephrbd
spec.source.persistentVolumeClaimNamePVC, с которого делается снимокstringdata-app-0

Учётная запись vCenter, от имени которой работает CSI, должна иметь права на снапшоты томов. Учётная запись, которой достаточно для провижининга PVC, может не иметь прав на VolumeSnapshot.

Для VolumeSnapshot у роли CSI-пользователя должны быть:

  • CNS > Searchable (Cns.Searchable) — сервисная роль №2, на корневом объекте vCenter;
  • Datastore > Low level file operations (Datastore.FileManagement) — сервисная роль №1, на datastore, где лежат тома. Это право CNS требует для создания и удаления снапшотов блочных томов.

В сервисной роли №1 также есть Virtual machine > Snapshot management (Create / Remove / Rename / Revert snapshot). Для снапшотов томов CSI (FCD/CNS) в API vSphere указан Datastore.FileManagement; набор прав может зависеть от версии vSphere.

Полный перечень ролей — в требованиях к учётной записи VMware vSphere.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: <имя-снапшота>
  namespace: <неймспейс>
spec:
  volumeSnapshotClassName: vspherecsi
  source:
    persistentVolumeClaimName: <имя-pvc>
ПараметрОписаниеТипПример
metadata.nameИмя снапшотаstringapp-snap-1
metadata.namespaceНеймспейс PVC-источникаstringapp-data
spec.volumeSnapshotClassNameVolumeSnapshotClass драйвера vSpherestringvspherecsi
spec.source.persistentVolumeClaimNamePVC, с которого делается снимокstringdata-app-0

Если в VolumeSnapshotClass задано force-create: "true", снапшот создаётся без остановки нагрузки: поды, которые используют PVC, можно не останавливать.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: <имя-снапшота>
  namespace: <неймспейс>
spec:
  volumeSnapshotClassName: cinder
  source:
    persistentVolumeClaimName: <имя-pvc>
ПараметрОписаниеТипПример
metadata.nameИмя снапшотаstringapp-snap-1
metadata.namespaceНеймспейс PVC-источникаstringapp-data
spec.volumeSnapshotClassNameVolumeSnapshotClass драйвера Cinderstringcinder
spec.source.persistentVolumeClaimNamePVC, с которого делается снимокstringdata-app-0

Снапшоты создаются без остановки нагрузки.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: <имя-снапшота>
  namespace: <неймспейс>
spec:
  volumeSnapshotClassName: nfs
  source:
    persistentVolumeClaimName: <имя-pvc>
ПараметрОписаниеТипПример
metadata.nameИмя снапшотаstringapp-snap-1
metadata.namespaceНеймспейс PVC-источникаstringapp-data
spec.volumeSnapshotClassNameVolumeSnapshotClass драйвера NFSstringnfs
spec.source.persistentVolumeClaimNamePVC, с которого делается снимокstringdata-app-0

Шаг 3. Дождаться готовности снапшота

kubectl get VolumeSnapshot -n <неймспейс>

Убедитесь, что в колонке READYTOUSE значение true.

Пока снапшот не готов, восстанавливать или клонировать том нельзя.
CSI / модульОсобенности ожидания READYTOUSE
RawFile (shturval-local-csi)Статус станет true не сразу: снапшот — физическая копия данных. Копия на узле: /var/csi/rawfile/<имя-PV>/snapshots. Когда статус true, нагрузку можно снова запустить: kubectl scale statefulset <имя-statefulset> -n <неймспейс> --replicas=1
CephFS (shturval-ceph-csi)—
Ceph RBD (shturval-ceph-csi)—
vSphere (shturval-capvs-csi)Если статус остаётся false, проверьте sidecar block-volume-snapshot (шаг 1) и права учётной записи vCenter (шаг 2)
OpenStack (shturval-capos-csi)Если снапшот без остановки нагрузки не создаётся, проверьте параметр force-create: "true" в VolumeSnapshotClass (шаг 1)
NFS (shturval-nfs-csi)—

Шаг 4. Восстановить или клонировать PVC

Укажите снапшот в dataSource и загрузите манифест PersistentVolumeClaim. Размер запрашиваемого тома должен быть не меньше исходного.

  • Восстановление того же тома (например, PVC StatefulSet): остановите нагрузку, удалите исходный PVC, создайте PVC с тем же именем из снапшота, затем снова запустите нагрузку.

Пример восстановления PVC StatefulSet:

kubectl scale statefulset <имя-statefulset> -n <неймспейс> --replicas=0
kubectl delete pvc -n <неймспейс> <имя-pvc>
kubectl apply -f pvc-from-snapshot.yaml
kubectl scale statefulset <имя-statefulset> -n <неймспейс> --replicas=1
  • Клонирование: создайте PVC с новым именем. Исходный том можно не удалять:
kubectl apply -f pvc-from-snapshot.yaml

В PVC укажите StorageClass local-path. Для него типичен volumeBindingMode: WaitForFirstConsumer: PVC останется в Pending, пока его не смонтирует под.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: <имя-pvc>
  namespace: <неймспейс>
spec:
  storageClassName: local-path
  dataSource:
    name: <имя-снапшота>
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: <размер>
ПараметрОписаниеТипПример
metadata.nameИмя PVC. Для восстановления StatefulSet — то же имя, что у исходного PVCstringdata-app-0
metadata.namespaceНеймспейс PVCstringapp-data
spec.storageClassNameStorageClass исходного тома RawFilestringlocal-path
spec.dataSource.nameИмя VolumeSnapshot-источникаstringapp-snap-1
spec.dataSource.kindТип источника данныхstringVolumeSnapshot
spec.dataSource.apiGroupAPI-группа снапшотовstringsnapshot.storage.k8s.io
spec.accessModesРежим доступа. Обычно совпадает с исходным PVCarrayReadWriteOnce
spec.resources.requests.storageРазмер тома, не меньше исходногоstring100Mi

В PVC укажите тот же StorageClass, что у исходного тома. Имя по умолчанию после установки модуля — csi-cephfs-sc.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: <имя-pvc>
  namespace: <неймспейс>
spec:
  storageClassName: csi-cephfs-sc
  dataSource:
    name: <имя-снапшота>
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: <размер>
ПараметрОписаниеТипПример
metadata.nameИмя PVC. Для восстановления StatefulSet — то же имя, что у исходного PVCstringdata-app-0
metadata.namespaceНеймспейс PVCstringapp-data
spec.storageClassNameStorageClass исходного тома CephFSstringcsi-cephfs-sc
spec.dataSource.nameИмя VolumeSnapshot-источникаstringapp-snap-1
spec.dataSource.kindТип источника данныхstringVolumeSnapshot
spec.dataSource.apiGroupAPI-группа снапшотовstringsnapshot.storage.k8s.io
spec.accessModesРежим доступа. Обычно совпадает с исходным PVCarrayReadWriteMany
spec.resources.requests.storageРазмер тома, не меньше исходногоstring100Mi

В PVC укажите тот же StorageClass, что у исходного тома. Имя по умолчанию после установки модуля — csi-cephrbd-sc.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: <имя-pvc>
  namespace: <неймспейс>
spec:
  storageClassName: csi-cephrbd-sc
  dataSource:
    name: <имя-снапшота>
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: <размер>
ПараметрОписаниеТипПример
metadata.nameИмя PVC. Для восстановления StatefulSet — то же имя, что у исходного PVCstringdata-app-0
metadata.namespaceНеймспейс PVCstringapp-data
spec.storageClassNameStorageClass исходного тома Ceph RBDstringcsi-cephrbd-sc
spec.dataSource.nameИмя VolumeSnapshot-источникаstringapp-snap-1
spec.dataSource.kindТип источника данныхstringVolumeSnapshot
spec.dataSource.apiGroupAPI-группа снапшотовstringsnapshot.storage.k8s.io
spec.accessModesРежим доступа. Обычно совпадает с исходным PVCarrayReadWriteOnce
spec.resources.requests.storageРазмер тома, не меньше исходногоstring100Mi

В PVC укажите StorageClass vSphere CSI, обычно vsphere-csi.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: <имя-pvc>
  namespace: <неймспейс>
spec:
  storageClassName: vsphere-csi
  dataSource:
    name: <имя-снапшота>
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: <размер>
ПараметрОписаниеТипПример
metadata.nameИмя PVC. Для восстановления StatefulSet — то же имя, что у исходного PVCstringdata-app-0
metadata.namespaceНеймспейс PVCstringapp-data
spec.storageClassNameStorageClass исходного тома vSphere CSIstringvsphere-csi
spec.dataSource.nameИмя VolumeSnapshot-источникаstringapp-snap-1
spec.dataSource.kindТип источника данныхstringVolumeSnapshot
spec.dataSource.apiGroupAPI-группа снапшотовstringsnapshot.storage.k8s.io
spec.accessModesРежим доступа. Обычно совпадает с исходным PVCarrayReadWriteOnce
spec.resources.requests.storageРазмер тома, не меньше исходногоstring100Mi

В PVC укажите StorageClass Cinder: csi-cinder-sc-delete или csi-cinder-sc-retain — тот же, что у исходного тома.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: <имя-pvc>
  namespace: <неймспейс>
spec:
  storageClassName: csi-cinder-sc-delete
  dataSource:
    name: <имя-снапшота>
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: <размер>
ПараметрОписаниеТипПример
metadata.nameИмя PVC. Для восстановления StatefulSet — то же имя, что у исходного PVCstringdata-app-0
metadata.namespaceНеймспейс PVCstringapp-data
spec.storageClassNameStorageClass исходного тома Cinderstringcsi-cinder-sc-delete
spec.dataSource.nameИмя VolumeSnapshot-источникаstringapp-snap-1
spec.dataSource.kindТип источника данныхstringVolumeSnapshot
spec.dataSource.apiGroupAPI-группа снапшотовstringsnapshot.storage.k8s.io
spec.accessModesРежим доступа. Обычно совпадает с исходным PVCarrayReadWriteOnce
spec.resources.requests.storageРазмер тома, не меньше исходногоstring100Mi

В PVC укажите StorageClass NFS-провижинера. Имя по умолчанию — nfs-csi; если при установке модуля задали другое — используйте его.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: <имя-pvc>
  namespace: <неймспейс>
spec:
  storageClassName: nfs-csi
  dataSource:
    name: <имя-снапшота>
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: <размер>
ПараметрОписаниеТипПример
metadata.nameИмя PVC. Для восстановления StatefulSet — то же имя, что у исходного PVCstringdata-app-0
metadata.namespaceНеймспейс PVCstringapp-data
spec.storageClassNameStorageClass исходного тома NFSstringnfs-csi
spec.dataSource.nameИмя VolumeSnapshot-источникаstringapp-snap-1
spec.dataSource.kindТип источника данныхstringVolumeSnapshot
spec.dataSource.apiGroupAPI-группа снапшотовstringsnapshot.storage.k8s.io
spec.accessModesРежим доступа. Обычно совпадает с исходным PVCarrayReadWriteMany
spec.resources.requests.storageРазмер тома, не меньше исходногоstring100Mi
Если StorageClass использует volumeBindingMode: WaitForFirstConsumer, новый PVC может остаться в Pending с событием waiting for first consumer. Это ожидаемо: PVC перейдёт в Bound после появления пода, который его монтирует. Для клона без нагрузки создайте временный под, дождитесь Bound и удалите под.
Пример временного пода для привязки PVC
apiVersion: v1
kind: Pod
metadata:
  name: pvc-init
  namespace: <неймспейс>
spec:
  containers:
  - name: pause
    image: r.shturval.tech/pause:3.10.1
    volumeMounts:
    - mountPath: /data
      name: data
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: <имя-pvc>
ПараметрОписаниеТипПример
metadata.nameИмя временного подаstringpvc-init
metadata.namespaceНеймспейс PVCstringapp-data
spec.containers[].imageОбраз pause из реестра платформыstringr.shturval.tech/pause:3.10.1
spec.volumes[].persistentVolumeClaim.claimNamePVC, который нужно довести до Boundstringdata-app-0-clone

Если клоны создаются регулярно, в StorageClass можно сменить volumeBindingMode с WaitForFirstConsumer на Immediate.

Резервное копирование объектов снапшотов

Можно включить в бэкап ресурсы VolumeSnapshot и VolumeSnapshotContent, но данные снапшотов при этом не копируются.

После восстановления таких ресурсов снапшоты будут в статусе READYTOUSE=false. Поле может позже стать true, но это уже новое состояние снапшота, а не восстановленные данные исходного снимка.

Бэкап PV также не восстанавливает данные снапшотов. Для сохранности данных используйте резервное копирование во внешнее хранилище.

Ограничения и рекомендации

  • Снапшот фиксирует состояние тома на момент создания. Данные, записанные после создания снапшота, в снимок не попадают.
  • Для консистентности данных приложений (например, БД) перед созданием снапшота рекомендуется согласованно останавливать запись или использовать механизмы приложения (flush, freeze). Для RawFile остановка нагрузки обязательна.
  • Хранение снапшотов потребляет место в той же системе хранения; длительное хранение большого числа снапшотов может быть ограничено квотами и политиками провайдера.
  • Удаление PVC с существующими снапшотами может быть запрещено или требовать предварительного удаления снапшотов — зависит от политики reclaim и реализации драйвера.
  • Политика deletionPolicy в VolumeSnapshotClass: Delete — содержимое снимка удаляется вместе с объектом; Retain — содержимое сохраняется в системе хранения.