The module lifecycle stage: General Availability
The module has requirements for installation
v0.1.25
Release date: 2026-09-09
A node whose repositories cannot provide the iSCSI stack now gets it from the module’s own package image, a NetappStorageConnection decides how much of a volume is kept for the superuser — nothing, by default, where ext4 used to keep 5% — and the module controller exports metrics and takes its log level from a module setting.
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 failed withnsenter: failed to execute iscsiadm. - A
NetappStorageConnectioncan ask for a share of the filesystem to be kept for the superuser — the classic ext4 reserve — with thestorage.deckhouse.io/ext4-reserved-percentannotation. Volumes are formatted with no reserve unless it is asked for, where before every ext4 volume kept ext4’s default 5% for root. - A restart of
node-driver-registrarno longer wedges the node plugin. That deadlock left one or two nodes of a cluster withoutcsi.trident.netapp.ioin 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-tools(iscsi-initiator-utilsanddevice-mapper-multipathon RPM distributions) now gets them from the module’s owniscsi-toolspackage image: the payload lands under/var/lib/deckhouse/sds/csi-netapp, every binary runs against its own library path, and two units come up for the daemons,d8-csi-netapp-iscsid.serviceandd8-csi-netapp-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. Everything theNodeGroupConfigurationdoes after the install runs on such a node exactly as on any other: thefind_multipaths nooverride, the NetApp ONTAP device block, the kernel modules and thestorage.deckhouse.io/csi-netapp-node-readylabel the CSI node waits for. storage.deckhouse.io/ext4-reserved-percenton aNetappStorageConnectionsets the percentage of the filesystem kept for the superuser: a whole number from 0 to 50, default 0. Note the resource — unlike the other storage modules of the fleet, the value is set per connection and not per StorageClass, because Trident keeps the mkfs options on the backend, so it applies to every StorageClass served by that connection. The reserve applies to volumes created afterwards; an existing filesystem keeps the reserve it was created with. An invalid value leaves theNetappStorageConnectionwithReady=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. It isINFOby default, where the controller used to log atDEBUGwith no way to change it. - The controller exports metrics and a PodMonitor 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.
Improvements
This release improves:
- Release notes are written per locale in
.release-notes/<tag>.yamland<tag>.ru.yamlwith the sectionssummary,highlights,new_features,improvements,fixes,security,breaking,upgrade_notes,known_issues,docsanddependencies. Both locales reach the cluster, so the console shows the notes in the language of the reader; the releases cut before this one keep the previous flat format and render on the same page exactly as before.
Fixes
This release fixes:
- The
formatOptionsthe module writes onto a Trident backend reach Trident at all now. They used to sit at the top level of theTridentBackendConfigspec, where the driver has no such field: Trident reads them from underdefaults, so a value at the top level was parsed into nothing and dropped without a word. The-E nodiscardthe module has always asked for was therefore never applied, and every volume was formatted with mkfs discarding the whole device. - 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. A node came up with the node plugin wedged — a dozen restarts and nocsi.trident.netapp.ioin itsCSINode, 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, and the node configuration step then retried forever, leaving the module’sfind_multipaths nounapplied — which is what Trident’s own pre-flight checks read before they agree to stage a volume. The handler restarts the unit when it cannot reload it, and covers the module’s ownd8-csi-netapp-multipathd.serviceas well. - A release tag with no release notes used to publish an empty
changelog.yaml, leavingModuleRelease.spec.changelogblank with a green build. Such a tag now fails the build.
Upgrade notes
Before upgrading, note the following:
- Volumes created after the upgrade carry no reserve for the superuser, so the whole volume is available to the workload; a filesystem that already exists keeps the 5% it was created with. Nothing has to be done by hand — the controller rewrites the
TridentBackendConfigof every connection on its own, and existing volumes and PVCs are not affected. - The controller logs at
INFOafter the upgrade, where it used to log atDEBUGunconditionally. Setsettings.logLeveltoDEBUGorTRACEto get the previous verbosity back. - A node whose csi-node pod was stuck in the registration deadlock recovers as the DaemonSet rolls out the fixed pod — no pod has to be deleted by hand.
Docs
Documentation changes:
- The module’s configuration page 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 arrangements that stay invisible until a volume fails to mount.
- The same page describes the share of a volume kept for the superuser: the annotation, that it belongs on the connection rather than on a StorageClass, the range of values, and that the reserve applies only to volumes created afterwards.
v0.1.24
- Fix: the release image is no longer built from cache with an outdated changelog.yaml — git-mapping dependencies are bound to the install stage, where the file is copied
- Update base images to v2.1.4
- Internal build changes for the module
v0.1.23
- Bugfix: a successful NFS mount is no longer reported as a failure - the image now ships /etc/mtab (a symlink to /proc/self/mounts), without which mount returned exit code 16
- Bugfix: the controller is granted patch on events instead of list - a repeated event write is no longer denied by RBAC
- CVE fixes
- Base images updated to v2.1.2, Go to 1.26.6 and lib-helm to 1.72.14
v0.1.22
- Bugfix: the secret with credentials is created before the TridentBackendConfig that references it, otherwise Trident rejected the backend with the error “backend credentials not found”; When deleting, the order is reversed. At the same time, an early exit from reconcile was eliminated, in which Ready=True was published before the creation of the secret, StorageClass and VolumeSnapshotClass
- Update base images to v1.3.25, Go 1.26.5 and lib-helm to 1.72.13
- Internal changes: work with conditions has been transferred to the general library
v0.1.21
- The snapshot-controller module is no longer a required dependency: VolumeSnapshotClass is created only if the snapshot.storage.k8s.io CRD is present, otherwise NetappStorageClass and NetappStorageConnection are 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.1.20
- 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.10
- Internal changes in module assembly
v0.1.19
- When forwarding labels from NetappStorageClass to StorageClass, labels with specified ignored prefixes are now excluded
- Update base images and lib-helm to 1.72.0
v0.1.18
- Labels from NetappStorageClass are now forwarded to the managed StorageClass Kubernetes
- Update base images, Go 1.25.10 and lib-helm 1.71.12
v0.1.17
- Internal changes in the structure and assembly of the module
v0.1.16
- Update base images, Go 1.25.10 and lib-helm 1.71.11
- Internal changes to the module assembly
v0.1.15
- Corrections to the module structure
v0.1.14
- csi-netapp has been transferred to the distroless build of Trident (host binaries via nsenter), the node plugin’s resistance to restarts has been increased
- Added status.conditions and printer columns to CRD NetappStorageClass and NetappStorageConnection
- Added NodeGroupConfiguration for installing iscsi/multipath on Altlinux, RedOS-like and Ubuntu-like
- Fixed vulnerabilities (CVE) in Trident binary dependencies
v0.1.13
- Changes in CI: DistroPackagesProxy and env proxy in werf, improvements to CVE scans (role_name, checkout)
- Added user-authz cluster roles in templates
v0.1.12
- Added missing mount points in the csi-netapp distroless image
- Update base images, Go and lib-helm (CVE fix)
- Clarifications in the documentation
v0.1.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 working with snapshots
- Changes in CSI work
v0.1.10
- Fix HA-mode, now it works correctly
v0.1.9
- Updated base images versions
- Fixes in docs
v0.1.8
- Updated Go version to 1.24.9
- Updated lib-helm to deckhouse_lib_helm-1.64.1
v0.1.7
- Added release notes
v0.1.6
- Added additional mountings for containerd v2 support
v0.1.5
- Added information about snapshot-controller requirement for module operation
- Added readonlyRootFilesystem for enhanced security
v0.1.4
- CVE fixes
v0.1.3
- Added fixes for containerd v2 support
- Added dependency on snapshot-controller
v0.1.1
- CVE closure
- Module refactoring, fixed manifest errors
- Documentation improvements