Volume Snapshot в Kubernetes — это способ сделать моментальный снимок данных с конкретного Persistent Volume (через его PVC), не останавливая приложение. В отличие от «классических» снапшотов всего диска виртуалки, тут мы работаем именно с тем томом, который примонтирован к pod'у или StatefulSet'у. Это удобно, когда нужно сохранить состояние базы или другого стораджа «здесь и сейчас», а приложение продолжает жить своей жизнью.
За счёт этого можно довольно точно сохранять и восстанавливать данные к определённому моменту времени. Это важно и для бэкапов, и для миграций, и для восстановления после аварий.
Что важно знать про Volume Snapshot #
- Снапшот делается без остановки подов: приложение продолжает работать, когда в бэкэнде фиксируется состояние тома.
- Связка идёт через PVC: снимок создаётся для конкретного PersistentVolumeClaim, а физический объект описывается через VolumeSnapshotContent.
- Всё это завязано на CSI (Container Storage Interface) и отдельный API snapshot.storage.k8s.io.
- Можно автоматизировать создание снапшотов — руками, по cron, через операторы или контроллеры хранения.
- Восстановление гибкое: на основе снапшота создаётся новый PVC, и не нужно «пересобирать» всё окружение целиком.
Простой пример VolumeSnapshot #
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: db-snapshot
spec:
volumeSnapshotClassName: csi-aws-snap
source:
persistentVolumeClaimName: db-data
Здесь мы создаём снимок тома, который подвязан к PVC db-data, с использованием определённого класса снапшотов.
Где применяют Volume Snapshot #
- Резервное копирование (backup) — часто вместе с Velero, Stash или CronJob'ами.
- Быстрое восстановление после сбоев — особенно для критичных сервисов.
- Откаты после обновлений — можно зафиксировать состояние перед релизом и откатиться к нему, если что-то пошло не так.
- Тест и staging — клонировать боевые данные в dev/stage без простоя основного сервиса.
Примеры систем хранения, которые умеют VolumeSnapshot #
- AWS EBS — через CSI-драйвер ebs.csi.aws.com.
- GCP Persistent Disk — драйвер pd.csi.storage.gke.io.
- Ceph RBD / CephFS — через ceph-csi.
- Longhorn — поддержка снапшотов встроена.
- OpenEBS — через драйвер csi.openebs.io.
Как это устроено логически #
PVC → PV → CSI Driver → VolumeSnapshotContent ← VolumeSnapshot
↑
SnapshotClass
- VolumeSnapshot — объект, описывающий сам снимок.
- VolumeSnapshotContent — связь с реальным снапшотом в хранилище.
- VolumeSnapshotClass — указывает, каким драйвером и с какими параметрами делать снимок.
Почему это вообще важно #
- Это «native» способ делать backup в контейнерном мире: Kubernetes сам умеет управлять снапшотами томов.
- Хорошо встраивается в GitOps-подходы — операции можно описывать и автоматизировать, а не щёлкать вручную.
- Масштабируется: можно снапшотить десятки и сотни PVC в большом кластере.
- Удобно для DevSecOps: можно работать только с зашифрованными PVC, ограничивать доступ через RBAC и писать логи всех операций.
Дальше — несколько типовых манифестов для работы со снапшотами: создание, восстановление и автоматизация через CronJob. Всё это предполагает актуальный Kubernetes (v1.20+) и CSI-драйверы.
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'ов или поднятия копии базы в отдельном окружении.
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 - <Такая CronJob каждый день в указанное время создаёт новый снимок. Дальше можно добавить политику удержания снапшотов или помечать их метками для удобства.
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 в кластере уже убрали.
