The module lifecycle stage: Experimental
The module has requirements for installation
Before enabling the module, you need to allow the use of experimental modules in the deckhouse ModuleConfig. To do this, set the allowExperimentalModules parameter to true.
v0.3.1
Release date: 2026-11-05
MindUstorStorageClass and MindUstorStorageConnection record Kubernetes Events, and the webhook rejects a class named after a StorageClass the module does not manage.
Highlights
Changes in this release:
- MindUstorStorageClass records a Kubernetes Event when its
Readycondition changes, and MindUstorStorageConnection when itsAuthenticatedcondition does. - A MindUstorStorageClass named after a foreign StorageClass is rejected at creation instead of staying
Failed.
New features
This release adds:
- MindUstorStorageClass now records a Kubernetes Event when its
Readycondition changes status or reason, and MindUstorStorageConnection when itsAuthenticatedcondition does: aWarningwhen the condition turnsFalse, aNormalone when it turnsTrueagain. The reason of the Event is the reason of the condition, for exampleReconcileFailedfor a class orUserLockedandLoggedInfor a connection, sokubectl describeshows when a resource broke and when it recovered. A pass that changes nothing records no Event. Both kinds are cluster-scoped, so their Events are in thedefaultnamespace, and the controller is granted the right to create them there.
Improvements
This release improves:
- A MindUstorStorageClass can no longer be created under the name of a StorageClass that the module does not manage. The module names its StorageClass after the MindUstorStorageClass, so such a resource used to be created and then stay
Failed; the webhook now rejects it at creation and names the StorageClass that holds the name and its provisioner.
Fixes
This release fixes:
- The
storage.deckhouse.io/managed-bylabel of the StorageClasses the module creates now holds the module name,csi-mind-ustor, instead ofd8-mind-ustor-storage-class-controller. Existing StorageClasses get the new value on the first reconcile after the update, without being recreated. Label selectors and monitoring queries that match the old value have to be updated. The module still treats a StorageClass with the old value as its own, so a class whose relabelling has not happened yet keeps working.
Upgrade notes
Before upgrading, note the following:
- Nothing has to be done by hand. Label selectors and monitoring queries that match
storage.deckhouse.io/managed-by: d8-mind-ustor-storage-class-controlleron StorageClasses have to be updated tocsi-mind-ustor.
v0.3.0
Release date: 2026-10-29
A new delivery of the uStor CSI driver: virtual machine disks no longer lose their NBD connection on Linux 6.6 and later, nodes the node plugin has left stop attracting Pods with uStor volumes, block volumes accept ReadWriteOnce, and the CSI controller no longer restarts in a loop right after the module is enabled.
Highlights
Changes in this release:
- Virtual machine disks on nodes with Linux 6.6 and later no longer lose their NBD connection (
Double replyorUnexpected replyin the kernel log), the known issue of v0.2.3: the driver sets thenoneI/O scheduler on every NBD device it maps. - A node the node plugin no longer runs on loses the
topology.ustor-nbd.csi.mindsw.io/data-planelabel, so Pods with uStor volumes are no longer scheduled there to hang inContainerCreating. - Block volumes (
volumeMode: Block) acceptReadWriteOnceas well asReadWriteOncePod.
New features
This release adds:
- Block volumes with
ReadWriteOnce: the volume is attached to one node at a time, and the Pods on that node share the device; coordinating their writes is up to the application. ReadOnlyManyblock volumes for thevirtualizationmodule: the driver attaches such a volume to several nodes at once, likeReadWriteMany. It does not make the device read-only, so thepvc-validationwebhook holdsReadOnlyManyto the rule ofReadWriteMany:volumeMode: Blockonly, and only from the service accounts of thevirtualizationmodule.
Improvements
This release improves:
- The CSI controller removes the
topology.ustor-nbd.csi.mindsw.io/data-planelabel from a node once the node plugin is no longer registered there, for example after the node stops matchingdataPlane.nodeSelectorof theMindUstorStorageConnectionor loses the uStor client. kubelet left the label behind, and the node affinity of uStor volumes kept admitting the node. - A rejected uStor login is no longer retried with the same password at all until the credentials Secret changes (before: after 5 minutes), and a locked uStor user is tried again after 15 minutes, so a wrong password costs one failed login.
- Attaching a volume to a node that does not run the node plugin fails at once with
NotFound.
Fixes
This release fixes:
- Virtual machines doing direct asynchronous I/O on uStor block volumes no longer lose the disk on Linux 6.6 and 6.8: the driver sets the
noneI/O scheduler on every NBD device right after mapping it. - A PersistentVolumeClaim whose size is not a multiple of 4 KiB (for example
1Gor1500Mi) is created and expanded: the driver rounds the size up to 4 KiB, which uStor requires. - Right after the module is enabled on a fresh cluster, the VPA updater no longer evicts the CSI controller every 30 seconds for minutes, during which no volume could be provisioned: the pods of the module keep their CPU and memory requests when VPA is enabled.
Security updates
Security updates in this release:
golang.org/x/netis updated to v0.62.0 in the CSI driver, the controller, the webhooks and the hooks, which closes CVE-2026-78661 and CVE-2026-97045.
Upgrade notes
Before upgrading, note the following:
- The
ustor-nbdprocess that serves a mapped volume now runs in the host cgroup/sys/fs/cgroup/mind/nbdinstead of a systemd scope, so that volumes keep working through a restart of the node plugin. This needs cgroup v2 and Linux 5.7 or later on the nodes, which all supported operating systems have. Volumes mapped before the upgrade stay in their systemd scopes and keep working. - The pods of the module are recreated once. Volumes, PersistentVolumes and their node affinity are not changed; nothing has to be done by hand.
Known issues
Known limitations of this release:
- Cloning a volume directly from another PersistentVolumeClaim is not supported; take a snapshot and restore it instead.
Docs
Documentation changes:
- The documentation describes
ReadWriteOncefor block volumes andReadOnlyManyfor the virtual machine disks of thevirtualizationmodule.
Dependencies
Dependency updates:
uStor CSI driver:delivery 2026-09-28→delivery 2026-10-21- The vendor’s delivery carries what the module patched on top of the previous one (expansion, volume statistics, topology, the login back-off, restore into a larger volume, multi-node block volumes, unstage and expansion after a restart of the node plugin) and adds the stale topology label cleanup, the I/O scheduler, the 4 KiB size alignment and
ReadWriteOncefor block volumes. The module keeps its topology key and a check of the NBD device before unmapping it.
- The vendor’s delivery carries what the module patched on top of the previous one (expansion, volume statistics, topology, the login back-off, restore into a larger volume, multi-node block volumes, unstage and expansion after a restart of the node plugin) and adds the stale topology label cleanup, the I/O scheduler, the 4 KiB size alignment and
v0.2.3
Release date: 2026-10-26
Security update: the module’s images are rebuilt against patched Go dependencies and no longer carry the build image’s package manager and shell, and on DKP 1.79 and later the module ships the SecurityPolicyException objects its node pods need.
Highlights
Changes in this release:
- On DKP 1.79 and later, where the Pod Security Standards in system namespaces deny instead of warn, the module ships a
SecurityPolicyExceptionfor thecsi-nodepods and another for theustor-client-configpods, so both keep starting.
New features
This release adds:
- The module ships a
SecurityPolicyExceptionfor thecsi-nodepods, which allows what the node plugin needs: privileged mode, running as root, the host network and PID namespaces and the kubelet and/devhostPathvolumes. Theustor-client-configpods get an exception of their own that allows running as UID 0 and the/etc/ustorhostPath, where they writeustor.confand the uStor client certificates for the node’sustor-nbd. The objects and the pod labels that point to them are created only when theadmission-policy-engineCRDs are present, so earlier DKP versions get the same manifests as before.
Security updates
Security updates in this release:
- The CSI driver (
ustor-csi), the module’s controller, webhooks and hooks (go-hooks) are rebuilt against patched Go dependencies, closing CVE-2026-78669, CVE-2026-78659, CVE-2026-78660, CVE-2026-78663, CVE-2026-97032, CVE-2026-56851 and, ingo-hooks, CVE-2026-63209.go-hooksno longer containsdocker/distribution, which carried CVE-2026-85747 without a fixed release. - The module’s final images no longer contain the
pmpackage manager,busyboxandbashof the build image;pmcarried CVE-2026-63209. The node plugin image (csiNode) carries only the tools the node plugin runs.
Known issues
Known limitations of this release:
- Virtual machine disks on nodes with Linux 6.6 or later (Ubuntu 24.04, RED OS 8.0 on our stand) lose their NBD connection within the first minute after the virtual machine starts (
Double replyorUnexpected replyfrom thenbddriver in the kernel log); the guest is left without its disk and the virtual machine cannot be stopped until the device is unmapped on the node withustor-nbd netlink-unmap /dev/nbdN. Nodes with Linux 6.1 (Debian 12, Astra 1.8) are not affected. The cause is being investigated.
v0.2.2
Release date: 2026-10-01
A volume expanded online after a restart of the node plugin is unstaged and deleted again, instead of staying mounted on its node for ever.
Highlights
Changes in this release:
- After a restart of the
csi-nodepod, a volume expanded online is unstaged from its node when its Pod and PersistentVolumeClaim are deleted, forvolumeMode: FilesystemandvolumeMode: Block.
Fixes
This release fixes:
- Online expansion after a restart of the node plugin: the node plugin keeps the staged volumes in memory, and after a restart of the
csi-nodepod an online expansion recovered the volume under the path where it is published into the Pod instead of its staging path. Unstaging the volume then failed for ever withremove staging path ...: directory not empty: the staging mount and the NBD mapping stayed on the node, the VolumeAttachment was kept and the PersistentVolume stayedReleased. The expansion now recovers the volume under its staging path, and the unstage ignores a record made for another path.
Upgrade notes
Before upgrading, note the following:
- A volume that got stuck this way with v0.2.1 or earlier is not released by the upgrade. On its node, unmount what is left in its staging path: for a filesystem volume the
globalmountdirectory named in the kubelet eventremove staging path, for a block volume.../volumeDevices/staging/<PV name>/device, which is then removed as well. The kubelet finishes the unstage at its next retry and the PersistentVolume is deleted.
Known issues
Known limitations of this release:
- Virtual machine disks on nodes with Linux 6.6 or later (Ubuntu 24.04, RED OS 8.0 on our stand) lose their NBD connection within the first minute after the virtual machine starts (
Double replyorUnexpected replyfrom thenbddriver in the kernel log); the guest is left without its disk and the virtual machine cannot be stopped until the device is unmapped on the node withustor-nbd netlink-unmap /dev/nbdN. Nodes with Linux 6.1 (Debian 12, Astra 1.8) are not affected. The cause is being investigated.
v0.2.1
Release date: 2026-09-30
Raw block volumes are unstaged from their own device after a restart of the node plugin, and snapshots are created without naming the VolumeSnapshotClass.
Highlights
Changes in this release:
- After a restart of the
csi-nodepod, unstaging a block volume (volumeMode: Block) no longer unmaps the volume of another pod on/dev/nbd0and leaves its own mapped. - The module’s StorageClasses carry the
storage.deckhouse.io/volumesnapshotclass: csi-mind-ustorannotation, so a VolumeSnapshot withoutvolumeSnapshotClassNameis created.
Fixes
This release fixes:
- Block volumes after a restart of the node plugin: the node plugin keeps the device of a staged volume in memory, and after a restart of the
csi-nodepod it read the device of a block volume from the mount table, where the source of a block volume isudev. Unstaging the volume then unmapped/dev/nbd0, whichever volume was served there, and left its own image mapped, so its PersistentVolume could not be deleted (still used by client(s)). The device is now taken from the mount table entry of the device file and checked to serve the volume’s image before it is unmapped; if it does not, the device serving the image is looked up. Online expansion of a block volume after a restart uses the same lookup. - Snapshots: the module’s StorageClasses carry the
storage.deckhouse.io/volumesnapshotclass: csi-mind-ustorannotation. Without itsnapshot-controllerrefused every VolumeSnapshot of a volume of the module,storage-foundationdid not fill in the class of a VolumeSnapshot that names none, and the flows ofstorage-foundationthat read the class from the StorageClass failed. A value already set on the StorageClass is kept.
Upgrade notes
Before upgrading, note the following:
- The annotation is added to the StorageClasses of existing
MindUstorStorageClassresources in place; nothing has to be done by hand. - A block volume unstaged with v0.2.0 after a restart of the node plugin stays mapped on its node, and its PersistentVolume stays
Released. Find such mappings withustor-nbd lson the node, compare them with the VolumeAttachments of the node, and unmap each one by its full device name:ustor-nbd netlink-unmap /dev/nbdN; the PersistentVolume is then deleted. A pod whose block volume lost its device (I/O errors on the device) has to be recreated.
v0.2.0
Release date: 2026-09-29
Volume snapshots, raw block volumes and live migration of virtual machines on uStor, with volume statistics, topology and a check of the uStor login added to the driver.
Highlights
Changes in this release:
- Volume snapshots: the module creates the
csi-mind-ustorVolumeSnapshotClass, and a PersistentVolumeClaim can be restored from a snapshot, also into a claim larger than the snapshot. - Raw block volumes (
volumeMode: Block), andReadWriteManyblock volumes for the virtual machines of thevirtualizationmodule, which can now be live-migrated between nodes. - A
MindUstorStorageConnectionreports whether uStor accepts the login of its user in the newAuthenticatedcondition, so that a locked user or an expired password shows up in the connection and its alert.
New features
This release adds:
- Snapshots: with a module that provides the
snapshot.storage.k8s.ioAPI in the cluster (for examplestorage-foundation), the CSI controller runs the snapshotter and the module creates thecsi-mind-ustorVolumeSnapshotClass. A restored volume is a full, independent copy of the snapshot; it can be larger than the snapshot, and its filesystem is grown to the requested size when it is mounted. - Raw block volumes: a PersistentVolumeClaim with
volumeMode: Blockand theReadWriteOncePodaccess mode gets the uStor volume as a device, with online expansion and snapshots. - Block volumes on several nodes for virtual machines: the driver accepts
ReadWriteManyforvolumeMode: Block. Thepvc-validationwebhook admits such a claim only from the service accounts of thevirtualizationmodule, and refusesReadWriteManywithvolumeMode: Filesystemfor everyone. - The module’s StorageClasses carry
virtualdisk.virtualization.deckhouse.io/volume-mode: Blockandvirtualdisk.virtualization.deckhouse.io/access-mode: ReadWriteMany, so thevirtualizationmodule creates itsVirtualDisks on them as ReadWriteMany block volumes; a value already set on the StorageClass is kept. - Volume statistics: the node plugin answers
NodeGetVolumeStats, so kubelet exportskubelet_volume_stats_*for uStor volumes and the PersistentVolumeClaim fill alerts and dashboards cover them. - The
Authenticatedcondition ofMindUstorStorageConnection: the module logs in to the uStor management API with the connection’s credentials every hour and as soon as the credentials Secret changes. Its reason names the cause of a failure (UserLocked,PasswordExpired,TemporaryPassword,UserNotFound,LoginRejected,Unreachable),ReadyturnsFalsewhile the login fails, and theD8CsiMindUstorStorageConnectionNotInUsealert fires. The hourly login also keeps uStor from locking the user of a cluster that creates no volumes for a while.
Improvements
This release improves:
- Pods using uStor volumes are only scheduled onto nodes that run the node plugin: the driver reports the
topology.ustor-nbd.csi.mindsw.io/data-planetopology segment, new PersistentVolumes get the node affinity of it, and the module’s StorageClasses select it inallowedTopologies.WaitForFirstConsumernow does what the description ofvolumeBindingModesays. - The node plugin runs only on nodes where the uStor client is installed, which the module labels
storage.deckhouse.io/csi-mind-ustor-client-ready=true; a node with an unsupported operating system no longer registers the driver. - The uStor client is installed with every library it needs from the module itself, without packages from the node’s repositories, so a node without a route to its distribution’s repositories gets the client too.
- An error of a rejected uStor login carries the reason uStor gives, instead of “invalid credentials” for every cause, and a rejected login is not retried with the same credentials for 5 minutes, so a mistyped password in the Secret no longer locks the uStor user within seconds.
- On Deckhouse 1.78 and later the module grants access to its resources through the capability/scope RBAC model, next to the manage/use roles of earlier versions.
Upgrade notes
Before upgrading, note the following:
- The StorageClasses of existing
MindUstorStorageClassresources are recreated once to addallowedTopologies; volumes already provisioned are not affected. PersistentVolumes created before the upgrade have no topology node affinity and keep working as before. - After the upgrade the node plugin leaves a node until bashible has applied the new NodeGroupConfiguration there and labeled the node (usually minutes). Volumes staged on the node keep working meanwhile; their unmount and expansion wait for the label.
- Nothing has to be done by hand: the new StorageClass annotations, the VolumeSnapshotClass and the webhook are created by the module.
Known issues
Known limitations of this release:
- Cloning a volume directly from another PersistentVolumeClaim is not supported; take a snapshot and restore it instead.
- A block volume without
ReadWriteManyis only served withReadWriteOncePod, andReadWriteManyis reserved for the virtual machine disks of thevirtualizationmodule. - The live migration of a virtual machine between nodes with different operating systems can fail in QEMU on the state of the virtio network device, with the disks already attached on the target node; a migration between nodes of the same operating system works.
Docs
Documentation changes:
- The documentation is reorganized into an overview, a usage guide, the configuration, the custom resources and a FAQ. The usage guide describes the uStor user the CSI controller needs and its password policy, changing its password, snapshots and restore, raw block volumes and block volumes for virtual machines.
Dependencies
Dependency updates:
uStor CSI driver:delivery 2026-08-25→delivery 2026-09-28- The vendor’s delivery adds snapshots and raw block volumes; the module applies its own fixes on top (volume statistics, topology, the login reason and back-off, restore into a larger volume, multi-node block volumes).
v0.1.0
Release date: 2026-09-25
First release of the module: persistent volumes on uStor 1.6 over NBD, driven by MindUstorStorageConnection and MindUstorStorageClass resources.
Highlights
Changes in this release:
- A uStor cluster is described once, by a
MindUstorStorageConnection: the management API, the Secret with the uStor user, the etcd addresses and the Secret with the client certificates. ItsReadycondition says whether the module uses it and what is missing otherwise. - A
MindUstorStorageClassstates the connection, the pool, the filesystem, the reclaim policy and the binding mode, and the module creates the StorageClass for it. StorageClasses for this driver cannot be created or changed by hand — the module owns them. - The nodes are prepared by the module: the uStor client (
ustor-client,ustor-nbd) is installed on Astra Linux 1.8, RED OS 8, Ubuntu 22.04 and 24.04 and Debian 12, and its configuration and certificates are kept in step with the connection.
New features
This release adds:
- Volume lifecycle: provisioning, attach and detach, online expansion, and migration of a Pod between nodes. The volume survives a restart of the node plugin.
- The module setting
clusterIDseparates the images of several Kubernetes clusters served by one uStor installation. - Alerts
D8CsiMindUstorStorageConnectionNotInUseandD8CsiMindUstorStorageClassNotReadyfire when a connection or a StorageClass staysFailedfor 15 minutes.
Known issues
Known limitations of this release:
- The module serves one uStor cluster: every
MindUstorStorageConnectionbut the oldest is reported asFailed. - Snapshots and raw block volumes are not offered.
- On a node with an operating system outside the supported list the uStor client is not installed, and uStor volumes cannot be mounted there.