Deploy CSI Driver for Dell PowerScale¶
Dell PowerScale is a scale-out NAS storage solution for AI and HPC workloads. Omnia deploys the Dell CSI PowerScale driver v2.17.0 on Kubernetes clusters using Helm charts, enabling persistent storage backed by PowerScale.
For more information on the CSI PowerScale driver, see the Dell CSM Installation Guide.
Note
- Omnia does not configure any PowerScale device via OneFS. It only configures the deployed Kubernetes cluster to interact with PowerScale storage.
- Sample
secret.yamlandvalues.yamlfiles are available inomnia/examples/powerscale_reference_files/CSI_driver/for reference only. Always download the actual files from the links provided in the prerequisite steps below.
Overview¶
Omnia automates the following steps when the CSI PowerScale driver is enabled:
- Creates the
isilonnamespace on the Kubernetes cluster - Creates and patches the
isilon-credssecret with Base64-encoded credentials fromomnia_config_credentials - Applies the empty certificate secret (
isilon-certs-0) - Deploys the external-snapshotter CRDs and snapshot controller (v8.5.0)
- Installs the CSI PowerScale driver via the
csi-install.shHelm installer - Creates the
ps01StorageClass and sets it as the default (demotingnfs-clientif present)
PowerScale SmartConnect (Optional)¶
To use the PowerScale SmartConnect hostname, you need an upstream DNS server that includes delegation mappings of hostname to PowerScale IP addresses.
During provisioning: Specify the upstream DNS server IP in
/opt/omnia/input/project_default/network_spec.yml:
---
Networks:
- admin_network:
oim_nic_name: <network name>
netmask_bits: "24"
primary_oim_admin_ip: "172.16.107.254"
primary_oim_bmc_ip: ""
dynamic_range: "172.16.107.201-172.16.107.250"
dns: ["10.x.x.x", "11.x.x.x"]
After provisioning: If the upstream DNS server was not specified during
provisioning, add the DNS server IP to network_spec.yml and re-run the
provision.yml playbook.
Prerequisites¶
-
Kubernetes cluster configured: A
service_k8s_clustermust be defined inomnia_config.ymlwithdeployment: true. See Set Up Kubernetes for details. -
NFS share for Kubernetes: An NFS mount entry named to match the
nfs_storage_namein yourservice_k8s_clustermust exist instorage_config.yml. This NFS share stores the CSI driver artifacts, Helm charts, and deployment scripts for the cluster nodes.File: /opt/omnia/input/project_default/storage_config.ymlmounts: - name: "nfs_k8s" source: "172.16.107.121:/mnt/share/omnia_k8s" mount_point: "/opt/omnia/k8s_mount" fs_type: "nfs" mnt_opts: "nosuid,rw,sync,hard,intr" mount_on_oim: true functional_group_prefix: ["service_kube"]Important
The
namevalue (e.g.,nfs_k8s) must match thenfs_storage_namefield inomnia_config.yml. -
Network configuration: Ensure that the storage and data networks are configured correctly via DHCP. The PowerScale endpoint must be reachable from both the OIM and the Kubernetes nodes.
-
DNS resolution: Upstream DNS resolution must be available from both the admin (PXE) and storage networks.
-
PowerScale system: Verify that the PowerScale system is operational and the OneFS API is accessible on the configured endpoint port.
-
Enable basic authentication on PowerScale:
Omnia uses basic authentication (
isiAuthType: 0) to connect with PowerScale devices. To check and enable it:a. SSH into the PowerScale node.
b. Check if basic auth is enabled:
Run on: PowerScale nodecat /usr/local/apache2/conf/webui_httpd.conf | grep -A 20 "# Platform API"c. If the response shows
IsiAuthTypeBasic Off, enable it:Run on: PowerScale nodeisi_gconfig -t web-config auth_basic=true -
Configure PowerScale user privileges:
Note
This step is required only if you want to collect PowerScale telemetry.
The username in
secret.yamlmust be from the PowerScale authentication providers with sufficient privileges. The required privileges are:Privilege Type ISI_PRIV_LOGIN_PAPI Read Only ISI_PRIV_NFS Read Write ISI_PRIV_QUOTA Read Write ISI_PRIV_SNAPSHOT Read Write ISI_PRIV_IFS_RESTORE Read Only ISI_PRIV_NS_IFS_ACCESS Read Only ISI_PRIV_IFS_BACKUP Read Only ISI_PRIV_AUTH_ZONES Read Only ISI_PRIV_SYNCIQ Read Write ISI_PRIV_STATISTICS Read Only For more information, see the CSM Installation Guide.
Create group and user for CSM
a. Create the group and user:
Run on: PowerScale nodeisi auth group create csmadmins --zone system isi auth user create csmadmin --password "P@ssw0rd123" \ --password-expires false --primary-group csmadmins --zone systemb. Create the role and assign permissions:
Run on: PowerScale nodeisi auth roles create CSMAdminRole \ --description "Dell CSM Admin Role" --zone System isi auth roles modify CSMAdminRole --zone System \ --add-priv-read ISI_PRIV_LOGIN_PAPI \ --add-priv-read ISI_PRIV_IFS_RESTORE \ --add-priv-read ISI_PRIV_NS_IFS_ACCESS \ --add-priv-read ISI_PRIV_IFS_BACKUP \ --add-priv-read ISI_PRIV_AUTH \ --add-priv-read ISI_PRIV_AUTH_ZONES \ --add-priv-read ISI_PRIV_STATISTICS isi auth roles modify CSMAdminRole --zone System \ --add-priv-write ISI_PRIV_NFS \ --add-priv-write ISI_PRIV_QUOTA \ --add-priv-write ISI_PRIV_SNAPSHOT \ --add-priv-write ISI_PRIV_SYNCIQ isi auth roles modify CSMAdminRole --add-group csmadminsNote
Verify all roles for the user have these privileges:
isi auth roles list -
Download and configure
secret.yaml:Run on: omnia_corewget https://raw.githubusercontent.com/dell/csi-powerscale/refs/heads/release/v2.17.0/samples/secret/secret.yamlUpdate the following parameters (keep the rest as defaults):
Parameter Value clusterNameYour desired cluster name endpointPowerScale SmartConnect hostname or IP endpointPortEndpoint port (default: 8080)isDefaulttrueImportant
Do not update the
usernameandpasswordfields insecret.yaml. Omnia reads these from theomnia_config_credentialsfile and automatically Base64-encodes and injects them during deployment.Note
If SmartConnect is configured, you can use the PowerScale hostname for
endpoint. Otherwise, use the PowerScale IP address. Ensure the endpoint is reachable from the OIM and the Kubernetes nodes. -
Download and configure
values.yaml:Run on: omnia_corewget https://raw.githubusercontent.com/dell/helm-charts/csi-isilon-2.17.0/charts/csi-isilon/values.yamlUpdate the following parameters (keep the rest as defaults):
Parameter Required Value Description controller.controllerCount1Number of CSI controller pods controller.replication.enabledfalseReplication must be disabled controller.snapshot.enabledtrueVolume snapshots must be enabled controller.resizer.enabledfalseVolume expansion is not supported node.dnsPolicyDefaultPod DNS policy for node daemonset skipCertificateValidationtrueSkip OneFS API certificate verification endpointPort8080OneFS API server HTTPS port isiAccessZoneSystemPowerScale access zone name isiPath/ifs/data/csiBase path for CSI volumes on PowerScale enableQuotafalseDisable SmartQuotas Caution
The
isiPathandisiAccessZonevalues are used by Omnia to generate theps01StorageClass. Ensure theisiPathdirectory exists on the PowerScale cluster before deployment.Warning
Once the PowerScale CSI driver is deployed, the parameters in
values.yamlcannot be changed. To modify them, you must first uninstall the driver (see Uninstallation) and then manually re-install it. -
Set up credentials: Run the
get_config_credentials.ymlplaybook and provide thecsi_usernameandcsi_passwordvalues when prompted. These credentials are stored in theomnia_config_credentialsvault file.Run on: omnia_coreansible-playbook utils/credential_utility/get_config_credentials.yml
Procedure¶
-
Add the CSI driver entry to the
softwaresarray in/opt/omnia/input/project_default/software_config.json:File: /opt/omnia/input/project_default/software_config.json{"name": "csi_driver_powerscale", "version": "v2.17.0", "arch": ["x86_64"]}Note
The
csi_driver_powerscaleentry is not present insoftware_config.jsonby default. You must add it manually to thesoftwareslist. -
Download required artifacts by running the
local_repo.ymlplaybook. This downloads the CSI PowerScale driver, Helm charts, external-snapshotter, and all required container images to the local repository:Run on: omnia_corecd /opt/omnia/local_repo ansible-playbook local_repo.yml -
Configure the CSI driver file paths in
/opt/omnia/input/project_default/omnia_config.ymlunder theservice_k8s_clustersection:File: /opt/omnia/input/project_default/omnia_config.ymlservice_k8s_cluster: - cluster_name: service_cluster deployment: true k8s_cni: "calico" pod_external_ip_range: "172.16.107.170-172.16.107.200" k8s_service_addresses: "10.233.0.0/18" k8s_pod_network_cidr: "10.233.64.0/18" nfs_storage_name: "nfs_k8s" k8s_crio_storage_size: "20G" csi_powerscale_driver_secret_file_path: "/opt/omnia/input/project_default/secret.yaml" csi_powerscale_driver_values_file_path: "/opt/omnia/input/project_default/values.yaml"Important
Both
csi_powerscale_driver_secret_file_pathandcsi_powerscale_driver_values_file_pathmust be absolute paths to the files you downloaded and configured in the prerequisites. If either path is empty, the CSI driver will not be deployed. -
Build cluster images by running the
build_imageplaybook. This bakes the CSI PowerScale driver artifacts and dependencies into the cluster node images:Run on: omnia_corecd /opt/omnia/build_image_x86_64 ansible-playbook build_image_x86_64.ymlNote
For aarch64 nodes, run the aarch64 variant instead:
cd /opt/omnia/build_image_aarch64 && ansible-playbook build_image_aarch64.yml -
Run the provisioning playbook to deploy Kubernetes and install the PowerScale CSI driver on the
service_k8s_cluster:Run on: omnia_corecd /opt/omnia/discovery ansible-playbook provision.ymlNote
If using OME-based discovery, add the
discovery_mechanismparameter:ansible-playbook provision.yml -e "discovery_mechanism=ome"
Verification¶
After successful execution of the provision.yml playbook, verify the
deployment on the service_kube_control_plane node.
-
Check CSI driver pods are running in the
isilonnamespace:Run on: kube_control_planekubectl get pods -n isilonExpected outputNAME READY STATUS RESTARTS AGE isilon-controller-xxxxxxxxx-xxxxx 5/5 Running 0 5m isilon-node-xxxxx 2/2 Running 0 5m -
Check the snapshot controller is running:
Run on: kube_control_planekubectl get pods -n kube-system | grep snapshot-controller -
Verify the StorageClass
ps01is created and set as default:Run on: kube_control_planekubectl get scExpected outputNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE ps01 (default) csi-isilon.dellemc.com Retain Immediate true 5m nfs-client cluster.local/nfs-... Delete Immediate true 30m -
Verify the isilon-creds secret exists:
Run on: kube_control_planekubectl get secret isilon-creds -n isilon
The ps01 StorageClass is automatically generated with the following
configuration derived from your values.yaml and secret.yaml:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ps01
provisioner: csi-isilon.dellemc.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
parameters:
AccessZone: System
AzServiceIP: <endpoint from secret.yaml>
Isipath: /ifs/data/csi
RootClientEnabled: "true"
csi.storage.k8s.io/fstype: "nfs"
If installation errors occur
Uninstall the CSI driver first (see Uninstallation), verify that all prerequisites are met, then manually re-install using the following commands:
kubectl create namespace isilon
kubectl create secret generic isilon-creds -n isilon \
--from-file=config="/opt/omnia/<csi-powerscale-version>/secret.yaml"
kubectl apply -f /opt/omnia/<csi-powerscale-version>/empty_isilon-certs.yaml
kubectl apply -f /opt/omnia/<csi-powerscale-version>/external-snapshotter/client/config/crd/
kubectl apply -f /opt/omnia/<csi-powerscale-version>/external-snapshotter/deploy/kubernetes/snapshot-controller/
cd /opt/omnia/<csi-powerscale-version>/dell-csi-helm-installer
./csi-install.sh --namespace isilon \
--values /opt/omnia/<csi-powerscale-version>/values.yaml
kubectl apply -f /opt/omnia/<csi-powerscale-version>/ps_storage_class.yml
Replace <csi-powerscale-version> with the versioned directory name
(e.g., csi-powerscale-v2.17.0).
Post Installation¶
Create a Custom Storage Class (Optional)¶
To create a custom storage class, use the sample storage class template:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: <storage class name>
provisioner: csi-isilon.dellemc.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
parameters:
clusterName: <powerscale cluster name>
AccessZone: System
AzServiceIP: <SmartConnect hostname or IP>
Isipath: <isipath configured in powerscale>
RootClientEnabled: "true"
csi.storage.k8s.io/fstype: "nfs"
Note
- If SmartConnect is configured with a delegated host list in the
external DNS server, you can provide the hostname for
AzServiceIP. Otherwise, use the PowerScale IP address. - If storage class parameters change for a PowerScale cluster, update the existing storage class or create a new one.
Apply the storage class:
kubectl apply -f <storageclass_file.yaml>
Create a Persistent Volume Claim (PVC)¶
Once the storage class is created, use it to create a PVC. Below is a sample deployment with a PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-powerscale
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: ps01
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-busybox-01
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: deploy-busybox-01
template:
metadata:
labels:
app: deploy-busybox-01
spec:
containers:
- name: busybox
image: docker.io/library/busybox:1.36
command: ["sh", "-c"]
args:
- "while true; do touch /data/datafile; rm -f /data/datafile; done"
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: pvc-powerscale
Apply the deployment manifest:
kubectl apply -f <manifest_filepath>
Verify the PVC¶
Check that the PVC is in Bound status:
kubectl get pvc -A
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
default pvc-powerscale Bound csivol-98d3e7631d 1Gi RWX ps01 27h
You can also verify the volume from the OneFS portal — it will show a
matching entry for the VOLUME name (e.g., csivol-98d3e7631d).
Uninstallation¶
To uninstall the PowerScale CSI driver manually:
-
Log in to the
service_kube_control_planenode. -
Navigate to the installer directory:
Run on: kube_control_planecd /opt/omnia/<csi-powerscale-version>/dell-csi-helm-installer -
Run the uninstall script:
Run on: kube_control_plane./csi-uninstall.sh --namespace isilon -
The driver is removed, but secrets and PVCs are not deleted automatically. Remove them manually from the
isilonnamespace if needed. -
To fully remove PowerScale resources (optional):
a. Delete the PowerScale secrets:
Run on: kube_control_planekubectl delete secret isilon-creds -n isilon kubectl delete secret isilon-certs-0 -n isilonb. Remove any custom deployments and PVCs that use the PowerScale storage class.
c. Remove the PowerScale storage class:
Run on: kube_control_planekubectl delete sc ps01d. Delete the snapshot controller deployment:
Run on: kube_control_planekubectl delete deployment snapshot-controller -n kube-systeme. Delete the isilon namespace:
Run on: kube_control_planekubectl delete namespace isilon
Updating OneFS credentials
If the OneFS portal credentials change, update the secret.yaml
manually:
- Update
secret.yamlwith the new credentials. - Copy the updated file to the
kube_control_planenode. -
Delete the existing secret:
Run on: kube_control_planekubectl delete secret isilon-creds -n isilon -
Create a new secret:
Run on: kube_control_planekubectl create secret generic isilon-creds -n isilon \ --from-file=config=<updated_secret.yaml_filepath>
Troubleshooting¶
CSI pods not starting¶
Run the following command to inspect pod events:
kubectl describe pods -n isilon
Common causes:
- PowerScale endpoint is unreachable from the Kubernetes nodes
secret.yamlcontains incorrect endpoint or credentials- NFS share is not mounted on the Kubernetes nodes
Driver already deployed¶
If the error message indicates the driver is already deployed, uninstall it first using the steps in Uninstallation before re-running the provisioning playbook.
StorageClass ps01 not created¶
The ps01 StorageClass is only created if all CSI pods reach Running
state. Check the pod status and logs:
kubectl logs -n isilon deployment/isilon-controller --all-containers
Next Steps¶
- Set Up Telemetry -- Deploy telemetry with PowerScale-backed persistent storage.
- Configure Mounts -- Configure NFS and other storage mounts for Slurm compute nodes.
- Set Up Kubernetes -- Review the Kubernetes cluster configuration options.