The module lifecycle stage: General Availability
The module has requirements for installation
v0.2.25
Release date: 2026-10-01
Volumes stay mounted when the csi-node Pod restarts, because geesefs now runs as a systemd service of the node, and a deleted S3StorageClass keeps its credentials until its PersistentVolumes are gone.
Highlights
Changes in this release:
geesefsruns as a transient systemd service of the node (geesefs-<volume>.service) instead of inside thecsi-nodecontainer, so a restart, eviction or update ofcsi-nodeno longer leaves the volumes of that node answering “Transport endpoint is not connected”.- Deleting an
S3StorageClassremoves its StorageClass at once but keeps the Secretcsi-s3-<name>ind8-csi-s3and theS3StorageClassitself until every PersistentVolume that refers to the Secret is deleted, so those volumes can still be mounted and their buckets are removed on deletion.
Improvements
This release improves:
- On DKP 1.78 and later the module’s access roles follow the capability/scope RBACv2 scheme:
d8:system-capability:csi-s3:viewgrants read-only access toS3StorageClass, andd8:system-capability:csi-s3:editgrants create, update and delete. They replaced8:manage:permission:module:csi-s3:viewandd8:manage:permission:module:csi-s3:editthere and are still aggregated into the storage viewer and manager roles. Below DKP 1.78 the previous roles are rendered unchanged.
Fixes
This release fixes:
geesefswas started inside thecsi-nodecontainer and died with it on every restart, eviction (including VPA in-place updates) or update of the Pod, leaving each volume mounted on that node unreachable until it was unstaged. The driver now startsgeesefsthrough the node’s systemd, which keeps it running independently of the Pod. The S3 credentials of the service are passed in a root-only file under/run/csi-s3instead of the unit’sEnvironmentproperty, which any node user could read withsystemctl show. The certificates fromcustomCACertificatesare copied to the node so thatgeesefsstill trusts them, andgeesefsresolves the endpoint through the cluster DNS of thecsi-nodePod, so anendpointUrlgiven as a Service name (https://<service>.<namespace>.svc) keeps working although the node’s own resolver does not know the cluster domain. A dead FUSE mount left on the node is unmounted inNodeStageVolume,NodePublishVolumeandNodeUnstageVolumeinstead of failing the operation.- Deleting an
S3StorageClassdeleted the Secretcsi-s3-<name>and removed the finalizer immediately, even while PersistentVolumes of the class existed.external-provisionerreads the deletion credentials from that Secret, so these volumes stayedReleasedfor good and their buckets were never removed. The controller now deletes the StorageClass right away, which stops new provisioning, and keeps the Secret and the finalizer while any PersistentVolume of the driver refers to the Secret, whatever its reclaim policy. Meanwhile theReadycondition isFalsewith the reasonDeleting, and its message lists the PersistentVolumes it is waiting for. The controller now has read access topersistentvolumes. customCACertificatesaccepts each certificate as PEM text, as the documentation says, as well as Base64-encoded PEM. Before, only Base64 worked: a PEM value was rejected by the ModuleConfig webhook, or, in a ModuleConfig applied before the module was installed, ended up in thecsi-s3-custom-caConfigMap as an error text instead of the certificate, and every request to the endpoint failed withx509: certificate signed by unknown authority. Values already set in Base64 keep working.
Upgrade notes
Before upgrading, note the following:
- Updating the module restarts the
csi-nodePods. Volumes mounted before the update are still served bygeesefsprocesses inside the old containers, and those stop with them: on each node, Pods that usecsi-s3volumes get “Transport endpoint is not connected” until they are recreated. Recreate such Pods after the update. Their volumes are then mounted through the node’s systemd, and latercsi-noderestarts no longer affect them. - On DKP 1.78 and later the ClusterRoles
d8:manage:permission:module:csi-s3:viewandd8:manage:permission:module:csi-s3:editare replaced byd8:system-capability:csi-s3:viewandd8:system-capability:csi-s3:edit. Access granted through the storage viewer and manager roles is not affected. A RoleBinding or ClusterRoleBinding that refers to one of the old names directly has to be switched to the new name. - An
S3StorageClassdeleted while it still has PersistentVolumes now stays in the cluster withReady=Falseand reasonDeletinguntil they are gone. Delete the PVCs of the listed volumes. A PersistentVolume with theRetainreclaim policy is never deleted automatically: delete the PersistentVolume object yourself; its data stays in the bucket.
Docs
Documentation changes:
- The FAQ explains why a deleted
S3StorageClassstays in the cluster, how to read the list of PersistentVolumes it is waiting for, and what to do with volumes that have theRetainreclaim policy.
Dependencies
Dependency updates:
geesefs:0.43.7→0.43.9(changelog)- The
geesefsFUSE file system used to mount the volumes is updated. The dependency patches are combined into one and still raisegrpc,x/cryptoand OpenTelemetry to versions that close the known CVEs.
- The
v0.2.24
Release date: 2026-09-24
Security update: the CSI driver, geesefs and the module’s hooks are rebuilt against patched grpc, x/crypto and OpenTelemetry.
Highlights
Changes in this release:
google.golang.org/grpcis raised from v1.82.1 to v1.83.2 in the CSI driver (s3driver) andgeesefs, closing CVE-2026-84303, CVE-2026-84304 and CVE-2026-84445.
Security updates
Security updates in this release:
google.golang.org/grpcis raised from v1.82.1 to v1.83.2 in the CSI driver (s3driver) andgeesefs, closing CVE-2026-84303, CVE-2026-84304 and CVE-2026-84445.golang.org/x/cryptois raised from v0.53.0 to v0.57.0 in the CSI driver (s3driver),geesefsand the module’s hooks (go-hooks), closing CVE-2026-56854 (authentication bypass by source address inx/crypto/ssh), CVE-2026-56855 and CVE-2026-78662.- The OpenTelemetry modules (
go.opentelemetry.io/otel,metric,sdk,trace) are raised from v1.44.0 to v1.45.0 ingeesefs, closing CVE-2026-81870.
v0.2.23
Release date: 2026-09-15
The module logs at INFO by default instead of DEBUG, so an installation that never chose a level stops writing debug output from its controller.
Highlights
Changes in this release:
logLeveldefaults toINFOinstead ofDEBUG. Where the level was never set in the module configuration, the controller and its validating webhook become markedly quieter after the update; settinglogLevel: DEBUGbrings the previous verbosity back.
Improvements
This release improves:
- The default of
logLevelin the module configuration is nowINFO. The setting reaches the controller and the validating webhook that share its pod, soDEBUGas the default meant that every installation which never touched the setting ran at troubleshooting verbosity and paid for it in log volume. AlogLevelstated explicitly in the ModuleConfig is honoured exactly as before, whatever it says.
Upgrade notes
Before upgrading, note the following:
- Nothing has to be done in the module configuration. Where
logLevelis not set, the components come up atINFOas the controller pod rolls out with the update; where it is set, the level stays as configured. To keep the previous behaviour, setlogLevel: DEBUGexplicitly.
v0.2.22
Release date: 2026-09-09
The controller metrics announced in the previous release are actually collected now: the kube-rbac-proxy in front of them could not authorise a single scrape.
Highlights
Changes in this release:
- Prometheus collects the controller metrics, which it never once managed to do since they were introduced in the previous release. The kube-rbac-proxy that fronts them had no permission to create the
TokenReviewandSubjectAccessReviewevery scrape is authorised with, so it rejected all of them:up == 0for thecsi-s3-controllerjob and aTargetDownthat never cleared.
Fixes
This release fixes:
- The kube-rbac-proxy in front of the controller metrics is bound to the
d8:rbac-proxyClusterRole now, so it can authorise a scrape. Without that binding it failed closed on every scrape, and the only symptom was an unreachable target: not one metric of the module’s controller reached Prometheus — reconcile counts and durations, workqueue depth, client-go latency, all of them — andTargetDownfired for as long as the module was installed.
Upgrade notes
Before upgrading, note the following:
- Nothing has to be done in the module configuration. A
TargetDownfiring for thecsi-s3-controllerjob clears on its own once the new controller pod is running and the first scrape succeeds.
v0.2.21
Release date: 2026-09-04
The module controller now exports Prometheus metrics, scraped through the kube-rbac-proxy of its own pod, and writes structured logs; a release of the module is described in sections and in both languages.
Highlights
Changes in this release:
- Controller metrics are collected by Prometheus with no configuration: a
ServiceMonitorind8-monitoringscrapes them under the jobcsi-s3-controller, so reconcile counts and durations, workqueue depth and client-go latency become visible. - The controller writes structured logs — a component name and key-value fields instead of the
[main]-style prefixes — so anything that parses its log lines has to be adjusted. - A release is described in sections — summary, highlights, new features, improvements, fixes — in English and in Russian, and the console shows the notes in the language of the reader.
New features
This release adds:
- The controller now exports metrics.
Improvements
This release improves:
- The controller logs through the shared logger of the storage modules: every line carries the component it came from and its fields as key-value pairs.
settings.logLevelkeeps working exactly as before (ERROR,WARN,INFO,DEBUG) — what changed is the shape of a line, not the level. - 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; the releases cut before this one keep the previous flat format and render on the same page exactly as before.
Fixes
This release fixes:
- 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:
- Nothing has to be done in the module configuration.
v0.2.20
- Bugfix: the controller is granted patch on events instead of list - a repeated event write is no longer denied by RBAC
- Base images updated to v2.1.2, Go to 1.26.6 and lib-helm to 1.72.14
v0.2.19
- S3StorageClass publishes 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
- Update base images to v1.3.25, Go 1.26.5 and lib-helm to 1.72.13
v0.2.18
- Update base images, Go 1.26.5 and lib-helm to 1.72.12
- Fixed vulnerabilities in third-party dependencies
- Internal changes in module assembly and CI, added a set of e2e tests
v0.2.17
- Update base images, Go 1.26.5 and lib-helm to 1.72.9
- Internal changes in module assembly
v0.2.16
- Fixed the formation of the registry access secret (deckhouse-registry): now it only includes authorization data for the active image source
- Updating container-base images to v1.1.8, Go 1.26.4 and lib-helm to 1.72.4
v0.2.15
- When forwarding labels from S3StorageClass to StorageClass, labels with specified ignored prefixes are now excluded
- Update base images and lib-helm to 1.72.0
v0.2.14
- Labels from S3StorageClass are now forwarded to the managed StorageClass Kubernetes
- Update base images, Go 1.25.10 and lib-helm 1.71.12
v0.2.13
- Added dataNodes.nodeSelector parameter to control the placement of DaemonSet csi-node; an empty object is rejected by the validating webhook
- Added controller that synchronizes nodeSelector value with DaemonSet csi-node
v0.2.12
- Internal changes in the structure and assembly of the module
v0.2.11
- Update base images, Go 1.25.10 and lib-helm 1.71.11
- Internal changes to the module assembly
v0.2.10
- Corrections to the module structure
v0.2.9
- 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.8
- Added infrastructure and missing mount points for distroless images
- Update base images, Go and lib-helm (CVE fix)
- Documentation on module configuration parameters
v0.2.7
- 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)
- Update version k8s-csi-s3 to 0.43.3
v0.2.6
- Reworking module manifests
v0.2.5
- Updated base images version to v0.5.46
- Updated Go version to 1.24.11
- Fixed S3StorageClass field names in documentation examples
- Fixed YAML syntax errors in FAQ examples
- Merged controller and webhooks into single deployment
- Added HA mode support for CSI controller
v0.2.4
- Updated base images versions
v0.2.3
- Updated Go version to 1.24.9
- Updated lib-helm to deckhouse_lib_helm-1.64.1
v0.2.2
- Added release notes
v0.2.1
- Added readonlyRootFilesystem for enhanced module security
v0.2.0
- Module refactoring
- Service account changed to “csi”
v0.1.5
- Minor documentation fix
v0.1.4
- Module refactoring without changing functionality for end users
- Added Deckhouse version requirements (>= 1.67)
v0.1.3
- Added support for custom CA certificates
- Updated GeeseFS to version 0.43.0