--- title: "Deploying Ignition on VAST Block CSI Driver" slug: "deploying-ignition-on-vast-block-csi-driver" description: "Deploy Ignition SCADA/HMI on Kubernetes with VAST Block CSI Driver for persistent storage. Follow our step-by-step guide for a seamless setup." updated: 2026-10-30T21:26:43Z published: 2026-10-30T21:26:43Z canonical: "docs.vastdata.com/deploying-ignition-on-vast-block-csi-driver" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.vastdata.com/llms.txt > Use this file to discover all available pages before exploring further. # Deploying Ignition on VAST Block CSI Driver ## Intro This guide provides step-by-step instructions for deploying Ignition SCADA/HMI platform on Kubernetes using VAST Block CSI Driver for persistent storage. ## Prerequisites Before starting, ensure you have: - **Kubernetes cluster** (v1.20+) with kubectl configured - **Helm** (v3.0+) installed - **VAST Cluster 5.3+** with: - NVMe subsystem configured and associated with a VAST cluster view. - VMS user with appropriate permissions. - Virtual IP pool configured. - **Network connectivity** between Kubernetes nodes and the VAST cluster. ## Part 1: Deploy VAST Block CSI Driver **Note:** The full deployment procedure for the VAST Block CSI Driver is documented in the [VAST Block CSI Driver Documentation](/docs-5-5/docs/overview-of-block-storage-on-vast-cluster-tg). Follow those instructions to deploy the CSI driver, then return here to configure the storage class and deploy Ignition. ### Storage Class Requirements When deploying the VAST Block CSI Driver, ensure you create a storage class named vastdata-block that Ignition will use. Include the following in your Helm values file: ```yaml storageClasses:  vastdata-block:    vipPool: ""    subsystem: ""    fsType: "ext4"    allowVolumeExpansion: true    reclaimPolicy: "Delete" ``` | **Placeholder** | **Description** | **Example** | | --- | --- | --- | | | VAST Virtual IP Pool name | vippool-1 | | | VAST NVMe Subsystem name | block-subsystem | ### Verify CSI Driver Installation Before proceeding to deploy Ignition, verify the CSI driver is running and the storage class exists: ```plaintext kubectl get pods -n vast-csi kubectl get storageclass vastdata-block ``` Expected output should show all CSI pods in Running state and the storage class with the provisioner `block.csi.vastdata.com` ## Part 2: Deploy Ignition ### Step 2.1: Create Ignition Namespace ```plaintext kubectl create ns ignition ``` ### Step 2.2: Create Ignition Values File The Ignition Helm chart uses a StatefulSet that automatically creates its own PVC. We configure it to use VAST Block storage via `values.yaml`: ```yaml # Ignition Helm Values for VAST Block CSI # File: values.yaml # Accept Ignition EULA (required) commissioning:  acceptIgnitionEULA: true  edition: standard # Storage Configuration - use VAST Block CSI storage class statefulset:  # Storage class for the data volume  dataVolumeStorageClass: "vastdata-block"  # Storage size (adjust as needed)  dataVolumeStorageSize: 10Gi # Gateway configuration gateway:  # Preconfigure init container settings  preconfigure:    enabled: true    seedDataVolume: true    # Run preconfigure as root to handle block volume permissions    extraSpec:      securityContext:        runAsUser: 0        runAsGroup: 0  # Add init container to fix ownership AFTER preconfigure seeds the data  # This runs after preconfigure but before the main gateway container  initContainers:    - name: fix-permissions      image: busybox:latest      command:        - sh        - -c        - |          echo "Fixing permissions for Ignition user (2003)..."          chown -R 2003:2003 /data          chmod -R 755 /data          echo "Permissions fixed."      securityContext:        runAsUser: 0      volumeMounts:        - name: data          mountPath: /data # Pod security context - run main container as Ignition user (2003) podSecurityContext:  runAsUser: 2003  runAsGroup: 2003  fsGroup: 2003 ``` **Note on Volume Permissions:** Block CSI volumes are formatted with root ownership. The configuration above: 1. Runs the `preconfigure `init container as root so it can seed the data volume 2. Adds a `fix-permissions `init container to chown files to user 2003 3. Runs the main Ignition container as user 2003 (the Ignition default) ### Step 2.3: Deploy Ignition via Helm Add the Inductive Automation Helm repository: ```plaintext helm repo add inductiveautomation https://charts.ia.io helm repo update ``` Install Ignition: ```plaintext helm install ignition inductiveautomation/ignition \    -n ignition \    -f values.yaml ``` Expected output: ```plaintext NAME: ignition LAST DEPLOYED: NAMESPACE: ignition STATUS: deployed REVISION: 1 ``` ## Part 3: Validation ### Step 3.1: Verify CSI Driver Pods ```plaintext kubectl get pods -n vast-csi ``` All pods should be in the Running state with all containers ready. ### Step 3.2: Verify Storage Class ```plaintext kubectl get storageclass vastdata-block -o yaml ``` Confirm the provisioner is `block.csi.vastdata.com`. ### Step 3.3: Verify PVC is Bound ```plaintext kubectl get pvc -n ignition kubectl describe pvc data-ignition-gateway-0 -n ignition ``` Ensure status is `Bound `and the volume is provisioned. The PVC is automatically created by the StatefulSet. ### Step 3.4: Verify Ignition Deployment Check Ignition pods: ```plaintext kubectl get pods -n ignition ``` Expected output: ```plaintext NAME                 READY   STATUS    RESTARTS   AGE ignition-gateway-0   1/1     Running   0          2m ``` Check init container logs (should show successful permission fix): ```plaintext kubectl logs ignition-gateway-0 -n ignition -c preconfigure kubectl logs ignition-gateway-0 -n ignition -c fix-permissions ``` Check pod logs: ```plaintext kubectl logs -n ignition -l app.kubernetes.io/name=ignition --tail=50 ``` ### Step 3.5: Access Ignition Web Interface **Option A: Port Forward (for testing)** ```plaintext kubectl port-forward svc/ignition 8088:8088 -n ignition ``` Access Ignition at: http://localhost:8088 **Option B: Create a LoadBalancer Service** ```plaintext kubectl patch svc ignition -n ignition -p '{"spec": {"type": "LoadBalancer"}}' ``` Get the external IP: ```plaintext kubectl get svc ignition -n ignition ``` ## Troubleshooting ### Common Issues #### PVC stuck in Pending state Check CSI driver logs: ```plaintext kubectl logs -n vast-csi -l app.kubernetes.io/name=vastblock --tail=100 ``` Common causes: - Incorrect VAST credentials in the secret. - NVMe subsystem not configured. - VIP pool not reachable. #### Pod cannot mount volume Check events: ```plaintext kubectl describe pod -n ignition ``` Check node CSI driver: ```plaintext kubectl logs -n vast-csi -l app=csi-vast-node --tail=100 ``` #### Connection to VAST cluster fails Verify the secret: ```plaintext kubectl get secret vast-mgmt -n vast-csi -o yaml ``` Test connectivity from a pod: ```plaintext kubectl run test-connectivity --rm -it --image=busybox -- wget -O- http:// ``` ### Useful Commands ```plaintext # View all resources in ignition namespace kubectl get all -n ignition # View CSI driver resources kubectl get all -n vast-csi # Describe storage class kubectl describe storageclass vastdata-block # View PV details kubectl get pv # Check CSI driver version helm list -n vast-csi ``` ## Quick Reference ### File Summary | **File** | **Purpose** | | --- | --- | | vast-block-values.yaml | VAST Block CSI Driver Helm configuration | | values.yaml | Ignition Helm configuration (includes storage class and permission fixes) | ### Command Summary ```plaintext # Deploy VAST Block CSI kubectl create ns vast-csi kubectl create secret generic vast-mgmt --from-literal=endpoint='...' --from-literal=username='...' --from-literal=password='...' -n vast-csi helm repo add vastblock https://vast-data.github.io/vast-csi helm install vastdata-block-csi vastblock/vastblock -f vast-block-values.yaml -n vast-csi # Deploy Ignition (PVC is auto-created by StatefulSet) kubectl create ns ignition helm repo add inductiveautomation https://charts.ia.io helm install ignition inductiveautomation/ignition -n ignition -f values.yaml # Get admin password kubectl get secret -n ignition ignition-gateway-admin-password --template='{{ printf "%s\n" (index .data "gateway-admin-password" | base64decode) }}'   # Access Ignition kubectl port-forward svc/ignition 8088:8088 -n ignition ``` ## References - [VAST Block CSI Driver Documentation](/docs-5-5/docs/overview-of-block-storage-on-vast-cluster-tg) - [VAST CSI GitHub Repository](https://github.com/vast-data/vast-csi) - [Ignition Helm Charts](https://charts.ia.io/) - [Creating Block Storage Classes](/docs-5-5/docs/provisioning-block-storage-with-vms)