Skip to main content

Chris Engelbert Chris Engelbert

CSI Snapshot Architecture: VolumeSnapshotClass Design and Controller Internals

Jul 13, 2026  |  9 min read

CSI Snapshot Architecture: VolumeSnapshotClass Design and Controller Internals

Every Kubernetes cluster running stateful workloads has a VolumeSnapshotClass object, and most of them have exactly one. It was created once, during initial CSI driver setup, and every namespace and every workload has used it ever since. That works fine for a demo. It works fine in a staging cluster with a handful of test volumes. It stops working the day a compliance-tier database needs a longer retention window than a scratch volume, or a restore drags on because the snapshot chain behind that one default class was never designed for the workload calling it.

VolumeSnapshotClass is not a formality you set once and forget. It is the policy layer that decides which CSI driver parameters apply, what happens to the underlying snapshot when the VolumeSnapshot object is deleted, and, indirectly, how fast a restore comes back online during an incident. Getting it right means understanding both the control-plane objects that make up the snapshot chain and the backend mechanism that actually executes the capture.

How the CSI Snapshot Chain Actually Works

A snapshot request in Kubernetes passes through three distinct objects before it becomes a real point-in-time capture in your storage backend:

  1. VolumeSnapshotClass defines the policy: which CSI driver handles the request, the deletionPolicy (Retain or Delete), and any driver-specific parameters.
  2. VolumeSnapshot is the user-facing request, namespaced like a PersistentVolumeClaim, pointing at a source PVC and a VolumeSnapshotClass.
  3. VolumeSnapshotContent is the cluster-scoped object that binds the request to the actual backend snapshot handle once it exists.

Two controllers move a request through that chain. The CSI snapshot-controller watches VolumeSnapshot and VolumeSnapshotContent objects and enforces the lifecycle state machine, independent of any specific driver. The external-snapshotter sidecar, deployed alongside each CSI driver, translates those Kubernetes objects into the driver’s CreateSnapshot and DeleteSnapshot RPCs. One snapshot-controller instance can serve every driver in the cluster; each driver needs its own sidecar to speak CSI to it. This split matters for troubleshooting: a stuck VolumeSnapshot is a snapshot-controller or RBAC problem, a failed RPC is a sidecar or driver problem, and a slow ReadyToUse flip is almost always the backend, not Kubernetes. See the CSI driver vs sidecar breakdown for how this maps onto the broader driver architecture.

Everything up to the RPC call is standardized and identical across every CSI driver in existence. What happens after the driver receives CreateSnapshot is not standardized at all, and that is where snapshot behavior starts to diverge sharply between backends.

Designing VolumeSnapshotClass Policy Per Workload

A single default VolumeSnapshotClass is the most common snapshot misconfiguration platform teams carry into production, and it is rarely caught until an incident forces a restore. The fix is to treat snapshot classes the way you already treat StorageClass tiers: define a small, deliberate set that maps to how each workload actually needs to be protected, not one class applied uniformly.

A practical framework looks like this:

  • Fast-rollback class for stateless config volumes, CI scratch space, and dev/staging PVCs. deletionPolicy: Delete, short retention, no coordination needed.
  • Application-consistent class for OLTP databases like PostgreSQL or MySQL, paired with pre/post hooks that quiesce writes before the snapshot fires. Crash-consistent snapshots let most databases replay their write-ahead log and recover, but that replay costs restore time you may not have during an incident.
  • Long-retention compliance class for regulated data, with deletionPolicy: Retain so a namespace deletion or accidental VolumeSnapshot removal cannot destroy the underlying backend snapshot.

Scope each class with RBAC so a namespace or team can only request the classes appropriate to its workloads. That prevents a scratch-volume habit from accidentally attaching compliance-grade retention costs to throwaway data, and it prevents an under-protected class from ending up on a workload that needed better guarantees. If a service spans multiple PVCs, primary data, transaction logs, and metadata, a single-volume VolumeSnapshotClass per PVC is not enough on its own; see Kubernetes group snapshots for multi-volume apps for how VolumeGroupSnapshot closes that consistency gap across the set.

Diagram of the CSI snapshot control plane flowing from VolumeSnapshotClass policy through the snapshot-controller and CSI driver to the backend snapshot mechanism
Figure 1: VolumeSnapshotClass policy decisions travel through the snapshot-controller and CSI driver before they reach the backend, where the actual snapshot mechanism decides restore speed.

Where the Chain Breaks: Backend Snapshot Mechanism Decides Restore Speed

Everything in the previous two sections is Kubernetes-side policy. None of it controls what actually happens when the CSI driver’s CreateSnapshot RPC reaches the storage backend, and that is where snapshot architecture either scales or quietly degrades.

Teams coming from a VMware vSAN background carry an assumption worth naming: vSphere snapshots use redo-log chains, where each snapshot adds a delta file and every read has to walk back through the chain to find the current block. Chain depth grows with snapshot count, and both read latency and snapshot-consolidation time degrade as it grows. That is a known, managed tradeoff in vSphere operations, and it does not disappear just because the workload moved to Kubernetes. It reappears, in a different form, in any CSI backend that implements snapshots as a redo-chain rather than as a true copy-on-write point-in-time reference.

Snapshot mechanismSnapshot creation costBehavior as snapshot count growsRestore path
Hypervisor redo-log chain (vSphere/vSAN style)Fast createRead latency and consolidation time both degrade as chain depth increasesRequires walking or consolidating the chain
Full-copy backend snapshotSlow create, high space useSpace use grows linearly; no chain-depth penaltyFast, independent restore
Backend copy-on-write, metadata-only (simplyblock)Fast create, near-instantNo chain-depth degradation; each snapshot is an independent metadata referenceFast restore regardless of snapshot count

Table 1: How the backend’s snapshot mechanism, not the Kubernetes API layer, determines whether restores stay fast as snapshot count grows.

Designing VolumeSnapshotClass policy and still unsure if your backend’s snapshot mechanism will hold up under real restore load? Talk to us before a chain-depth problem shows up during an incident instead of during design review. Talk to a storage architect

The Kubernetes API layer looks identical either way. A VolumeSnapshot object reaches ReadyToUse: true regardless of which mechanism sits behind it. The difference only shows up under load, during a restore drill, or months later when snapshot count has grown past what anyone tested against. That is exactly the kind of gap a chain-depth problem hides in until an incident forces the question.

How simplyblock Implements CSI Snapshot Architecture on NVMe

Simplyblock’s CSI driver implements the full VolumeSnapshotClass / VolumeSnapshot / VolumeSnapshotContent chain against a backend that snapshots at the metadata layer rather than through a redo-log chain. Because the storage pool is disaggregated and served over NVMe/TCP and NVMe/RoCE, a snapshot is a zero-copy, copy-on-write reference recorded at the point in time it was taken, not a delta layered on top of a growing chain. Creating the hundredth snapshot of a volume costs the same as creating the first, and restoring from any of them does not require walking back through prior snapshots first.

That backend behavior is what makes the per-workload policy design in the second section actually deliver what it promises. A fast-rollback class stays fast no matter how many snapshots accumulate. An application-consistent class for a database combines quiesce hooks with a backend that does not add its own latency tax during the capture. Thin provisioning and per-volume QoS apply to snapshot and clone traffic the same way they apply to primary I/O, so a scheduled snapshot burst on one namespace does not starve another tenant’s foreground writes.

The architecture also carries the structural advantages that matter for teams standardizing storage across a mixed fleet: simplyblock runs the same CSI snapshot implementation whether the cluster sits on bare-metal Kubernetes, vSphere, Hyper-V, KubeVirt, or Red Hat® OpenShift®, so snapshot policy design does not have to be redone per hypervisor. And because licensing is priced per usable TB provisioned rather than per CPU core, adding snapshot retention or a higher-density node does not trigger a new per-core bill the way some infrastructure licensing does. For the full driver and clone/snapshot concept reference, see simplyblock for Kubernetes storage.

Questions and Answers

What is the difference between VolumeSnapshotClass, VolumeSnapshot, and VolumeSnapshotContent?

VolumeSnapshotClass is the policy object: it names the CSI driver, sets the deletionPolicy, and carries driver-specific parameters. VolumeSnapshot is the namespaced, user-facing request that points at a source PVC and a class. VolumeSnapshotContent is the cluster-scoped object that binds the request to the actual backend snapshot handle once the CSI driver confirms it exists. All three exist before a snapshot is usable for restore.

Why should a cluster use more than one VolumeSnapshotClass?

A single default class applies the same deletionPolicy and retention behavior to every workload, from scratch volumes to compliance-tier databases. That either under-protects data that needed longer retention or over-protects throwaway data with unnecessary retention cost. Defining classes by workload tier, fast-rollback, application-consistent, long-retention, and scoping them with RBAC per namespace, matches policy to actual recovery requirements instead of applying one setting everywhere.

Does the CSI snapshot API guarantee fast restores as snapshot count grows?

No. The Kubernetes snapshot API layer looks the same regardless of backend, but restore speed depends entirely on how the CSI driver’s backend implements the snapshot. A redo-log-chain backend, the same model vSphere and vSAN use, degrades in read latency and consolidation time as chain depth grows. A backend that snapshots at the metadata layer with true copy-on-write does not carry that penalty. ReadyToUse: true on the Kubernetes object does not tell you which mechanism is behind it.

How does simplyblock make CSI snapshots and clones fast on Kubernetes?

Simplyblock’s CSI driver implements snapshots as zero-copy, metadata-layer references over a disaggregated NVMe/TCP and NVMe/RoCE backend, so creation cost and restore speed stay flat regardless of how many snapshots a volume already has. Combined with per-volume QoS and thin provisioning, scheduled snapshot activity does not degrade latency for other tenants on the same cluster, and the same implementation runs unchanged across bare-metal Kubernetes, vSphere, Hyper-V, KubeVirt, and OpenShift.

You may also like:

NVMe/TCP vs NVMe/RoCE for Kubernetes Storage: Choosing the Right Fabric
NVMe/TCP vs NVMe/RoCE for Kubernetes Storage: Choosing the Right Fabric

NVMe over Fabrics gives Kubernetes clusters low-latency block storage over the network. The transport you pick, TCP or RoCE, determines your latency floor, infrastructure cost, and operational complexity. Here is how to choose.

We Break Our Storage So You Never Have To
We Break Our Storage So You Never Have To

Simplyblock runs 100+ hours of automated chaos engineering before every release: real NVMe hardware, real FIO workloads, four failure types injected under live load. This is what we test, why it is necessary, and what it means for your infrastructure.

NVMe Storage Cost Optimization in 2026: Erasure Coding, Thin Provisioning, and Compute Efficiency
NVMe Storage Cost Optimization in 2026: Erasure Coding, Thin Provisioning, and Compute Efficiency

NVMe drives deliver the performance Kubernetes stateful workloads need, but triple replication and thick provisioning multiply their cost fast. Here is a practical breakdown of erasure coding economics, thin provisioning, and how sub-millisecond latency reduces compute waste.