Upgrade PX-CSI
Upgrading to Portworx CSI 25.8.0 introduces a major architectural simplification by removing components such as KVDB and system services.
- The pxctlCLI is removed starting in PX-CSI 25.8.0. Usekubectl,oc, or apply YAML manifests to manageCustomResourceobjects.
All metadata required for CSI operations is now stored as Kubernetes custom resources in the cluster's etcd. New resource types such as PureVolume and PureSnapshot replace the KVDB-managed state. During the upgrade, the Portworx Operator automatically migrates the existing metadata.
Starting from PX-CSI 25.8.0, a new ComponentK8sConfig custom resource (CR) named px-pure-csi-k8s-config is created by default. This CR instance can be used to configure CPU and memory limits, tolerations, and node affinity across PX-CSI components. For more information, see Configure resource limits, placements, tolerations, and nodeAffinity for PX-CSI components.
This guide walks you through the upgrade process while maintaining application availability and backward compatibility.
- The upgrade might briefly disrupt the creation of new persistent volume claims (PVCs) or attaching existing volumes to new nodes during migration. Plan this operation during a maintenance window to reduce impact.
- If the upgrade process fails with unrecoverable issues, you must contact Portworx Support for assistance.
Prerequisites
Ensure the following prerequisites are met:
- 
Your Kubernetes cluster meets the Portworx system requirements. 
- 
All Portworx Pods including KVDB are in a Runningstate.Check the cluster status using the following command: kubectl get pods -n <portworx>
- Delete any stale volumes from KVDB before migrating.
- Verify that API tokens and FlashArray/FlashBlade management endpoints are correct.
- Remove any tolerations in the StorageClusterthat useoperator: Exists, as they will block upgrade to version 25.8.0.
Upgrade the Portworx Operator
Before upgrading the StorageCluster, upgrade the Portworx Operator to the latest version.
- Kubernetes
- OpenShift
- 
Check the current Portworx Operator version: kubectl get deployment -n <portworx> portworx-operator -o=jsonpath='{.spec.template.spec.containers[0].image}'
- 
Edit the Operator deployment: kubectl edit deployment -n <portworx> portworx-operatorUpdate the image to use the latest version: containers:
 - name: portworx-operator
 image: portworx/px-operator:<latest-version>
- 
Verify the rollout status: kubectl rollout status deployment/portworx-operator -n <portworx>
Use the OpenShift web console to upgrade the Portworx Enterprise Operator via OperatorHub. See Red Hat documentation for details.
Upgrade the StorageCluster
- Kubernetes
- OpenShift
- 
Retrieve the name of your Portworx StorageCluster:kubectl get storagecluster -n <portworx>
- 
Modify the spec.imagefield in theStorageClusterresource to update the image version:kubectl edit storagecluster -n <portworx> <px-cluster-name>Find the following section: apiVersion: core.libopenstorage.org/v1
 kind: StorageCluster
 metadata:
 name: px-cluster-xxxxxxxx-xxxx-xxxx-xxxx-f7ed5df73365
 namespace: <portworx>
 spec:
 image: portworx/oci-monitor:<current-version>Set the spec.imagevalue toportworx/px-pure-csi-driver:<desired-version>
- 
(Optional) If you are migrating from Portworx Essentials with FlashArray/FlashBlade to PX-CSI, update the portworx.io/misc-argsannotation to include:portworx.io/misc-args: "--oem px-csi"
- 
Save the changes and monitor the migration: - 
Check the status of migration Pods: kubectl get pods -n <portworx> | grep pure-csi-migrator
- 
View the StorageClusterstatus:kubectl get storagecluster -n <portworx> -o yamlVerify that the migration is complete. status:
 clusterName: px-cluster-xxxxxxxx-xxxx-xxxx-xxxx-f7ed5df73365
 clusterUid: xxxxxxxx-xxxx-xxxx-xxxx-415323ca725b
 conditions:
 - lastTransitionTime: "2025-09-03T08:33:13Z"
 message: Pure CSI Driver migration completed successfully
 source: PxCSI
 status: PureCSIMigrationCompleted
 type: PxCSIMigration
- 
Verify that the PureStorageClusterresource was created:kubectl get purestoragecluster -n <portworx>
 
- 
- 
Verify the upgrade: kubectl get pods -n <portworx>
 kubectl get storagecluster -n <portworx>
- 
Retrieve the name of your Portworx StorageCluster:oc get storagecluster -n <portworx>
- 
Modify the spec.imagefield in theStorageClusterresource to update the image version:oc edit storagecluster -n <portworx> <px-cluster-test>Find the following section: apiVersion: core.libopenstorage.org/v1
 kind: StorageCluster
 metadata:
 name: px-cluster-xxxxxxxx-xxxx-xxxx-xxxx-f7ed5df73365
 namespace: <portworx>
 spec:
 image: portworx/oci-monitor:<current-version>Set the spec.imagevalue toportworx/px-pure-csi-driver:<desired-version>
- 
(Optional) If you are migrating from Portworx Essentials with FlashArray/FlashBlade to PX-CSI, update the portworx.io/misc-argsannotation to include:portworx.io/misc-args: "--oem px-csi"
- 
Save the changes and monitor the migration: - 
Check the status of migration Pods: oc get pods -n <portworx> | grep pure-csi-migrator
- 
View the StorageClusterstatus:oc get storagecluster -n <portworx> -o yamlVerify that the migration status is complete: status:
 clusterName: px-cluster-xxxxxxxx-xxxx-xxxx-xxxx-f7ed5df73365
 clusterUid: xxxxxxxx-xxxx-xxxx-xxxx-415323ca725b
 conditions:
 - lastTransitionTime: "2025-09-03T08:33:13Z"
 message: Pure CSI Driver migration completed successfully
 source: PxCSI
 status: PureCSIMigrationCompleted
 type: PxCSIMigration
- 
Verify that the PureStorageClusterresource was created:oc get purestoragecluster -n <portworx>
 
- 
- 
Verify the upgrade: oc get pods -n <portworx>
 oc get storagecluster -n <portworx>
After a successful upgrade:
- Older Pods removed
- New Pods prefixed with px-pure-csi-
- Migrator Pods are retained for debugging
Clean up stale files
After the upgrade, some stale files, including pxctl, may remain on the nodes. Clean them up using the following command:
rm -rf /opt/pwx
rm -rf /etc/pwx
KVDB drives are not automatically deleted after migration. After completing a successful migration, verify that the migration has completed successfully before manually deleting the KVDB drives.
Troubleshooting
If the migration job fails, it automatically retries every 10 minutes. Migration is performed by the pre-pure-csi-migrator and post-pure-csi-migrator pods.
To investigate issues:
- 
Check the logs of the migrator pods to identify the root cause: kubectl logs -n <portworx> <migrator-pod-name>
- 
If needed, manually delete the failed job to trigger a rerun: kubectl delete job -n <portworx> <migrator-job-name>
- 
In rare cases, when migrating from Portworx version 25.6.0 or earlier, KVDB pods may continuously restart due to tolerations using operator: Exists. If this occurs, edit theStorageClusterspecification and remove the affected toleration to allow the migration to proceed. You can add specific key-based tolerations if needed.