CSI Driver and Volume Snapshots
Overview
This tutorial explains how to set up the CSI Hostpath Driver in minikube and create volume snapshots.
Prerequisites
- latest version of minikube
- kubernetes v1.28 or later
What you’ll need
Support for volume snapshots in minikube is provided through the volumesnapshots addon. This addon provisions the required
CRDs and deploys the Volume Snapshot Controller. It is disabled by default.
Furthermore, the default storage provider in minikube does not implement the CSI interface and thus is NOT capable of creating/handling
volume snapshots. For that, you must first deploy a CSI driver. To make this step easy, minikube offers the csi-hostpath-driver addon,
which deploys the CSI Hostpath Driver. This addon is disabled
by default as well.
Thus, to utilize the volume snapshots functionality, you must:
1) enable the volumesnapshots addon AND
2a) either enable the csi-hostpath-driver addon OR
2b) deploy your own CSI driver
You can enable/disable either of the above-mentioned addons using
minikube addons enable [ADDON_NAME]
minikube addons disable [ADDON_NAME]
The csi-hostpath-driver addon deploys its required resources into the kube-system namespace and sets up a dedicated
storage class called csi-hostpath-sc that you need to reference in your PVCs. The driver itself is created under the
name hostpath.csi.k8s.io. Use this wherever necessary (e.g. snapshot class definitions).
Once both addons are enabled, you can create persistent volumes and snapshots using standard ways (for a quick test of
volume snapshots, you can find some example yaml files along with a step-by-step here).
The driver stores all persistent volumes in the /var/lib/csi-hostpath-data/ directory of minikube’s host.
Multi-Node Clusters
csi-hostpath-driver addon supports Multi-Node Clusters volume provisioning. It deploys DaemonSet that runs hostpath on each node to provision and claim volumes (See #12360 for more details).
Tutorial
In this tutorial, you use volumesnapshots addon(1) and csi-hostpath-driver addon(2a).
1Start your cluster
minikube start
2Enable addons
Enable volumesnapshots and csi-hostpath-driver addons:
minikube addons enable volumesnapshots
minikube addons enable csi-hostpath-driver
Optionally you could use it as a default storage class for the dynamic volume claims:
minikube addons disable storage-provisioner
minikube addons disable default-storageclass
kubectl patch storageclass csi-hostpath-sc -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
3Check volume snapshot class
When you create the volume snapshot, you have to register Volume Snapshot Classes to your cluster.
The default VolumeSnapshotClass called csi-hostpath-snapclass is already registered by csi-hostpath-driver addon.
You can check the VolumeSnapshotClass by the following command:
kubectl get volumesnapshotclasses
NAME                     DRIVER                DELETIONPOLICY   AGE
csi-hostpath-snapclass   hostpath.csi.k8s.io   Delete           10s
4Prepare persistent volume
Create persistent volume claim to create persistent volume dynamically:
# example-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-hostpath-sc
kubectl apply -f example-pvc.yaml
You can confirm that persistent volume is created by the following command:
kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS      REASON   AGE
pvc-388c33e2-de56-475c-8dfd-4990d5f7a640   1Gi        RWO            Delete           Bound    default/csi-pvc   csi-hostpath-sc            60s
5Take a volume snapshot
You can take a volume snapshot for persistent volume claim:
# example-csi-snapshot.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: snapshot-demo
spec:
  volumeSnapshotClassName: csi-hostpath-snapclass
  source:
    persistentVolumeClaimName: csi-pvc
kubectl apply -f example-csi-snapshot.yaml
You could get volume snapshot. You can confirm your volume snapshot by the following command:
kubectl get volumesnapshot
NAME            READYTOUSE   SOURCEPVC   SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS            SNAPSHOTCONTENT                                    CREATIONTIME   AGE
snapshot-demo   true         csi-pvc                             1Gi           csi-hostpath-snapclass   snapcontent-19730fcb-c34a-4f1a-abf2-6c5a9808076b   5s             5s
6Restore from volume snapshot
You can restore persistent volume from your volume snapshot:
# example-csi-restore.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-pvc-restore
spec:
  storageClassName: csi-hostpath-sc
  dataSource:
    name: snapshot-demo
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
kubectl apply -f example-csi-restore.yaml
You can confirm that persistent volume claim is created from VolumeSnapshot:
kubectl get pvc
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
csi-pvc           Bound    pvc-388c33e2-de56-475c-8dfd-4990d5f7a640   1Gi        RWO            csi-hostpath-sc   23m
csi-pvc-restore   Bound    pvc-496bab30-9bd6-4abb-94e9-d2e9e1c8f210   1Gi        RWO            csi-hostpath-sc   26s
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.