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
Применение 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