The module lifecycle stage: General Availability
The module has requirements for installation
v0.2.27
Release date: 2026-09-09
A node whose repositories cannot install the iSCSI stack now gets it from the module’s own package image, an HPEStorageClass can reserve a share of the filesystem for the superuser, and the deadlock that left single nodes with no working node plugin is fixed.
Highlights
Changes in this release:
- The module installs
open-iscsiandmultipath-toolsfrom its own package image when a node’s repositories cannot provide them. Such a node used to be left as it was, and every attach on it then failed, minutes into mounting a volume, withchroot: failed to run command 'iscsiadm'. - An
HPEStorageClasscan ask for a share of the filesystem to be kept for the superuser — the classic ext4 reserve — with thestorage.deckhouse.io/ext4-reserved-percentannotation. Unless it is asked for, ext4 volumes are now formatted with no reserve at all, where before they lost ext4’s default 5%. - A restart of
node-driver-registrarno longer wedges the node plugin. That deadlock left one or two nodes of a cluster withoutcsi.hpe.comin theirCSINode, unable to attach a volume, while their siblings were fine.
New features
This release adds:
- A node whose package repositories cannot install
open-iscsiandmultipath-toolsnow gets them from the module’s owniscsi-toolspackage image: the payload lands under/var/lib/deckhouse/sds/csi-hpe, every binary runs against its own library path, and two units come up for the daemons,d8-csi-hpe-iscsid.serviceandd8-csi-hpe-multipathd.service. The distribution’s packages stay the preferred path and the two never mix — a node that has aniscsiadmof its own keeps everything of its own, because a client of one version does not speak to aniscsidof another. An/etc/iscsi/initiatorname.iscsithe node already has is left alone, so the node keeps the IQN the array knows it by. Everything else the module configures applies to such a node exactly as to any other, thefind_multipaths nothe driver depends on to see a device-mapper map at all included. storage.deckhouse.io/ext4-reserved-percenton anHPEStorageClasssets the percentage of the filesystem kept for the superuser: a whole number from 0 to 50, default 0. The value reaches the driver as thefsCreateOptionsparameter of the managed StorageClass, because a CSI driver never sees the annotations of a StorageClass. Without the annotation the module now says-m0explicitly, where a baremkfs.ext4used to keep ext4’s default 5%. The reserve applies to volumes created afterwards — an existing filesystem keeps the reserve it was created with — and only to ext4: a class withfsType: xfsis unaffected, since XFS keeps no blocks for the superuser. An invalid value leaves theHPEStorageClasswithReady=Falseand the reason in its status, instead of breaking volume creation later.- The module setting
logLevelsets how much the controller logs:ERROR,WARN,INFO,DEBUGorTRACE,INFOby default. - The controller exports metrics and a ServiceMonitor puts them in front of the cluster’s main Prometheus: what controller-runtime reports for every controller of the module — reconcile counts and durations, workqueue depth, client-go latency. The controller binds its metrics endpoint on
127.0.0.1, and a kube-rbac-proxy in the same pod authorises every scrape.
Fixes
This release fixes:
- A restart of
node-driver-registrarno longer takes the CSI driver with it. The csi-node liveness probe watched a port the registrar serves but was attached to the driver container, and the two deadlocked: the registrar exits by design when registration fails, its port goes with it, the probe kills the driver, the CSI socket disappears, and the restarted registrar can no longer reach it. Nodes came up with the node plugin wedged — a dozen restarts and nocsi.hpe.comin theirCSINode, so no volume could be attached there — while other nodes of the same cluster were fine. The probe now sits on the container that serves it. - A change to the multipath configuration no longer fails on a node where
multipathdis enabled but not started: such a unit refuses a reload outright, the node configuration step then retried forever, and the module’sfind_multipaths nonever reached the daemon — which is what decides whether a single-path LUN gets a device-mapper map at all. The handler restarts the unit when it cannot reload it, and covers the module’s ownd8-csi-hpe-multipathd.serviceas well.
Upgrade notes
Before upgrading, note the following:
- Every StorageClass managed by an
HPEStorageClasswhosefsTypeis ext4 gains thefsCreateOptions: -m0parameter on upgrade. Becauseparametersof an existing StorageClass are immutable in Kubernetes, the controller recreates the class once, on its own. Existing volumes, PVCs and their data are not affected, and a volume created before the upgrade keeps the reserve its filesystem was created with. Nothing has to be done by hand.
Docs
Documentation changes:
- A FAQ entry describes both ways the iSCSI stack reaches a node — the node’s own repositories and the module’s package image: which path is preferred and why, what the fallback puts on the node and where, how to tell from a node which of the two it took, and the two things the fallback deliberately leaves alone.
- A FAQ entry describes the share of a volume kept for the superuser: the annotation, the range of values, that the reserve applies only to volumes created afterwards, and that a class with
fsType: xfsis unaffected. - The Russian reference for
HPEStorageClassmatches the schema again: the fields arestorageConnectionNameandfsType, andaccessProtocolandcpgwere missing from it altogether.spec.controlPlane.addressof anHPEStorageConnectionis now documented as deprecated in favour ofbackendAddress. Both CRD manifests are generated from the Go API types, so the schema and its reference cannot drift apart again.
v0.2.26
- Bugfix: the controller is granted patch on events instead of list - a repeated event write is no longer denied by RBAC
- Optional resources are enabled based on the presence of the CRD in the API, not on the list of enabled modules - the checks are routed through helm_lib_api_version_exists
- CVE fixes
- Base images updated to v2.1.2, Go to 1.26.6 and lib-helm to 1.72.14
v0.2.25
- HPEStorageClass and HPEStorageConnection publish status.conditions and status.observedGeneration, added Ready column. The status.phase field retains the same set of values, but is now calculated from the Ready condition
- Fix: nodes now force find_multipaths no via a dedicated /etc/multipath/conf.d/99-deckhouse-csi-hpe-defaults.conf file, so a LUN exposed over a single path still gets a multipath device and volume staging no longer fails with “device not found with serial”
- Fix: the primera3par-csp and nimble-csp Pods are no longer pinned to a failed node — the tolerations that indefinitely tolerated not-ready and unreachable were removed, so the Deployment reschedules onto a healthy node
- Update base images to v1.3.25, Go 1.26.5 and lib-helm to 1.72.13
v0.2.24
- The snapshot-controller module is no longer a required dependency: VolumeSnapshotClass is created only if the snapshot.storage.k8s.io CRD is present, otherwise HPEStorageConnection is processed without the snapshot part
- Update base images, Go 1.26.5 and lib-helm to 1.72.12
- Fixed a vulnerability in gRPC (GHSA-hrxh-6v49-42gf)
- Internal changes in module assembly
v0.2.23
- Update base images, Go 1.26.5 and lib-helm to 1.72.10
- Internal changes in module assembly
v0.2.22
- Fix: Deckhouse registry access secrets are now limited to the active image source
- Update base images, Go 1.26.5 and lib-helm to 1.72.9
- Internal changes in module assembly
v0.2.21
- Updating container-base images to v1.1.2
v0.2.20
- Transition of the csi-hpe runtime image to the distroless base
v0.2.19
- When forwarding labels from HPEStorageClass to StorageClass, labels with specified ignored prefixes are now excluded
- Update base images and lib-helm to 1.72.0
v0.2.18
- Labels from HPEStorageClass are now forwarded to the managed StorageClass Kubernetes
- Update base images, Go 1.25.10 and lib-helm 1.71.12
v0.2.17
- Internal changes in the structure and assembly of the module
v0.2.16
- Update base images, Go 1.25.10 and lib-helm 1.71.11
- Internal changes to the module assembly
v0.2.15
- Corrections to the module structure
v0.2.14
- Changes in CI: DistroPackagesProxy and env proxy in werf, improvements to CVE scans (role_name, checkout)
- Added user-authz cluster roles in templates
v0.2.13
- Installing packages in NodeGroupConfiguration no longer causes the script to crash on errors
v0.2.12
- Added infrastructure and missing mount points for distroless images
- Update base images, Go and lib-helm (CVE fix)
v0.2.11
- Update base images and golang version
- Updated hooks that work when a module is removed
- Disabled Capacity request from k8s (CSI does not support issuing Capacity)
- Fixes in NGC preparing nodes
- Corrections in module manifests
v0.2.10
- Update CSI version to v3.0.0
- Switch from yum to dnf for package installation on CentOS-like distributions
- Fix CVE
- Updated documentation
- Fix VolumeSnapshotClass annotation in StorageClasses
v0.2.9
- Updated base images versions
v0.2.8
- Updated Go version to 1.24.9
- Updated lib-helm to deckhouse_lib_helm-1.64.1
v0.2.7
- Technical release, internal module improvements
v0.2.6
- Technical release, internal module improvements
v0.2.5
- Added release notes
v0.2.4
- Added additional mountings for containerd v2 support
v0.2.3
- Added information about the need for snapshot-controller for module operation
- Added readonlyRootFilesystem for enhanced module security
v0.2.2
- Added dependency on snapshot-controller
v0.2.1
- Technical release, internal module improvements
v0.2.0
- Complete module refactoring
- Documentation fixes
- CVE fixes, except GHSA-m425-mq94-257g in CSI, requiring long-term dependency analysis (planned)
- CVE-2025-22869 in proprietary binary file
v0.1.4
- Added Deckhouse version requirements (>= 1.67)