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 без даунтайма.
Поддерживаемые системы хранения
| Хранилище | Поддержка VolumeSnapshot | CSI 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 ресурса.