The module lifecycle stage: General Availability
The module has requirements for installation
v0.7.4
Release date: 2026-09-11
Controller and scheduler extender metrics are now published through a kube-rbac-proxy, and percent-sized LVMLogicalVolumes are no longer rejected or left in Failed once they reach their requested size.
Highlights
Changes in this release:
- The
/metricsendpoints of the controller and the scheduler extender are no longer reachable without authentication: both bind on127.0.0.1and a kube-rbac-proxy publishes them, so a scrape needsgetondeployments/prometheus-metrics. - A percent-sized
LVMLogicalVolume—100%FREEof a whole volume group, the shape sds-elastic uses for one OSD per disk — is no longer refused at creation and no longer parked inFailedwithunable to extend LV, err: not enough space. - An LVM scan that reaches a multipath map with no remaining paths no longer blocks the agent, so the node keeps reporting its block devices and its RWO volumes can move to another node.
Improvements
This release improves:
- Metrics of the scheduler extender are collected for the first time: the manager had always bound the port, but nothing declared or scraped it.
utils_commands_execution_count_totalandutils_commands_errors_count_totalare exported at last. Both were incremented in about forty places in the agent and the controller but never registered, so nothing they counted was visible.- All binaries of the module log through one shared logger. The name of the component that emitted a record is now a field of the record (
logger) rather than a bracketed prefix inside the message text.
Fixes
This release fixes:
LVMLogicalVolumewith a percentage inspec.sizeis computed against a capacity LVM reports as the raw device sum, which is not extent-aligned. Rounding the request up landed one extent past that capacity, so a request for 100% of a volume group was judged not to fit into it: creation was refused, and the extender put an already full-size volume intoFailed. Percent sizes are now floored to the extent boundary.- An
LVMLogicalVolumethat had been markedFailedbecause the group’s free space still lagged behind the just-created LV stayedFailedfor the rest of its life, since later passes returned early on a volume that was already at its requested size. Such a volume now moves toCreated. - The agent could report
block device size is invalidfor a healthy device: the ioctl output variable lived on the stack and a stack growth during the call moved it, so the size was written to the old address and stayed zero. - An LVM scan that reached a multipath map whose paths were all gone blocked in the kernel instead of failing, and every stuck scan held the map open. That stalled the agent, kept
multipath -ffrom removing the map, and left the volume inNode.status.volumesInUse, so it could not be attached elsewhere. Such maps — ampath-device-mapper UUID with no slaves — are now rejected in theglobal_filterof every LVM command.
Security updates
Security updates in this release:
- Anonymous access to the controller and scheduler extender metrics is closed. Previously the endpoints authenticated no one, were reachable from every pod in the cluster, and the ServiceMonitor sent the Prometheus ServiceAccount token to them over plain HTTP.
golang.org/x/cryptoused by the module hooks is updated to 0.56.0, which closes CVE-2026-56854 (critical, authentication bypass inx/crypto/ssh), CVE-2026-56855 and CVE-2026-78662.
Upgrade notes
Before upgrading, note the following:
- Nothing has to be done by hand for metrics: the ServiceMonitor shipped with the module already scrapes the proxy over HTTPS with a token. Only a collector of your own that used to read the controller metrics directly over HTTP has to be pointed at the proxy port and granted
getondeployments/prometheus-metrics. - Log records changed shape, so a filter that matched the component name inside the message text has to match the
loggerfield instead.
v0.7.3
- Added the Missing condition to BlockDevice: a missing but still occupied device (e.g., part of an LVM Physical Volume) no longer remains forever with a stale status.path. It is first set to Unknown; True is set only if the device is continuously absent for 10 minutes, so a flapping iSCSI path that recovers on its own is not marked. The condition is cleared as soon as the device is found again; the object itself is not deleted to avoid breaking references from LVMVolumeGroup and LVMLogicalVolume
- Fix: the agent no longer crashes on a cached logical volume without LVM attributes
- Fix: VPA ceilings for the agent, scheduler-extender, and controller are raised to match measured consumption
- Fix: the release image is no longer built from a cache with an outdated changelog.yaml — git-mapping dependencies are tied to the install stage where the file is copied
- Updated base images to v2.1.3 and lib-helm to 1.72.14
- Documentation: described virtual disk serial numbers
- Internal build changes for the module
v0.7.2
- Bugfix: the controller is granted permission to write events (create and patch) - previously the event write was denied by RBAC
- CVE fixes
- Internal build changes: CI updated, crds, docs and openapi are shipped in the release image
v0.7.1
- Correction: one “orphaned” device-mapper device without a disk no longer stops BlockDevice detection on the entire node - previously, because of it, the agent did not create a single BlockDevice on the node, including healthy disks
- Correction: LVMVolumeGroup with a single PV whose name could not be determined immediately no longer hangs in Pending forever - empty status.nodes post and no retry in the absence of udev events have been fixed
- Correction: the agent substitutes the serial number inherited from the parent device if direct reading of the serial number fails (multipath participants, crypt/dm devices) - previously such devices were skipped when detecting BlockDevice
- Optional resources (VerticalPodAutoscaler, PodMonitor/ServiceMonitor) are now enabled based on the presence of a CRD in the API, and not based on the enabledModules list
- Documentation: fixed duplication of the description key in the Russian CRD LVMVolumeGroup, which broke docs-builder, added the missing status.extentSize description and restored the blockDevice description
v0.7.0
- Correction: the agent no longer accepts LVM structures inside block devices given to virtual machines as its own - the /dev/loop exception was returned in the LVM global_filter. Fixed the resulting LVMVolumeGroup failures with CacheEmpty and ScanFailed causes - the VG name is no longer considered an identifier, and the LVM warning about a duplicate of someone else’s name is not attributed to our group
- Added support for LVM on files: spec.fileDevices field of LVMVolumeGroup and LVMVolumeGroupSet. The agent creates a file, connects it as a loop device and uses it as a PV, which gives LVM storage on a node without a free disk; the blockDeviceSelector field has become optional
- The scheduler (scheduler-extender) takes into account the PVCs listed in the extra-pvcs pod annotation
- LVMLogicalVolume, LVMLogicalVolumeSnapshot and LVMVolumeGroupSet publish status.conditions; BlockDevice now has a Consumable condition, explaining why the device cannot be used; processing of LVMVolumeGroup conditions has been brought to a general form
- Correction: a volume created from a snapshot or clone is expanded to the requested size - previously the PVC remained in Pending waiting for a size that never appeared
- Correction: thin pool set by percentage of VG size no longer gets stuck at VGConfigurationApplied=False due to LVM rounding by one extent
- Correction: an idle call to lvextend is recognized as harmless on LVM 2.03.16 - otherwise LVMVolumeGroup remained in NotReady
- Correction: when taking control of an existing VG, blockDeviceSelector no longer remains empty
- Correction: after pvcreate and vgcreate the agent calls udevadm to update the udev database
- Correction: when storage-foundation is enabled, the agent loads the dm_snapshot kernel module
- Removed outdated CRD LvmVolumeGroupBackup, left over from a one-time migration: the new hook removes finalizers from leftovers and removes the CRD itself
- Added an experimental mode for detecting block devices via netlink, enabled by the ENABLE_NETLINK_BLOCK_DEVICE_DISCOVERY flag
- Updating base images to v1.3.25, Go 1.26.5 and lib-helm to 1.72.13
- Fixed vulnerabilities in golang.org/x/net, golang.org/x/sys and golang.org/x/crypto
- Internal changes in module assembly and CI, the set of e2e tests has been significantly expanded
v0.6.10
- The general accept rule was removed from LVM global_filter, which led to scanning of non-standard paths (/dev/disk/by-diskseq/*) and duplication of VG names
v0.6.9
- The agent now ignores “foreign” block devices (rbd, drbd, nbd, loop) when scanning LVM
- Fixed handling of duplicate VG names: LVMVolumeGroup status is no longer corrupted
- The blocking of the agent pod launch has been eliminated; added timeouts for LVM commands
- Improved stability of legacy block device names: matching by serial number or WWN prevents re-creation when name changes
- Fixed BlockDevice selector validation: the In operator is now the only valid one
v0.6.8
- Fixed race in scheduler-extender when PVC.Status.Phase is empty: PVC binding decision is now made based on Spec.VolumeName, nodes without a suitable LVMVolumeGroup are always rejected
- Agent is now also scheduled on sds-elastic data nodes
- Updating base images and lib-helm to 1.72.0
v0.6.7
- Update base images, Go 1.25.10 and lib-helm 1.71.12
- Internal changes in module structure and assembly
v0.6.6
- Internal changes in module structure and assembly
v0.6.5
- Update base images, Go 1.25.10 and lib-helm 1.71.11
- Internal changes to the module assembly
v0.6.4
- Corrections to the module structure
v0.6.3
- scheduler-extender: PVCs with a missing StorageClass no longer block pod scheduling
v0.6.2
- CI changes: DistroPackagesProxy and env proxy in werf, improvements to CVE scans (role_name, checkout)
- Added user-authz cluster roles in templates
v0.6.1
- Added detection of mount points via the mountinfo parser in the agent
- Added locality of replicas to scheduler-extender for replicated volumes
- Fixed reconciliation races and loops in LVG/LLV controllers
- ExtentSize was taken into account when comparing in discoverer and fallback 4Mi was added in the LLV controller
- Removed false marking of LLV as Failed when actualSize > spec.size
- Fixed double subtraction of Failed LLV from actualSize when calculating free space in scheduler-extender
- Updating base images and lib-helm
v0.6.0
- CVE fixes
- Transition to a common scheduler for SDS
- Replacing a fixed resize delta with automatic determination of the LVM partition size delta
- Automatic activation of LVM partitions during volume operations
v0.5.16
- Added a hook for clearing resources when the module is turned off
- Removed the enableThinProvisioning setting, we assume that thin provisioning is always enabled
- Module-sdk update for CVE fix, golang update
v0.5.15
- Added metrics for LVM volumes
- Module-sdk update for CVE fix
- Refactoring manifests
v0.5.14
- Updated base images and lib-helm versions
- Set default value for
enableThinProvisioningtotrue - Docs improvements
- Fixed templates security context
- Added support for HA mode
v0.5.13
- Updated base images versions
v0.5.12
- Updated Go version to 1.24.9
- Updated lib-helm to deckhouse_lib_helm-1.64.1
- Documentation updates
v0.5.11
- Fixed volume cleanup for thin volumes in some OSes
v0.5.10
- Removed obsolete python requirements
v0.5.9
- Fixed bug with unactivation of logical volumes
v0.5.8
- Added release notes
v0.5.7
- Fix sys-fs-cgroup error for containerdv2 support
v0.5.6
- Added additional mounts for containerd v2 support
v0.5.5
- CVE fixes
v0.5.4
- CVE fixes
- Internal changes for containerd v2 support
v0.5.3
- Fixed bug preventing LVG status updates when missed/notready nodes are present in the cluster
v0.5.2
- Removed support for sds-drbd module
- Added hiding of csi-scsi-generic devices
v0.5.1
- Technical release, module refactoring
v0.5.0
- Added ability to wipe data in enterprise versions
- Multiple documentation fixes
v0.4.6
- Technical release. Removed “Preview” status from documentation
v0.4.5
- Numerous documentation fixes
- Added LVMVolumeGroupSet and LVMLogicalVolumeSnapshots
- Fixed work with labels and finalizers in some internal objects
- Added dm_snapshot loading when needed
v0.4.3
- Fixed crash of BlockDevices migration script when finalizers are missing on resources
v0.4.2
- Fix for supporting BlockDevice serial numbers up to 63 characters long
v0.4.1
- Fixed potential issue with missing labels in LvmVolumeGroup->LVMVolumeGroup migration hook
- Added controller that tracks labels on BlockDevice resources for quick updates of LVMVolumeGroup resources
v0.4.0
- LvmVolumeGroups resources will be migrated to LVMVolumeGroups
- Exact BlockDevices lists in LVMVolumeGroups will be migrated to selectors
- Multiple fixes in controllers and documentation
v0.3.2
- Fix in sds-health-watcher-controller which could incorrectly handle the status of some nodes
v0.3.1
- Updated golang to current 1.22.6 to close known vulnerabilities
v0.3.0
- Added thin provisioning configuration in mc for automatic dm_thin_pool module loading
- Images moved to distroless
- Added labels to BlockDevices entity (for future use in BlockDevicesSelectors)
- Multiple bug fixes and documentation improvements
v0.2.5
- Added metrics and their collection in Prometheus, health check ports moved to correct ones
v0.2.4
- Added auto-expansion for thin pools LVM volume groups and LVM logical volumes
v0.2.3
- Added internal cache for performance improvement
- Added health and readiness checks to controller
- Improved resource display in cli
- Now LVM volume groups are deleted when corresponding k8s resource is deleted, not when annotation is added
- Added LVM volume group size specification in percentages
- Added AllocationLimit support in LVM volume group
- Added support for contiguous volumes in sds-local-volume
v0.2.1
- Added multipath devices support
v0.2.0
- Added LVMLogicalVolumeWatcher CRDs
- Added more test cases
- Added AreSizesEqualWithinDelta function
- Fixed resize for thinPools
- Added tests to LvmLogicalVolumeWatcher controller
- Fixed naming in LVMLogicalVolume
- Added node affinity
- Enhanced LVMLogicalVolume handling with logging, size display, and event processing
- Statically linked nsenter, lsblk and lvm utils
- Fixed serial discovery by switching to dynamic lsblk
- Rewrote bin-copier script in Golang
- Moved lsblk and its libraries inside the agent image
- Added age field
- Implemented stderr filtering for LVM commands
- Added bench-tests for LVMLogicalVolume controller
- Changed size type from string to quantity
- Added parallel reconciliation to lvm_logical_volume_watcher and VG size validation to lvm_volume_group_watcher