The module lifecycle stageGeneral Availability

The module has requirements for installation

v0.7.5

Release date: 2026-09-14

The scheduler extender now runs on the control-plane nodes, next to the kube-scheduler that consults it.

Highlights

Changes in this release:

  • The sds-common-scheduler-extender Pod is placed on control-plane nodes instead of system ones, and tolerates their taints.

Fixes

This release fixes:

  • The sds-common-scheduler-extender Deployment asked for system nodes and carried the system tolerations, which tolerate neither the control-plane taint nor custom ones, so the Pod could not be placed on a control-plane node. It now selects master nodes — falling back to system nodes in clusters that expose no master role — and tolerates any node, which puts it next to the kube-scheduler that calls it on every scheduling attempt of the modules that register it.

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 /metrics endpoints of the controller and the scheduler extender are no longer reachable without authentication: both bind on 127.0.0.1 and a kube-rbac-proxy publishes them, so a scrape needs get on deployments/prometheus-metrics.
  • A percent-sized LVMLogicalVolume100%FREE of a whole volume group, the shape sds-elastic uses for one OSD per disk — is no longer refused at creation and no longer parked in Failed with unable 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_total and utils_commands_errors_count_total are 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:

  • LVMLogicalVolume with a percentage in spec.size is 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 into Failed. Percent sizes are now floored to the extent boundary.
  • An LVMLogicalVolume that had been marked Failed because the group’s free space still lagged behind the just-created LV stayed Failed for 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 to Created.
  • The agent could report block device size is invalid for 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 -f from removing the map, and left the volume in Node.status.volumesInUse, so it could not be attached elsewhere. Such maps — a mpath- device-mapper UUID with no slaves — are now rejected in the global_filter of 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/crypto used by the module hooks is updated to 0.56.0, which closes CVE-2026-56854 (critical, authentication bypass in x/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 get on deployments/prometheus-metrics.
  • Log records changed shape, so a filter that matched the component name inside the message text has to match the logger field 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 enableThinProvisioning to true
  • 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