Welcome to the new DOCS.vastdata.com. We've added new menus and a version selector, plus new persona and resource pages to help customers get started. Looking for a previous article? Use the docs search.

Installing the VAST CSI Driver

Prev Next

ℹ️ Info

Outcome: The VAST CSI driver is installed and can dynamically provision a persistent volume claim. This section is optional but recommended.

Before you begin: Install the RKE2 cluster and complete the optional CSI tenant, view, policy, and service-account setup.

Previous: Create a Podman Registry for the RKE2 Cluster  |  Next: Install DataEngine Prerequisites on the Kubernetes Cluster

Install Helm

Install Helm on the manager node only. The remaining cluster nodes do not need Helm.

Helm is typically downloaded as a binary.

Quickstart is a good place to start learning about Helm.

Download the Helm archive

On the manager node

cd ~
wget https://get.helm.sh/helm-v4.2.3-linux-amd64.tar.gz

Example Output

--2026-07-31 17:25:59--  https://get.helm.sh/helm-v4.2.3-linux-amd64.tar.gz
Resolving get.helm.sh (get.helm.sh)... 13.107.253.71, 13.107.226.71, 2620:1ec:48:1::71, ...
Connecting to get.helm.sh (get.helm.sh)|13.107.253.71|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19812941 (19M) [application/x-tar]
Saving to: ‘helm-v4.2.3-linux-amd64.tar.gz’

helm-v4.2.3-linux-amd64.tar.gz                100%[===============================================================================================>]  18.89M  55.3MB/s    in 0.3s

2026-07-31 17:25:59 (55.3 MB/s) - ‘helm-v4.2.3-linux-amd64.tar.gz’ saved [19812941/19812941]

Extract the Helm archive

tar -xzvf helm-v4.2.3-linux-amd64.tar.gz

Copy the binary to /usr/local/bin

sudo cp linux-amd64/helm /usr/local/bin/
sudo chmod 555 /usr/local/bin/helm

Install VAST CSI Driver

Install Custom Resource Definitions for snapshots

Run the following commands on the manager node

kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v7.0.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v7.0.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v7.0.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v7.0.1/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v7.0.1/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml

Add the Helm Repository for VAST CSI Driver

Add the Helm repository that contains the VAST CSI Driver Helm chart to the list of available repositories:

Add the Helm repository for VAST CSI Driver:

helm repo add vastcsi https://vast-data.github.io/vast-csi

Expected Output

"vastcsi" has been added to your repositories

Verify that the repository has been added:

helm repo list

The output is similar to the following:

NAME    URL 
vastcsi https://vast-data.github.io/vast-csi

Create a Kubernetes Namespace for VAST CSI Driver

kubectl create ns vast-csi

Expected Output

namespace/vast-csi created

Verify the Namespace

kubectl get ns

Example Output

NAME              STATUS   AGE
default           Active   3d18h
kube-node-lease   Active   3d18h
kube-public       Active   3d18h
kube-system       Active   3d18h
vast-csi          Active   2d19h

Create a Kubernetes Secret for VAST CSI Driver

Create secret.yaml

Modify the values in the YAML below to match your environment

Field

Description

name

Name for the Kubernetes secret

endpoint

VMS IP address of the VAST Cluster

username

CSI Driver service account created earlier

password

Password for the CSI Driver service account

tenant

Tenant created for the VAST CSI Driver

apiVersion: v1
kind: Secret
metadata:
  name: de-lab-csi
type: Opaque
stringData:
  endpoint: "10.143.12.206"
  username: "de-lab-csi-driver"
  password: "<csi-driver-password>"
  tenant: "de-lab-csi"

Run the command

kubectl apply -f secret.yaml -n vast-csi

Expected Output

secret/de-lab-csi created

Verify Secret

kubectl get secret -n vast-csi

Example Output

NAME         TYPE     DATA   AGE
de-lab-csi   Opaque   3      60s

Create a Helm Chart Configuration File for VAST CSI Driver

Create values.yaml

Modify the values in the YAML below to match your environment

vipPool

VIP Pool used for CSI Tenant

viewPolicy

View Policy created for CSI

secretName

Name of the secret that was just created

truncateVolumeName: 128

storageClasses:
  vast-nfs:
    vipPool: "de-lab-csi-vippool"
    storagePath: "/k8s/csi/pvcs"
    viewPolicy: "de-lab-csi-policy"
    volumeNameFormat: "csi:{namespace}:{name}:{id}"
    ephemeralVolumeNameFormat: "csi:{namespace}:{name}:{id}"
    mountOptions:
      - vers=3
      - proto=tcp
      - nconnect=16
    secretName: "de-lab-csi"
    secretNamespace: "vast-csi"
    setDefaultStorageClass: true
controller:
  runOnMaster: false
  runOnControlPlane: false
  nodeSelector:
    node-role.kubernetes.io/control-plane: "true"

Test the config file

helm template csi-driver vastcsi/vastcsi -f values.yaml

Example output (very long)

---
# Source: vastcsi/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: csi-driver-vast-controller-sa
  namespace: "default"
  labels:
    helm.sh/chart: vastcsi-2.6.5
    app.kubernetes.io/name: vastcsi
    app.kubernetes.io/instance: csi-driver
    app.kubernetes.io/managed-by: Helm
---
# Source: vastcsi/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: csi-driver-vast-node-sa
  namespace: "default"
  labels:
    helm.sh/chart: vastcsi-2.6.5
    app.kubernetes.io/name: vastcsi
    app.kubernetes.io/instance: csi-driver
    app.kubernetes.io/managed-by: Helm

<snip>    

Install the VAST CSI Driver Helm Chart

Refresh Helm repository information:

helm repo update

Example Output

Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "vastcsi" chart repository
Update Complete. ⎈Happy Helming!⎈

Run the following command to initiate the install:

helm install <release name> <repo>/<chart> -f <filename>.yaml -n <namespace>

For example:

helm install csi-driver vastcsi/vastcsi -f values.yaml -n vast-csi

Example Output

NAME: csi-driver
LAST DEPLOYED: Mon Aug  3 15:29:36 2026
NAMESPACE: vast-csi
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None
NOTES:
Thank you for installing vastcsi.

Your release is named csi-driver.
The release is installed in namespace vast-csi

To learn more about the release, try:

  $ helm status -n vast-csi csi-driver
  $ helm get all -n vast-csi csi-driver

Examples on how to configure a storage class and start using the driver are here:
https://support.vastdata.com/s/topic/0TOV400000026yzOAA/vast-csi-driver

Validate the install

helm status -n vast-csi csi-driver

Example Output

NAME: csi-driver
LAST DEPLOYED: Mon Aug  3 15:29:36 2026
NAMESPACE: vast-csi
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
RESOURCES:
==> v1/StorageClass
NAME                 PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
vast-nfs (default)   csi.vastdata.com   Delete          Immediate           true                   4m37s

==> v1/ClusterRole
NAME                               CREATED AT
csi-driver-vast-provisioner-role   2026-08-03T15:29:36Z
csi-driver-vast-attacher-role   2026-08-03T15:29:36Z
csi-driver-external-resizer-runner   2026-08-03T15:29:36Z

==> v1/ClusterRoleBinding
NAME                                  ROLE                                           AGE
csi-driver-vast-provisioner-binding   ClusterRole/csi-driver-vast-provisioner-role   4m37s
csi-driver-vast-attacher-binding   ClusterRole/csi-driver-vast-attacher-role   4m37s
csi-driver-resizer-role   ClusterRole/csi-driver-external-resizer-runner   4m37s

==> v1/DaemonSet
NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
csi-vast-node   6         6         6       6            6           <none>          4m37s

==> v1/Pod(related)
NAME                  READY   STATUS    RESTARTS   AGE
csi-vast-node-8xvtp   2/2     Running   0          4m36s
csi-vast-node-bv69k   2/2     Running   0          4m36s
csi-vast-node-kpvgl   2/2     Running   0          4m36s
csi-vast-node-lfgmj   2/2     Running   0          4m36s
csi-vast-node-r5fmr   2/2     Running   0          4m36s
csi-vast-node-v5xlh   2/2     Running   0          4m36s
csi-vast-controller-777b946659-vcjkk   5/5   Running   0     4m36s

==> v1/Deployment
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
csi-vast-controller   1/1     1            1           4m36s

==> v1/CSIDriver
NAME               ATTACHREQUIRED   PODINFOONMOUNT   STORAGECAPACITY   TOKENREQUESTS   REQUIRESREPUBLISH   MODES                  AGE
csi.vastdata.com   true             true             false             <unset>         false               Persistent,Ephemeral   4m36s

==> v1/ServiceAccount
NAME                            AGE
csi-driver-vast-controller-sa   4m37s
csi-driver-vast-node-sa   4m37s

TEST SUITE: None
NOTES:
Thank you for installing vastcsi.

Your release is named csi-driver.
The release is installed in namespace vast-csi

To learn more about the release, try:

  $ helm status -n vast-csi csi-driver
  $ helm get all -n vast-csi csi-driver

Examples on how to configure a storage class and start using the driver are here:
https://support.vastdata.com/s/topic/0TOV400000026yzOAA/vast-csi-driver

Also run

helm list -n vast-csi

Example Output

NAME      	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART        	APP VERSION
csi-driver	vast-csi 	1       	2026-08-03 15:29:36.664472551 +0000 UTC	deployed	vastcsi-2.6.5

Additional Validations

kubectl get storageclass
NAME                 PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
vast-nfs (default)   csi.vastdata.com   Delete          Immediate           true                   13m

kubectl get csidrivers
NAME               ATTACHREQUIRED   PODINFOONMOUNT   STORAGECAPACITY   TOKENREQUESTS   REQUIRESREPUBLISH   MODES                  AGE
csi.vastdata.com   true             true             false             <unset>         false               Persistent,Ephemeral   14m

kubectl get pods -n vast-csi -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP            NODE                 NOMINATED NODE   READINESS GATES
csi-vast-controller-777b946659-vcjkk   5/5     Running   0          14m   10.144.19.53   ubuntu-03   <none>           <none>
csi-vast-node-8xvtp                    2/2     Running   0          14m   10.144.19.55   ubuntu-05   <none>           <none>
csi-vast-node-bv69k                    2/2     Running   0          14m   10.144.19.51   ubuntu-01   <none>           <none>
csi-vast-node-kpvgl                    2/2     Running   0          14m   10.144.19.56   ubuntu-06   <none>           <none>
csi-vast-node-lfgmj                    2/2     Running   0          14m   10.144.19.54   ubuntu-04   <none>           <none>
csi-vast-node-r5fmr                    2/2     Running   0          14m   10.144.19.52   ubuntu-02   <none>           <none>
csi-vast-node-v5xlh                    2/2     Running   0          14m   10.144.19.53   ubuntu-03   <none>           <none>

Create a PVC

Create a configuration file for a PVC (testpvc.yaml)as follows:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: vast-pvc-1
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: vast-nfs

Apply the PVC configuration file:

kubectl apply -f testpvc.yaml -n vast-csi

Expected Output

persistentvolumeclaim/vast-pvc-1 created

Verify that the PVC has been created with the following commands:

kubectl get pvc -n vast-csi

Example Output

NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
vast-pvc-1   Bound    pvc-c4090c55-09f4-4756-ac4e-2cc62eeb55f9   1Gi        RWX            vast-nfs       <unset>                 5m36s

kubectl get pv

Example Output

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-fab55a5d-3b8b-4c54-8c2a-31c50a4199a8   1Gi        RWX            Delete           Bound    vast-csi/vast-pvc-1   vast-nfs       <unset>                          19s

In Element Store → Views

image-20260803-180318.png

In Element Store → Quotas

image-20260803-181045.png