Portworx Operator Release Notes
If you are running Portworx with restricted RBAC, Portworx Operator 26.3.0 and later versions require updated permissions. You must upgrade Portworx Operator by following the steps in the Upgrade Portworx Operator with restricted RBAC tab in Upgrade Operator installed using Portworx Central.
This ensures that the changes to the ClusterRole permissions are applied before the upgrade. Otherwise, the StorageCluster enters a degraded state because of a mismatch in the ClusterRole permissions.
26.4.0
September 29, 2026
New features
-
PX-StoreV1 to PX-StoreV2 migration for three-node clusters: The Portworx Operator now supports in-place migration from PX-StoreV1 (btrfs) to PX-StoreV2 (dm-thin) on clusters with three storage nodes. On a three-node cluster using internal KVDB, you must add the
portworx.io/migrate-storev1-to-v2-force-ack: "true"annotation to the StorageCluster in addition to theportworx.io/migrate-v1-to-v2annotation, to acknowledge that KVDB temporarily runs with only two members while a node is being converted. During migration, the operator reduces the replication factor to 2 for volumes that have a replication factor of 3 and a replica on the node being migrated, and restores the replication factor to 3 after the node returns to service. This feature requires Portworx Enterprise 3.7.0 or later. For more information, see Migrate Portworx Datastore from PX-StoreV1 to PX-StoreV2. -
Labels and annotations on operator-managed Kubernetes Services: You can now set custom labels and annotations on the Kubernetes Services created and managed by the Portworx Operator using the
ComponentK8sConfigcustom resource (CR). Use theservice/<service-name>workload name format to target a specific Service (for example,service/stork-service). For more information, see Configure resource limits, placements, tolerations, nodeAffinity, labels, and annotations for Portworx components. -
Configurable Stork scheduler performance settings: You can now configure Stork scheduler performance parameters directly in the StorageCluster spec. Set the following fields under
spec.stork.schedulerto tune how the stork-scheduler interacts with the Kubernetes API server and scores nodes:kubeSchedulerClientQPS— Steady-state limit on Kubernetes API calls per second (default:50, valid range: 1–10000).kubeSchedulerClientBurst— Maximum number of Kubernetes API calls the stork-scheduler can fire in a burst (default:100, valid range: 1–10000).kubeSchedulerExtenderWeight— Weight applied to the Stork extender's node scores (default:1).
The default extender weight has changed from
5to1in this release so that Stork's data-locality preference supplements rather than overrides the Kubernetes scheduler's scoring. Values are persisted across reconciles and upgrades. The stork-scheduler pods restart automatically when you change these values. For more information, see Configure Stork and Stork configuration.
Improvements
| Improvement Number | Improvement Description |
|---|---|
| PWX-55975 | The NodeDrain CR now exposes Kubernetes conditions that capture each stage of the drain process. You can monitor per-node migration progress by running kubectl describe nodedrain <name> and reviewing the Conditions section without requiring log access. |
| PWX-55635 | The px-libs-update DaemonSet, created when spec.pxfslibsUpdate is enabled, now inherits node placement rules from StorageCluster.spec.placement (nodeAffinity and tolerations). You can also override placement for this DaemonSet by using the ComponentK8sConfig CR with the PxLibsUpdate component and the px-libs-update workload name. Component names in ComponentK8sConfig are case-sensitive. For more information, see Update Portworx filesystem dependencies. |
| PWX-55558 | When Portworx rejects an environment variable set in spec.env of the StorageCluster because it is not on the allowlist, the Portworx Operator now emits a Kubernetes warning event on the StorageCluster object. Previously, the rejection was silent. This feature requires Portworx Enterprise 3.7.0 or later. |
| PWX-51064 | The Portworx Operator now validates service account tokens on each reconcile cycle and proactively rotates them if they are rejected with an Unauthorized or InvalidToken error. Previously, the operator rotated service account tokens only at a fixed time interval, which could leave invalidated tokens, for example, after a Kubernetes certificate renewal, in use until the next scheduled rotation. |
Fixes
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-56697 | Issue: On OpenShift clusters, the Portworx Operator deployed its own CSI snapshot-controller inside px-csi-ext even when openshift-cluster-storage-operator had already installed one. The pre-install detection matched only the substring /snapshot-controller: in container image names, but OpenShift ships a rebranded image that does not contain this substring.User Impact: Two snapshot-controllers competed to process VolumeSnapshot resources simultaneously, causing unpredictable snapshot behavior on OpenShift clusters.Resolution: The operator now detects pre-installed snapshot-controllers using stable identifiers — the app=csi-snapshot-controller and app.kubernetes.io/name=snapshot-controller labels and the snapshot-controller container name — in addition to image-name matching. When a pre-installed controller is found, the operator does not deploy its own and removes any stale container from px-csi-ext on the next reconcile.Affected versions: 26.3.1 and earlier | Major |
| PWX-56107 | Issue: The deprecated spec.cloudStorage fields maxStorageNodes, maxStorageNodesPerZone, and maxStorageNodesPerZonePerNodeGroup were still processed by the operator's reconciliation logic on Portworx 3.5.0 and later, where they have no functional effect. When any of these fields were set or changed, the operator could incorrectly classify nodes as ineligible for storage and enter a retry loop, causing cluster degradation. This was confirmed in P2 escalations at two enterprise customers.User Impact: Clusters running Portworx 3.5.0 or later with these deprecated fields present in their StorageCluster spec could experience node eligibility errors, 29-second retry loops, and storage disruption if those fields were modified. Resolution: The Portworx Operator now transparently ignores these deprecated fields during reconciliation on Portworx 3.5.0 and later. Field values are preserved in the Kubernetes spec, so GitOps tools such as Flux and Argo CD do not detect drift. The operator emits a Warning DeprecatedField event on the StorageCluster for each deprecated field still in use, so you can remove them at your own pace.Affected versions: 26.3.1 and earlier | Major |
| PWX-52052 | Issue: The portworx-api DaemonSet pod used the /status endpoint for its readiness probe, which returned success even when the underlying Portworx node was in maintenance mode. As a result, the pod remained Ready and continued to receive traffic from the portworx-api Service.User Impact: API calls from Stork and other Portworx API clients could be routed to nodes in maintenance mode, causing failed requests. Resolution: The portworx-api readiness probe now uses the /health endpoint, which correctly returns unhealthy when the Portworx node is in maintenance mode. The pod transitions to Not Ready, removing it from the Service endpoint pool.Affected versions: 26.3.1 and earlier | Major |
| PWX-46832 | Issue: The Portworx Operator allowed a StorageCluster spec to be applied even when the cluster name in the spec was different from the name used when the cluster was first installed. User Impact: Applying a StorageCluster spec with a different cluster name than the initialized cluster could cause the operator to attempt to reconfigure the cluster under an incorrect identity. Resolution: The Portworx Operator now validates that the cluster name in any StorageCluster spec matches the name recorded at initial installation. If the names differ, the operator rejects the operation with an error. Affected versions: 26.3.1 and earlier | Major |
26.3.2
September 8, 2026
This release addresses a security vulnerability.
Improvements
- StorageCluster admission control: The Portworx Operator now enforces cluster-admin rights for all create, update, and delete operations on StorageCluster resources by using a Kubernetes
ValidatingAdmissionPolicy(VAP). The operator denies unauthorized requests and logs them for auditing. This admission control enforcement requires Kubernetes 1.30 or later. On Kubernetes versions earlier than 1.30, the operator skips VAP creation and logs a warning; all other functionality is unaffected. If you manage the StorageCluster by using GitOps tools such as Argo CD or Flux, or through Helm, the service account or user performing the operation must havecluster-adminor equivalent rights. For more information, see StorageCluster Admission Control.
26.3.1
August 12, 2026
Fixes
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-57224 | Issue: On clusters where HTTP_PROXY and HTTPS_PROXY are configured on the Portworx Operator pod, the Operator cannot establish SDK/gRPC connections to portworx-service.<namespace>:9020, and the StorageCluster enters a Degraded state with repeated errors: Failed to connect gRPC server portworx-service.<namespace>:9020: context deadline exceeded. The operator dials the SDK service using the unqualified name portworx-service.<namespace>:9020, which does not match .cluster.local or .svc suffix entries in NO_PROXY, so the connection is routed through the proxy, which cannot resolve or reach the internal service.User Impact: DisruptionBudget reconciliation, rolling updates, and all StorageCluster control-plane operations that require SDK connectivity are blocked. The StorageCluster remains in the Degraded state until the proxy configuration is updated.Resolution: The Portworx Operator now ensures all internal service connections bypass the proxy. SDK connectivity to Portworx services is no longer affected by proxy configuration, regardless of how NO_PROXY is configured or what cluster DNS domain is used.Affected versions: 26.3.0 | Major |
| PWX-56935 | Issue: On OpenShift clusters where you install Portworx through OLM or OperatorHub, the Portworx Operator intermittently sets Stork to restricted RBAC permissions instead of the full permissions required for data protection. The operator determines its own permissions by scanning ClusterRoles with the olm.owner label. A prefix collision between the operator's versioned ClusterRole (portworx-operator.v<version>) and OperatorGroup-generated roles (such as olm.og.portworx-operatorgroup.admin) causes the operator to non-deterministically select the wrong role on some reconcile cycles. When a restricted OperatorGroup role is selected, Stork's permissions are restricted, removing list access to OpenShift Routes, ServiceAccounts, RoleBindings, and ControllerRevisions.User Impact: On affected OLM installations, Stork's RBAC permissions flip between restricted and full permissions on each reconcile cycle (as frequently as every 16 seconds), causing DataProtectionRBACMisconfigured warnings on the StorageCluster. During reconcile cycles with restricted permissions, Stork silently skips collection of OpenShift Routes and other resources during disaster recovery migrations, and subsequently deletes already-migrated copies of those resources on the DR cluster. This affects all OLM-based Portworx installations where the portworx-operatorgroup OperatorGroup exists and an exact-name portworx-operator ClusterRole is not present.Resolution: The Portworx Operator now reliably determines its own effective permissions and consistently configures Stork with the correct RBAC permissions for data protection operations. If the check cannot be completed, the operator retains Stork's existing permissions and retries on the next reconcile, preventing unintended permission downgrades. Affected versions: 26.1.0 to 26.3.0 | Major |
| PWX-57505 | Issue: On installations where the Portworx Operator runs with restricted permissions, the operator grants the Cache Agent (used for the OpenShift Dynamic Plugin and ACM disaster recovery) a wildcard ClusterRole based on the spec.stork.restrictDataProtectionRBAC flag alone, without checking whether the operator itself actually has those permissions.User Impact: On restricted-RBAC installations, such as OLM/OperatorHub deployments, the Cache Agent's ClusterRole reconcile can request permissions the operator doesn't have, which can cause the reconcile to fail or grant the Cache Agent broader access than intended, undermining restricted RBAC enforcement for the OpenShift Dynamic Plugin and ACM disaster recovery workflows. Resolution: The Portworx Operator now verifies that it actually holds wildcard permissions before granting them to the Cache Agent. If it doesn't, the Cache Agent runs with restricted permissions and the operator raises a DataProtectionRBACMisconfigured warning on the StorageCluster. If the check cannot be completed, the operator retains the Cache Agent's existing permissions and retries on the next reconcile.Affected versions: 26.1.0 to 26.3.0 | Major |
26.3.0
July 28, 2026
This release also addresses security vulnerabilities.
Portworx Operator 26.3.0 has a known issue related to proxy configuration. Refer to the known issues section for more information. We recommend that you upgrade directly to Portworx Operator 26.3.1.
Improvements
| Improvement Number | Improvement Description |
|---|---|
| PWX-47577 | The UninstallAndDelete delete strategy is now supported on Oracle Cloud Infrastructure, IBM Cloud, and FlashArray cloud drives. This option removes all Portworx components from the system, wipes storage devices, deletes Portworx metadata from KVDB, and removes the associated cloud drives. For more information, see Delete/Uninstall strategy. |
| PWX-49818 | When spec.customImageRegistry is set to registry.portworx.io (bare hostname), the Portworx Operator now automatically normalizes it to registry.portworx.io/portworx. Because that registry serves images only under the portworx namespace, using the bare hostname caused image pull failures. Existing clusters that already specify registry.portworx.io/portworx or a custom path are unaffected. For more information, see StorageCluster Schema. |
| PWX-32805 | The Portworx Operator now emits Kubernetes events on the PortworxDiag CR to report the lifecycle of automatically triggered periodic diagnostics collections. The events are: PeriodicDiagStarted when a collection begins, PeriodicDiagCompleted when it succeeds, and PeriodicDiagFailed when it ends in a failure or partial failure. These events appear in kubectl describe portworxdiag output without requiring log access. For more information, see Collect diagnostics using PortworxDiag custom resource. |
| PWX-47198 | The px-kvdb-auth secret used for external KVDB certificate authentication now supports the standard kubernetes.io/tls Kubernetes secret format (keys ca.crt, tls.crt, and tls.key), in addition to the existing Opaque secret format (keys kvdb-ca.crt, kvdb.crt, and kvdb.key). This lets you use certificates issued by cert-manager or similar tools without renaming keys. For more information, see Secure your etcd communication. |
Fixes
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-53752 | Issue: On dual-stack Kubernetes clusters where PX_PREFER_IPV6_NETWORK_IP was set to true in the StorageCluster spec, the portworx-service, portworx-api, and portworx-kvdb-service Kubernetes Services were created with IPv4 as the primary address family. Because Portworx was configured to listen only on IPv6, the mismatch broke all communication over these Services.User Impact: All service-based component communication failed on dual-stack clusters with IPv6 preference, including the Portworx Operator, Stork, and the OpenShift UI cache agent. Portworx storage I/O continued because it uses direct IP communication, but operator management, metrics collection, and plugin functionality were impaired. Resolution: The Portworx Operator now sets IPFamilies and IPFamilyPolicy on its managed Services to match the PX_PREFER_IPV6_NETWORK_IP value. When the variable is true, Services are SingleStack IPv6. When false, they are SingleStack IPv4. When unset, Kubernetes defaults apply.Affected versions: 26.2.1 and earlier | Major |
| PWX-55921 | Issue: After upgrading Portworx from version 3.4.x to 3.5.x, the fields maxStorageNodes, maxStorageNodesPerZone, and maxStorageNodesPerZonePerNodeGroup in spec.cloudStorage became deprecated and are no longer used by Portworx. When users removed these deprecated fields from their StorageCluster spec to clean up their configuration, the Portworx Operator incorrectly detected a spec change and triggered an unnecessary rolling pod restart across all Portworx storage nodes.User Impact: Users who removed deprecated CloudStorage fields from their StorageCluster spec after upgrading to Portworx 3.5.x experienced an unexpected rolling restart of all Portworx pods. This caused unnecessary disruption and temporary storage unavailability during the restart cycle, even though no functional configuration change was made. Resolution: The Portworx Operator now correctly ignores the deprecated maxStorageNodes, maxStorageNodesPerZone, and maxStorageNodesPerZonePerNodeGroup fields when evaluating whether a pod restart is required on Portworx 3.5.0 and later. Users who still have these fields set in their StorageCluster spec can safely remove them without triggering a pod rolling restart.Affected Version: 26.2.1 and earlier | Minor |
| PWX-55581 | Issue: When a third-party Kubernetes component (such as Kasten K10) had stale APIService registrations — for example, because its backing service pod was crashlooping or had been removed — the Portworx Operator failed every reconciliation loop with errors such as unable to retrieve the complete list of server APIs: <group>/v1alpha1: stale GroupVersion discovery: <group>/v1alpha1. This occurred because the operator used a cluster-wide API discovery call to check whether a CRD was present, and that call failed completely if any single registered APIService was stale, even one unrelated to Portworx.User Impact: Any cluster running a third-party product that registers APIService objects (such as Kasten K10, Velero, or cert-manager) was affected if those services became unavailable. The operator continuously failed to detect OpenShift, configure ServiceMonitors, set up KubeVirt StorageClass objects, and reconcile Autopilot, effectively stalling cluster lifecycle management until the third-party service was restored. Resolution: The Portworx Operator now uses a targeted, per-group API discovery call for each resource check instead of a single cluster-wide discovery call. This isolates CRD detection from unrelated, unresponsive third-party APIServices, so reconciliation continues even when stale APIService objects are present. Affected Version: 26.2.1 and earlier | Major |
| PWX-55566 | Issue: When upgrading an OpenShift cluster from version 4.20 to 4.21, the Portworx Operator did not add the required Dynamic Resource Allocation (DRA) RBAC permissions (resourceclaims, resourceslices, and deviceclasses) to the Stork scheduler ClusterRole. This occurred because the operator cached the Kubernetes version at startup and did not refresh it after a cluster upgrade, causing version-gated RBAC logic to behave as if the cluster was still running the older Kubernetes version.User Impact: The Stork scheduler lacked the RBAC permissions required by the latest Kubernetes version, causing KubeVirt VM migrations to become stuck. This blocked worker node upgrades from completing. Resolution: The Portworx Operator now refreshes its cached Kubernetes version from the API server every 5 minutes instead of only at startup, so the Stork scheduler ClusterRole picks up the required DRA RBAC permissions after a cluster upgrade without requiring a manual operator restart. Affected version: 26.2.0 | Major |
Known issues (Errata)
| Issue number | Description |
|---|---|
| PWX-56617, PWX-56728 | When a StorageCluster using FlashArray Cloud Drives (FACD) over iSCSI or Fibre Channel (FC) is removed by using deleteStrategy.type: UninstallAndDelete, Portworx correctly destroys the backing volumes and removes the corresponding host connections on the FlashArray. However, the node-wiper does not clean up the host-side transport layer: the device-mapper multipath maps and their underlying SCSI sd block devices for the deleted LUNs are left on each node as permanently failed faulty maps.User impact: Stale multipath maps and orphaned /dev/sd* and /sys/block SCSI devices persist on the storage nodes after uninstall. This has no functional impact on the cluster, but the affected nodes accumulate dead device entries until they are manually cleaned up or rebooted.Workaround: On each affected node, clear the faulty multipath map and then remove its underlying SCSI devices: multipath -f <wwid>echo 1 > /sys/block/sdX/device/delete (repeat for each path or use rescan-scsi-bus.sh --remove)Alternatively, reboot the node. Affected versions: 26.3.0. and earlier |
| PWX-53752 | After you upgrade Portworx Operator to 26.3.0 on a dual-stack Kubernetes cluster with PX_PREFER_IPV6_NETWORK_IP set to true, the portworx-service used by the Portworx proxy stays SingleStack IPv4 instead of migrating to IPv6, because the Portworx Operator does not delete and recreate this particular Service as a safeguard. Other Portworx Services (portworx-api, portworx-kvdb-service, and the backend portworx-service) migrate to IPv6 as expected, and the operator log repeatedly shows: IPFamilies/IPFamilyPolicy on Service <namespace>/portworx-service differ from desired; re-creatingUser impact: The IP family mismatch breaks communication between the Portworx proxy and the backend Portworx services. Workaround: Manually delete the service so the Portworx Operator recreates it with the correct IPv6 configuration: 1. Back up the manifest: kubectl get service portworx-service -n <namespace> -o yaml > portworx-proxy-service.yaml2. Delete the service: kubectl delete service portworx-service -n <namespace>3. The operator recreates portworx-service as SingleStack IPv6. If it doesn't, restore from the backup.Affected versions: 26.3.0 |
| PWX-57224 | On clusters where HTTP_PROXY and HTTPS_PROXY are configured on the Portworx Operator pod, Operator 26.3.0 cannot establish SDK/gRPC connections to portworx-service.<namespace>:9020, and the StorageCluster enters a Degraded state with repeated errors: Failed to connect gRPC server portworx-service.<namespace>:9020: context deadline exceeded. The operator dials the SDK service using the unqualified name portworx-service.<namespace>:9020, which does not match .cluster.local or .svc suffix entries in NO_PROXY, so the operator's gRPC client routes the connection through the proxy, which cannot resolve or reach the internal Service.User impact: DisruptionBudget reconciliation, rolling updates, and all StorageCluster control-plane operations that require SDK connectivity are blocked. The StorageCluster remains in the Degraded state until the proxy configuration is updated.Workaround: On OpenShift Container Platform (OLM-managed installs): Add .<namespace> to the NO_PROXY or no_proxy environment variable in the Portworx Operator Subscription. For example, if Portworx is installed in the portworx namespace:NO_PROXY=<existing-values>,.portworxOn other Kubernetes distributions: Edit the Portworx Operator Deployment directly and add the same entry to the proxy variable: 1. kubectl edit deployment portworx-operator -n <px-operator-namespace>2. Under the portworx-operator container's env: section, update the variable:- name: NO_PROXY value: "<existing-values>,.<namespace>"Note: Adding the service CIDR to NO_PROXY does not resolve this issue because Go evaluates CIDR entries only against literal IP addresses, not hostnames.Affected versions: 26.3.0 |
26.2.1
June 12, 2026
Fixes
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-55352 | Issue: On clusters where Kubernetes nodes carried a large number of labels, the Portworx Operator gRPC client failed to receive the storage node enumeration response because the payload exceeded the default 4 MiB gRPC receive limit. The operator logged ResourceExhausted errors and could not complete DisruptionBudget setup or rolling updates.User Impact: FailedComponent events appeared repeatedly on the StorageCluster object, PodDisruptionBudgets were not created or maintained, and Portworx rolling upgrades could not proceed because the operator could not enumerate storage nodes. OpenShift MachineConfigPool rollouts were also blocked during this window.Resolution: The Portworx Operator gRPC client receive limit has been increased from 4 MiB to 16 MiB, allowing the operator to handle storage node responses from clusters with nodes carrying large label sets. Affected version: 26.2.0 and earlier | Major |
Known issues (Errata)
| Issue number | Description |
|---|---|
| PWX-55627 | On OpenShift clusters using OLM-based (Operator Lifecycle Manager) upgrades, a probabilistic race condition can permanently strip custom fields from the StorageCluster spec. During an OLM upgrade to 26.2.x, the bundle CRD applies a narrowed schema for a brief window (6–10 seconds) before the new operator pod restores the full CRD schema. If the outgoing operator pod writes to the StorageCluster during this window, kube-apiserver prunes any fields that are absent from the narrowed bundle CRD schema, with no automatic recovery. User impact: The stripped fields are permanently removed from the StorageCluster spec. For example, if spec.security.secretProviderPerFeature is affected, Portworx may fail to start with the following error: failed to load Pure cloudops configuration: failed to fetch Pure credentials: StorageCluster secretsProvider is 'k8s', not 'vault'. Cannot fetch credentialsWorkaround: Scale down the Portworx Operator deployment before triggering the OLM-based upgrade. Scale it back up after the upgrade completes. This prevents the outgoing operator pod from writing to the StorageCluster during the window when the narrowed bundle CRD schema is active. Affected version: 26.2.0 and 26.2.1 |
| PWX-55812 | On clusters with separate management and data network interfaces where the data network (storage VLAN) is isolated and not routable from the Kubernetes pod network, KVDB TLS migration stalls indefinitely. During migration, the Portworx Operator verifies KVDB health by opening a direct TCP connection to each node's data IP. When the data network is not routable from the Kubernetes pod network, these connections fail even if etcd is healthy and has full quorum. User impact: The Portworx Operator logs one or more KVDB members are down, not proceeding with kvdb tls migration, numUnavailableKvdb <n>, numKvdbNodes <n> repeatedly and the StorageCluster transitions to a Degraded state.Affected version: 26.2.1 and earlier |
26.2.0
May 29, 2026
This release also addresses security vulnerabilities.
After upgrading to Portworx Operator version 26.2.0, the Stork and Telemetry pods restart.
New features
- ComponentK8sConfig support for Fusion Controller: The Portworx Operator now supports the ComponentK8sConfig custom resource for configuring Fusion Controller deployments. The operator automatically watches ComponentK8sConfig resources and applies the specified workload configurations to Fusion Controller components. For more information, see Configure Portworx Pods and Containers.
Fixes
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-53539 | When using Portworx Enterprise versions earlier than 3.6.0 with Portworx Operator 26.1.0 and the dynamic plugin enabled in the StorageCluster object, the operator repeatedly attempted to deploy the px-integration-operator because the image was not present in the installer endpoint. This behavior caused repeated warning messages and unnecessary API calls to the installer endpoint. The warning message was: Failed to setup Integration Operator. Deployment.apps "px-integration-operator" is invalid: spec.template.spec.containers[0].image: Required valueUser Impact: Repeated warning messages appeared in operator logs and StorageCluster object events, generating excessive log noise and additional API calls to the installer endpoint. Portworx storage operations were not affected. Resolution: The operator now skips deployment of the Integration Operator when the Portworx version is earlier than 3.6.0. Fusion integration requires Portworx Enterprise version 3.6.0 or later. Affected version: 26.1.0 | Minor |
26.1.0
April 6, 2026
New features
-
Everpure Fusion Integration: The Portworx Operator now supports Everpure Fusion integration. Use Fusion to centrally manage storage policies across your Kubernetes clusters. Enable it by using the
spec.purePlatformfield in the StorageCluster custom resource (CR). The operator automatically deploys the Integration Operator component when Fusion is enabled. The Integration Operator manages the Fusion controller life cycle.For more information about StorageCluster fields to enable Fusion integration, see the StorageCluster CRD reference.
Fusion integration requires Portworx Enterprise 3.6.0 or later. If you enable Fusion on earlier versions, the Operator displays a warning.
-
Restrict Data Protection RBAC: The Portworx Operator now supports a restricted RBAC mode for storage-only deployments that don't require data protection capabilities, such as backups or disaster recovery. You can limit Stork permissions or run the operator with the minimum required permissions to meet least privilege security requirements. For more information, see Restrict RBAC for Stork and Operator.
Note: This feature is not supported for PX-CSI.
Fixes
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-51912 | RBAC warnings related to VolumeAttributesClass were emitted from the PX-CSI resizer container on Kubernetes 1.34 or later. The warnings occurred because the PX-CSI controller ClusterRole lacked permissions to list VolumeAttributesClass resources.User Impact: Warning messages appeared in PX-CSI resizer container logs, which could cause confusion during troubleshooting. Resolution: The operator now grants the required RBAC permissions for VolumeAttributesClass to the PX-CSI controller ClusterRole, eliminating the warning messages.Affected Version: 25.6.1 and earlier | Minor |
| PWX-47895 | The operator did not automatically add systemMetadataDeviceSpec to the StorageCluster when PX-StoreV2 was specified in the annotation and preflight checks were skipped. This caused Portworx installations to fail with errors indicating that the system metadata device was not specified, which is required for PX-StoreV2 configurations.User Impact: Portworx installations with PX-StoreV2 failed when preflight checks were skipped, requiring manual intervention to add the systemMetadataDeviceSpec field.Resolution: The operator now automatically adds a default systemMetadataDeviceSpec when PX-StoreV2 is specified in the annotation, the systemMetadataDeviceSpec field is empty, and preflight checks are skipped.Affected Version: 25.6.1 and earlier | Major |
25.6.1
March 2, 2026
If you are upgrading from Portworx Operator version 25.6.0, review the Known issues (errata) section and apply any applicable workarounds for your environment.
Fixes
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-51697 | When you added custom annotations to operator-created StorageClass objects (except KubeVirt StorageClass objects px-rwx-block-kubevirt, px-rwx-file-kubevirt, and px-cdi-scratch), the operator removed them during reconciliation.User Impact: Integrations that relied on these annotations (for example, backup tools or GitOps systems) might not have detected the intended StorageClass objects. Resolution: The operator now preserves custom annotations on operator-created StorageClass objects. Affected Version: 25.6.0 | Major |
| PWX-49456 | If you created a VolumeSnapshotClass object named px-csi-snapclass, the operator deleted and recreated it. Custom annotations, labels, parameters, or deletion policy settings on operator-created VolumeSnapshotClass objects were not preserved.User Impact: Custom VolumeSnapshotClass configurations were lost, which might have affected snapshot workflows or integrations. Resolution: The operator now preserves existing VolumeSnapshotClass resources. If a VolumeSnapshotClass with the target name already exists in your cluster, the operator no longer modifies or overwrites it. Affected Version: 25.6.0 | Major |
| PWX-49374 | When the portworx.io/disable-storage-class: "true" annotation was applied to the StorageCluster, the operator could delete an existing StorageClass object if its name matched a default StorageClass introduced by the operator, even if that StorageClass was originally created by you. Additionally, Portworx Operator version 25.6.0 created StorageClass objects without the managed-by: operator label, which caused StorageClass objects to remain orphaned after uninstallation.User Impact: You could unexpectedly lose user-created StorageClass objects after upgrading the operator or enabling the disable-storage-class annotation, which could disrupt workloads relying on those StorageClass objects. Additionally, manual cleanup was required during uninstallation.Resolution: The operator now safely manages StorageClass objects by using explicit managed-by: operator ownership labels. The operator now deletes StorageClass objects only if they were created and labeled as operator-managed. User-created StorageClass objects are no longer modified or deleted, even if their names match default StorageClass objects.Affected Version: 25.6.0 | Major |
Known issues (Errata)
| Issue number | Description |
|---|---|
| PWX-51756 | If you add the portworx.io/disable-storage-class: "true" annotation to the StorageCluster after you install Portworx and then remove it, the Operator doesn’t recreate the KubeVirt StorageClass objects (px-rwx-block-kubevirt, px-rwx-file-kubevirt, and px-cdi-scratch) automatically. This issue doesn’t occur if the annotation is present during initial installation and then removed. User impact: In OpenShift clusters with virtualization enabled, the KubeVirt StorageClass objects aren’t created after you remove the disable-storage-class annotation that you added after installation. Workaround: Restart the Portworx Operator pod to trigger the recreation of the missing StorageClass objects. Affected version: 25.5.2 or later |
25.6.0
February 24, 2026
Install or upgrade to Portworx Operator version 25.6.1 instead of 25.6.0 to avoid the known issues with StorageClass and VolumeSnapshotClass objects management. For details, see the Known issues (errata) section.
Note: Existing PVs and volumes are not affected.
New features
-
Two-Node Arbiter (TNA) support for OpenShift: The Portworx Operator now supports Red Hat OpenShift two-node with arbiter (TNA) clusters for edge deployments. A TNA cluster has two control-plane nodes and one arbiter node. The arbiter stores Portworx KVDB data to maintain quorum and prevent split-brain, but it doesn’t store application data or run workloads. For more information, see Installation on OpenShift Two-Node with Arbiter Bare Metal Cluster.
Note: This feature requires Portworx Enterprise 3.5.2 or later and OpenShift Container Platform 4.20.11 or later.
-
OpenShift dynamic plugin configuration enhancements: You can now set custom images for Portworx OpenShift dynamic plugin components by using
spec.ocpDynamicPluginin the StorageCluster spec:pluginImage: Portworx plugin imageproxyImage: Portworx plugin proxy image
For more information, see StorageCluster CRD reference.
Portworx Plugin components (
px-pluginandpx-plugin-proxy) are now deployed only when the OpenShift Console plugin is enabled. In earlier versions, these components were always deployed, even when the plugin was disabled. You can configure resource limits, tolerations, and other settings for these components using theComponentK8sConfigCR.
-
Priority class configuration for all Portworx components: You can now set priority classes for Portworx components by using the
ComponentK8sConfigcustom resource (CR):spec.globalConfig.priorityClass: Apply one priority class to all Portworx components.spec.components.workloadConfigs.priorityClass: Override the global priority class for specific components.
A higher priority class helps keep Portworx pods scheduled and reduces the chance of eviction under resource pressure. For more information, see Configure Priority Class and ComponentK8sConfig CRD reference.
-
Autopilot Prometheus metrics and alerts: The Portworx Operator now exposes Prometheus metrics for Autopilot and adds the
AutopilotActionFailedalert when an action for a rule object fails. For more information, see Portworx Metrics and Portworx Alerts. -
ComponentK8sConfig in OpenShift Software Catalog:
ComponentK8sConfigis now available in the OpenShift Software Catalog as a Provided API. You can create and manageComponentK8sConfigresources in the OpenShift console to configure settings such as priority classes, resource limits, and deployment behavior. For more information, see ComponentK8sConfig CRD reference and Configure resource limits, placements, tolerations, nodeAffinity, labels, and annotations for Portworx components. -
Automated pxfslibs update DaemonSet: The Portworx Operator can now deploy and manage the pxfslibs update DaemonSet through the StorageCluster spec. This feature is supported only in air-gapped environments and simplifies updating filesystem dependencies. The Operator creates the DaemonSet, monitors execution, updates status, and cleans up. Configure it using
spec.pxfslibsUpdate. For more information, see Update Portworx filesystem dependencies and StorageCluster CRD reference.
Improvements
| Improvement Number | Improvement Description |
|---|---|
| PWX-49291 | Increased the default memory resources for px-telemetry-metrics-collector — requests from 64Mi to 128Mi and limits from 128Mi to 1000Mi. These defaults apply when no custom values are set using the ComponentK8sConfig CR. |
| PWX-48988 | Added RBAC get and list permissions for CSIDriver, StatefulSets, DaemonSets, and ReplicaSets to support diagnostics collection of storage-related Kubernetes objects. |
| PWX-43575 | Added RBAC get and list permissions for ControllerRevisions so diagnostics can capture these resources. |
| PWX-49290 | Increased the readiness probe timeout for telemetry registration and phone-home probes from 1s to 2s. This prevents intermittent failures when /ping-trusted responds successfully but exceeds the 1s client-side timeout. |
| PWX-50538 | You can now set the cluster domain at the cluster level or node level. Use the portworx.io/misc-args annotation for cluster-level configuration, or spec.nodes[].clusterDomain for node-level configuration (recommended for TNA). Node-level configurations override cluster-level settings. |
| PWX-49373 | Added RBAC get, list, and watch permissions for VolumeAttachment resources to the CSI node plugin service account. This change lets the PX-CSI Lister service monitor VolumeAttachment resources using informers on active clusters. |
Fixes
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-50225 | Issue: When internal KVDB TLS is enabled, the Operator could misclassify an in-progress installation as not a fresh installation if the cluster temporarily entered a Degraded state during installation. As a result, it enforced KVDB TLS migration validation too early and repeatedly emitted this warning: Internal kvdb tls is enabled, but kvdb tls migration is not approved.User Impact: The installation could be blocked, leaving clusterCondition in the InProgress state and the StorageCluster in the Degraded state, which caused reconciliation failures.Resolution: The Operator now treats an Install condition of InProgress as a fresh installation, even if the cluster is temporarily in a Degraded state during installation.Affected Version: 25.5.2 and earlier | Minor |
| PWX-50025 | Issue: During a Portworx upgrade, the Operator could fail if it encountered volumes not managed by Portworx. In environments running KubeVirt virtual machines (VMs) with a mix of Portworx-managed and non-Portworx volumes, the Operator incorrectly treated missing Portworx volume metadata as a fatal error, causing the Portworx upgrade to pause or fail. User Impact: Portworx upgrades could pause or fail even though the non-Portworx volumes were unrelated. Resolution: The Operator now skips non-Portworx volumes safely and logs a debug message instead of failing the upgrade. Affected Version: 25.5.2 and earlier | Major |
| PWX-49846 | Issue: After upgrading to PX CSI 25.8.0 with containerd, volumes could not be unmounted. User Impact: Applications using PX-CSI volumes could not be stopped or migrated after the PX-CSI upgrade. Resolution: Fixed the unmount issue with containerd. Affected Version: 25.5.2 and earlier | Major |
| PWX-49745 | Issue: StorageCluster uninstall could get stuck if Prometheus Operator CRDs (ServiceMonitor, PrometheusRule) were not installed. User Impact: Uninstall could not complete in clusters without Prometheus Operator CRDs. Resolution: Uninstall now succeeds even when Prometheus Operator CRDs are not present. Affected Version: 25.5.2 and earlier | Major |
| PWX-49579 | Issue: In PX-CSI, PVCs could remain in the Pending state when many PVCs were created at once. User Impact: Applications could not start because PVCs were stuck in the Pending state. Resolution: Reduced the number of PX-CSI provisioner worker threads to avoid bottlenecks. Affected versions: 25.5.2 and earlier | Major |
| PWX-47448 | Issue: imagePullPolicy in the StorageCluster spec did not apply to the px-plugin deployment.User Impact: Users could not control the px-plugin image pull policy. Resolution: The StorageCluster imagePullPolicy now applies to the px-plugin deployment as well.Affected Version: 25.5.2 and earlier | Minor |
| PWX-47367 | Issue: Autopilot custom resources (AutopilotRule, AutopilotRuleObject, and ActionApproval) were not removed during uninstall. User Impact: Stale Autopilot CRs remained after Portworx uninstallation. Resolution: Fixed Autopilot CR cleanup during uninstall. Affected Version: 25.5.2 and earlier | Minor |
| PWX-42749 | Issue: Invalid volume IDs were ignored during diagnostics collection, making it difficult to understand why diagnostics stayed Pending. User Impact: Users could not determine why diagnostics collection failed. Resolution: Diagnostics now reports missing volume IDs clearly and stops with an error so you can update the PortworxDiag spec and resume automatically.Affected Version: 25.5.2 and earlier | Minor |
| PWX-42750 | Issue: When Telemetry services were non-functional, the system did not provide notifications or error logs. User Impact: Users were not notified when diagnostics failed to upload due to Telemetry issues. Resolution: The system now logs and reports Telemetry failures appropriately. Affected Version: 25.5.2 and earlier | Minor |
| PWX-50406 | Issue: If the PortworxDiags CR was unhealthy, diagnostics collection stayed in Pending state without error details.User Impact: Users could not determine why diagnostics was stuck in Pending. Resolution: PortworxDiags Pending now includes appropriate reasoning. Affected Version: 25.5.2 and earlier | Minor |
| PWX-50372 | Issue: ComponentK8sConfig did not apply annotations to the portworx-service and portworx-kvdb-service services. When users specified annotations for these Services by using ComponentK8sConfig, the CR entered the VALIDATION_FAILED state.User Impact: Users could not configure annotations for the portworx-service and portworx-kvdb-service services by using ComponentK8sConfig. Migration from StorageCluster to ComponentK8sConfig that uses the portworx.io/migrate-configs: "true" annotation did not migrate annotations for these services.Resolution: ComponentK8sConfig now supports annotations for the portworx-service service and the portworx-kvdb-service service. The migration now correctly migrates annotations for these Services. For more information, see the Configure resource limits, placements, tolerations, nodeAffinity, labels, and annotations for Portworx components.Affected Version: 25.5.2 and earlier | Major |
Known issues (Errata)
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-49374 | New installations with version 25.6.0 create StorageClass objects without the managed-by: operator label. This causes the portworx.io/disable-storage-class annotation to not work as expected. If you create a custom StorageClass with the same name as an operator-created StorageClass and set portworx.io/disable-storage-class: "true" in the StorageCluster, the custom StorageClass is deleted. Additionally, StorageClass objects remain orphaned after uninstallation.User Impact: The portworx.io/disable-storage-class annotation does not function correctly, and manual cleanup is required during uninstallation.Workaround: After installation, manually add the managed-by: operator label to operator-created StorageClass objects, or manually delete them during uninstallation.Affected Version: 25.6.0 | Major |
| PWX-51697 | When you add custom annotations to operator-created StorageClass objects (except KubeVirt StorageClass objects px-rwx-block-kubevirt, px-rwx-file-kubevirt, and px-cdi-scratch), the operator removes them during reconciliation.User Impact: Integrations that rely on these annotations (for example, backup tools or GitOps systems) might not detect the intended StorageClass objects. Workaround: Create custom StorageClass objects with different names and add the required annotations to them instead of modifying operator-created StorageClass objects. Affected Version: 25.6.0 | Major |
| PWX-49456 | If you create a VolumeSnapshotClass named px-csi-snapclass, the operator deletes and replaces it. Custom annotations, labels, parameters, or deletion policy settings on operator-created VolumeSnapshotClass objects are not preserved.User Impact: Custom VolumeSnapshotClass configurations are lost, which might affect snapshot workflows or integrations. Workaround: Use a different name for custom VolumeSnapshotClass objects (for example, custom-px-snapclass). Avoid modifying operator-created VolumeSnapshotClass objects.Affected Version: 25.6.0 | Major |
25.5.2
February 02, 2026
This release also addresses security vulnerabilities.
Improvements
| Improvement Number | Improvement Description |
|---|---|
| PWX-50404 | You can now configure the Pure1 metrics collector separately from other telemetry components using new StorageCluster fields:
Note: When telemetry is enabled, the Operator automatically adds metricsCollector.enabled: true to your StorageCluster spec. If you use GitOps, update your Git manifest to include this field so that your Git repository matches the actual cluster state.For more information, see Customize metrics collector. |
Fixes
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-50404 | Issue: The metrics collector logged excessive warning messages for Prometheus metrics with more than 32 labels, causing increased log volume in centralized logging systems. User Impact: Increased log volume from the metrics collector consumed additional storage in centralized logging systems. Resolution: The issue is fixed in metrics collector image StorageCluster For more information, see Customize metrics collector. Affected Version: 25.5.1 and earlier | Minor |
25.5.1
January 06, 2026
New features
- Taint-based scheduling support: This Portworx Operator release enables Stork support for taint-based scheduling for workloads. When taint-based scheduling is enabled, the Operator applies taints to Portworx storage and storageless nodes. Stork automatically adds matching tolerations to Portworx system pods and to applications that use Portworx volumes. This blocks workloads that lack matching tolerations from being scheduled on Portworx storage nodes. For more information, see Taint-based scheduling with Stork.
note
This feature requires Stork version 25.6.0 or later.
Improvements
| Improvement Number | Improvement Description |
|---|---|
| PWX-48477 | The Portworx Operator now uses the Portworx Volume API to identify volume types instead of relying on the StorageClass API. Previously, when a StorageClass was deleted after a PersistentVolumeClaim (PVC) was created, the Operator couldn't determine the volume type, which led to failures during operations, including KubeVirt VM live migration. The Portworx Operator now queries the volume object directly through the Portworx API, enabling consistent volume type detection even if the StorageClass is unavailable. This update improves the reliability of VM live migration during Portworx upgrades for both Pure and SharedV4 volumes. |
Fixes
| Issue Number | Issue Description | Severity |
|---|---|---|
| PWX-48822 | In air-gapped environments with KVDB TLS enabled, Portworx fails to pull the cert-manager image from a private registry that requires authentication. This occurs because the Portworx Operator does not attach the regcred secret to the cert-manager pods.User Impact: The cert-manager pods enter a ImagePullBackOff state due to missing registry credentials, and installation fails.Resolution: Portworx Operator ensures that all cert-manager components are deployed with the correct imagePullSecrets, such as regcred, when you use authenticated custom registries.Affected Version: 25.5.0 and earlier | Minor |
| PWX-49374 | When you apply the portworx.io/disable-storage-class: "true" annotation, the Operator can delete an existing StorageClass if its name matches a default StorageClass introduced by the Operator. This can occur even if the StorageClass was not created by the Operator.User impact: StorageClasses not created by the Operator can be deleted after an upgrade or when the annotation is enabled. Workloads that depend on those StorageClasses might be disrupted. Resolution: The Operator now manages StorageClasses using explicit managed-by ownership labels. It deletes only those StorageClasses it created and labeled as Operator-managed. StorageClasses not created by the Operator are not modified or deleted, even if their names match default StorageClasses.Affected version: 25.5.0 | Minor |
| PWX-49456 | The Operator could overwrite existing VolumeSnapshotClass resources, removing your custom parameters or annotations during a restart or upgrade.User Impact: If you customized the snapshot configuration, your changes might be lost during an Operator restart or upgrade, potentially resulting in snapshot failures. Resolution: The Operator now preserves existing VolumeSnapshotClass resources. If a VolumeSnapshotClass with the same name already exists in the cluster, the Operator no longer modifies or overwrites it.Affected version: 25.5.0 | Minor |