The module lifecycle stage: General Availability
The module has requirements for installation
v0.4.9
Release date: 2026-09-14
Prometheus can scrape the controller metrics again, and a node whose repositories have no NFSv3 userspace now gets it from the module instead of leaving every NFSv3 volume waiting forever.
Highlights
Changes in this release:
- Where a node’s package manager cannot install
rpcbindandnfs-common/nfs-utils, the module installs the two daemons from its ownnfs-toolsimage. Without them the CSI node Pod never starts on that node and every NFSv3 mount waits forever. - The
kube-rbac-proxyin front of the controller metrics is authorized to check scrapes again: since the metrics moved behind it, every scrape was refused and the controller target stayed down in Prometheus.
New features
This release adds:
- On a node whose repositories cannot provide
rpcbindandnfs-common/nfs-utils, theNodeGroupConfigurationfalls back to the module’s ownnfs-toolspackage image: the payload is unpacked under/var/lib/deckhouse/sds/csi-nfsand the daemons come up asd8-csi-nfs-rpcbind.serviceandd8-csi-nfs-rpc-statd.service. The distribution’s packages stay the preferred path and a node that already hasrpcbindof its own is left untouched. This concerns NFSv3 only, so it applies to clusters withv3support: true; NFSv4 needs neither daemon. The install step now also fails the bashible step when the portmapper socket does not answer, instead of reporting success and leaving the node with mounts that hang.
Improvements
This release improves:
- The default
logLevelis nowINFOinstead ofDEBUG, which is what a cluster that never set it explicitly will get.
Fixes
This release fixes:
- Prometheus could not scrape the module controller: the
kube-rbac-proxyin front of its metrics was not allowed to create theTokenReviewandSubjectAccessReviewthat every scrape is authorized with, so all scrapes were refused and the target stayed down. Clusters running v0.4.8, where the metrics moved behind the proxy, are the ones affected. rpc.statdfrom the module’s own package can reachsm-notifyand no longer starts on an empty state file, so a node that has rebooted announces the reboot to the peers holding NFSv3 locks on it.
Upgrade notes
Before upgrading, note the following:
- Nothing has to be done by hand. The controller target in Prometheus recovers on its own once the updated controller is rolled out, and the NFSv3 fallback only touches nodes where the distribution packages cannot be installed.
- A cluster that relied on the previous default verbosity should set
logLevel: DEBUGin the module configuration explicitly, because the default is nowINFO.
v0.4.8
Release date: 2026-09-07
The metrics of the controller and of the scheduler extender are now published through a kube-rbac-proxy and scraped by Prometheus, and every component logs in the shared structured format.
Highlights
Changes in this release:
- The controller and the scheduler extender no longer serve their metrics unauthenticated: each binds on
127.0.0.1and akube-rbac-proxyin the same pod publishes them over TLS, behind an authorization check. - The metrics of the scheduler extender — reconcile counts, workqueue depth, Go runtime — reach Prometheus for the first time, through a new
PodMonitor.
New features
This release adds:
- A
PodMonitornamedcsi-nfs-scheduler-extendermakes the metrics of the scheduler extender available in Prometheus. It is created only where thePodMonitorkind exists, so a cluster without monitoring is unaffected.
Improvements
This release improves:
- The controller, the scheduler extender and the webhooks moved onto the shared logger of the storage modules: messages carry structured
key=valuefields and the name of the component that wrote them, instead of the[main]-style prefixes. Anything that parses these logs by their old shape has to be adjusted. - The
kube-rbac-proxyof the scheduler extender has no readiness probe on purpose: a sidecar that only serves metrics must never be able to stop the kube-scheduler from calling the extender.
Fixes
This release fixes:
- The
ServiceMonitorof the controller is now created whenever theServiceMonitorkind is present, not only when theoperator-prometheus-crdmodule is listed as enabled. Its metrics — including the validity of the RPC-with-TLS certificates, which nothing in this module rotates — used to stay unscraped in a converge that had only just applied the Prometheus operator CRDs. - The
VerticalPodAutoscalerof the scheduler extender is gated the same way, so it is no longer skipped in a converge that installs the VPA CRDs alongside the module.
Security updates
Security updates in this release:
- The metrics endpoints of the controller and of the scheduler extender are no longer reachable on the pod IP without credentials. Scraping them now requires
getondeployments/prometheus-metricsford8-csi-nfs-controllerandcsi-nfs-scheduler-extenderrespectively.
Upgrade notes
Before upgrading, note the following:
- Nothing has to be done by hand: the
ServiceMonitorshipped by the module is updated with it, and the newPodMonitorappears on its own. - The metrics port of the controller
Serviceis renamed frommetricstohttps-metricsand now speaks HTTPS. Any scrape configuration of your own that pointed at the plain-HTTP port has to be pointed at the proxy and given the Prometheus token.
v0.4.7
- 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
- Internal build changes for the module
v0.4.6
- Bugfix: a successful 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. The wrap-mount wrapper that used to mask this error has been removed
- Bugfix: the VPA is switched from the deprecated Auto update mode to InPlaceOrRecreate
- Bugfix: the controller is granted patch on events instead of list - a repeated event write is no longer denied by RBAC
- Expiry metrics for the RPC-with-TLS certificates - csi_nfs_tls_certificate_not_after_timestamp_seconds and csi_nfs_tls_certificate_not_before_timestamp_seconds, one series per certificate from the tlshd-conf ConfigMap - and three alerting rules: CsiNfsTLSCertificateExpiringSoon (less than 14 days left), CsiNfsTLSCertificateExpired and CsiNfsTLSCertificateNotYetValid
- Base images updated to v2.1.2, Go to 1.26.6 and lib-helm to 1.72.14
- CVE fixes
v0.4.5
- Bugfix: optional resources (for example, scheduler-extender) are now included based on the presence of the corresponding CRD, and not on the list of modules
- Internal changes in module assembly
v0.4.4
- NFSStorageClass publishes status.conditions and status.observedGeneration; the Ready condition indicates whether the controller has applied the current specification; a Ready column has been added. The status.phase field retains the same set of values and its column
- Correction: the condition message is truncated to a valid schema length - otherwise the API server would reject the status record
- Updating base images to v1.3.25 and lib-helm to 1.72.13
v0.4.3
- The snapshot-controller module is no longer a required dependency: VolumeSnapshotClass (general and for each NFSStorageClass) is created only if the CRD snapshot.storage.k8s.io is available, otherwise NFSStorageClass is processed without the snapshot part
- Updating 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.4.2
- Fixed tlshd startup: The wrapper uses the installation paths of the ktls-utils package, so the net-handshake-checker containers in csi-controller and csi-node no longer crash with the error “no such file or directory”
- Fixed NFSv3 mounts: the /etc/netconfig file was added to the image, without which SUN RPC calls from userspace did not go beyond the portmapper (NFSv4 is not affected)
- Fixed CreateVolume/CreateSnapshot idempotency: a repeated call no longer overwrites the data of an already created volume - previously this led to the inability to boot VMs from newly cloned disks
- Updating base images, Go 1.26.5 and lib-helm to 1.72.10
- Documentation updated: README, examples, FAQ and CR descriptions
- Internal changes in module assembly and CI, added a set of e2e tests
v0.4.1
- Updating base images, Go 1.26.5 and lib-helm to 1.72.9
- Internal changes in module assembly
v0.4.0
- Fixed generation of access secret to registry (deckhouse-registry): Now it only contains authorization data for the active image source
- Transition to distroless images
- Updating container-base images to v1.1.8, Go 1.26.4 and lib-helm to 1.72.4
v0.3.27
- When forwarding labels from NFSStorageClass to StorageClass, labels with specified ignored prefixes are now excluded
- Updating base images and lib-helm to 1.72.0
v0.3.26
- Labels from NFSStorageClass are now forwarded to the Kubernetes managed StorageClass
- Update base images, Go 1.25.10 and lib-helm 1.71.12
v0.3.25
- Internal changes in module structure and assembly
v0.3.24
- Added mount points in the csi-nfs-scheduler-extender distroless image
- NFS server installation guide for RedOS
- Internal changes in module structure and assembly
v0.3.23
- Update base images, Go 1.25.10 and lib-helm 1.71.11
- Internal changes to the module assembly
v0.3.22
- Corrections to the module structure
v0.3.21
- CI changes: DistroPackagesProxy and env proxy in werf, improvements to CVE scans (role_name, checkout)
- Added user-authz cluster roles in templates
v0.3.20
- Installing packages in NodeGroupConfiguration no longer causes the script to crash on errors
v0.3.19
- Updating base images and lib-helm
v0.3.18
- Fix CVE
- Documentation changes
v0.3.17
- 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)
v0.3.16
- Module-sdk update for CVE fix
- Refactoring manifests
- Fixed an error when placing pods on nodes in the absence of NFSStorageClass
v0.3.15
- Updated base images versions
- Documentation fixes
- Manifest fixes
- Updated CSI driver version to v4.12.1
- CVE fixes
v0.3.14
- Documentation fixes
- Build changes for CSE version
v0.3.13
- Updated base images versions
- CVE fixes
- Updated golang version to 1.24.10
v0.3.12
- Updated Go version to 1.24.9
- Updated lib-helm to deckhouse_lib_helm-1.64.1
- Documentation update
v0.3.11
- CVE fixes
v0.3.10
- Updated Go version to 1.24.8
- Updated lib-helm to deckhouse_lib_helm-1.63.6
v0.3.9
- Fixes for containerd v2 support
- Fixes for better centos-like distros support
- Some module structure changes
v0.3.8
- Added requirements for DVP in docs
v0.3.7
- Removed some legacy code
v0.3.6
- Added release notes
- Hooks switched from python to golang
v0.3.5
- Added containerd v2 support
v0.3.4
- Added additional mountings for containerd v2 support
v0.3.3
- Added information about the need for snapshot-controller for module operation
- Added readonlyRootFilesystem for enhanced module security
v0.3.2
- CVE fixes
v0.3.1
- Service account changed to “csi”
- Added dependency on snapshot-controller
- Internal changes for containerd v2 support
- CVE fixes
- Documentation fixes
v0.3.0
- Added HA mode support in controller
- Fixes for proper volume snapshots operation
- Updated CSI version to current v4.11.0
v0.2.5
- CSI bugfix (missing /tmp mount point was fixed)
v0.2.4
- Technical release, module refactoring
v0.2.3
- Added base64 certificate validation in MC
- Fixes in RPC-with-TLS mechanism
- Module refactoring
v0.1.10
- Multiple fixes and improvements in RBAC, MC work, controllers
- Added ability to specify workload node selector, considering which csi-nfs components and useful user workload will be deployed
v0.1.9
- Fixed healthcheck ports for csi
- Fixed installation and startup of rpcbind