Volume Snapshot (Снапшот тома)

⌘K

Volume Snapshot (Снапшот тома)

Volume Snapshot — это механизм создания точной моментальной копии данных, хранящихся на Persistent Volume (PV), без остановки работы приложения и без вмешательства в работу подов. В отличие от традиционных дисковых снапшотов, которые фиксируют состояние всего виртуального или физического диска, volume snapshot в Kubernetes работает на уровне персистентного тома, задействованного конкретным Pod или StatefulSet.

Снапшоты томов позволяют разработчикам и операторам сохранять и восстанавливать состояние данных с точностью до конкретного момента времени, что критично для задач резервного копирования, миграции и восстановления после сбоев.


Ключевые свойства Volume Snapshot

  • Без остановки подов: создание снапшота не блокирует работу приложения — процессы продолжают работать в момент фиксации;
  • Интеграция с PVC/PV: снапшот связан с конкретным PersistentVolumeClaim, через VolumeSnapshotContent;
  • Глубокая интеграция с CSI (Container Storage Interface): управление снапшотами происходит через Kubernetes API (snapshot.storage.k8s.io);
  • Поддержка автоматизации: снапшоты могут создаваться вручную или по расписанию с помощью операторов, cronjob’ов или контроллеров хранения;
  • Гибкое восстановление: можно восстановить новый PVC на базе существующего снапшота — без перезапуска всей среды.

Пример использования VolumeSnapshot в Kubernetes

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: db-snapshot
spec:
  volumeSnapshotClassName: csi-aws-snap
  source:
    persistentVolumeClaimName: db-data

📌 Здесь создаётся снапшот тома db-data с помощью указанного CSI-класса.


Применение Volume Snapshot

  • Резервное копирование (backup) — в сочетании с CronJob, Velero, Stash и т.д.;
  • Быстрое восстановление после сбоев — critical path для disaster recovery;
  • Откат после обновления (rollback) — можно зафиксировать состояние перед релизом и быстро вернуться к нему;
  • Тестирование и staging — клонирование продакшн-данных в dev/stage без даунтайма.

Поддерживаемые системы хранения

ХранилищеПоддержка VolumeSnapshotCSI Driver
AWS EBSДаebs.csi.aws.com
GCP Persistent DiskДаpd.csi.storage.gke.io
Ceph RBD / CephFSДаceph-csi
LonghornДаВстроенная поддержка
OpenEBSДаЧерез csi.openebs.io

Архитектура Volume Snapshot

PVC  →  PV  →  CSI Driver  →  VolumeSnapshotContent  ← VolumeSnapshot
                                       ↑
                                 SnapshotClass
  • VolumeSnapshot — ресурс, описывающий снимок;
  • VolumeSnapshotContent — связь с физическим снапшотом в backend-хранилище;
  • VolumeSnapshotClass — определяет драйвер и параметры создания.

Почему это важно

  • Контейнерный backup-first подход — Volume Snapshot даёт Kubernetes-платформе встроенные средства восстановления и копирования;
  • Совместимость с GitOps — снапшоты можно автоматизировать и версионировать;
  • Масштабируемость — поддержка динамического снапшотинга в кластерах с десятками и сотнями PVC;
  • DevSecOps-friendly — можно снапшотить только зашифрованные PVC, с аудитом доступа через RBAC и логирование действий.

Готовые манифесты и сценарии для работы с Volume Snapshot в Kubernetes, включая создание, восстановление и автоматизацию через CronJob. Всё совместимо с CSI и Kubernetes v1.20+.

1. Создание VolumeSnapshot вручную

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: db-snapshot-2025-07-07
spec:
  volumeSnapshotClassName: csi-aws-snap
  source:
    persistentVolumeClaimName: db-pvc

📌 Этот манифест создаёт снимок PVC db-pvc с использованием класса csi-aws-snap.


2. Восстановление из снапшота (создание PVC из VolumeSnapshot)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: db-restore-pvc
spec:
  storageClassName: gp2
  dataSource:
    name: db-snapshot-2025-07-07
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

📌 Новый PVC будет создан на основе снапшота — полезно для rollback или клонирования в dev/staging.


3. Автоматизация через CronJob (ежедневный снапшот)

apiVersion: batch/v1
kind: CronJob
metadata:
  name: pvc-snapshot-daily
spec:
  schedule: "0 2 * * *"  # каждый день в 02:00
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: snapshotter
              image: bitnami/kubectl:latest
              command:
                - /bin/sh
                - -c
                - |
                  SNAP_NAME="db-snapshot-$(date +%Y%m%d%H%M)"
                  kubectl apply -f - <<EOF
                  apiVersion: snapshot.storage.k8s.io/v1
                  kind: VolumeSnapshot
                  metadata:
                    name: $SNAP_NAME
                  spec:
                    volumeSnapshotClassName: csi-aws-snap
                    source:
                      persistentVolumeClaimName: db-pvc
                  EOF

📌 Полностью автономный способ создания снапшотов по расписанию — можно дополнить ретеншн-логикой или label’ами.


4. VolumeSnapshotClass (для AWS EBS, пример)

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: csi-aws-snap
driver: ebs.csi.aws.com
deletionPolicy: Retain

📌 deletionPolicy: Retain — снапшоты сохраняются после удаления VolumeSnapshot ресурса.