Стадия жизненного цикла модуля: Общедоступная версия

У модуля есть требования для установки

v0.7.5

Дата релиза: 2026-09-14

Scheduler extender теперь работает на узлах control plane — рядом с kube-scheduler, который к нему обращается.

Ключевые изменения

Изменения в этом релизе:

  • Под sds-common-scheduler-extender размещается на узлах control plane, а не на системных, и терпит их taint (метку-ограничение, запрещающую планирование обычных подов).

Исправления

В этом релизе исправлено:

  • Deployment sds-common-scheduler-extender запрашивал системные узлы и нёс tolerations стратегии system, которая не терпит ни taint узлов control plane, ни пользовательские, поэтому под не мог быть размещён на узле control plane. Теперь он выбирает master-узлы — с откатом на системные в кластерах, где роль master не объявлена, — и терпит любой узел, что ставит его рядом с kube-scheduler, который вызывает его при каждой попытке планирования в модулях, зарегистрировавших расширение.

v0.7.4

Дата релиза: 2026-09-11

Метрики контроллера и scheduler extender теперь публикуются через kube-rbac-proxy, а LVMLogicalVolume с размером в процентах больше не отклоняется при создании и не остаётся в Failed после того, как достиг запрошенного размера.

Ключевые изменения

Изменения в этом релизе:

  • Эндпоинты /metrics контроллера и scheduler extender больше недоступны без аутентификации: оба слушают на 127.0.0.1, а публикует их kube-rbac-proxy, поэтому для сбора нужно право get на deployments/prometheus-metrics.
  • LVMLogicalVolume с размером в процентах — 100%FREE целой группы томов, как их выдаёт sds-elastic по одной на OSD, — больше не отклоняется при создании и не остаётся в Failed с unable to extend LV, err: not enough space.
  • Скан LVM, дошедший до multipath-карты, у которой не осталось путей, больше не блокирует агент: узел продолжает сообщать о своих блочных устройствах, а его RWO-тома могут переехать на другой узел.

Улучшения

В этом релизе улучшено:

  • Метрики scheduler extender собираются впервые: порт всегда был открыт менеджером, но никто его не объявлял и не опрашивал.
  • utils_commands_execution_count_total и utils_commands_errors_count_total наконец экспортируются. Оба инкрементировались примерно в сорока местах агента и контроллера, но не были зарегистрированы, поэтому подсчитанное никуда не попадало.
  • Все бинарники модуля пишут логи через один общий логгер. Имя компонента, выдавшего запись, теперь лежит в поле записи (logger), а не в виде префикса в тексте сообщения.

Исправления

В этом релизе исправлено:

  • Размер LVMLogicalVolume, заданный процентом в spec.size, вычисляется от ёмкости, которую LVM сообщает как сумму устройств, а она не выровнена по extent’ам. Округление запроса вверх давало на один extent больше этой ёмкости, из-за чего запрос 100% группы томов считался в неё не влезающим: создание отклонялось, а extender переводил в Failed том, уже занимающий всё место. Теперь процентные размеры округляются вниз, к границе extent’а.
  • LVMLogicalVolume, помеченный Failed из-за того, что свободное место группы ещё не догнало только что созданный LV, оставался в Failed до конца жизни: последующие проходы завершались раньше, увидев том уже нужного размера. Теперь такой том переходит в Created.
  • Агент мог сообщить block device size is invalid для исправного устройства: переменная для результата ioctl лежала на стеке, и рост стека во время вызова перемещал её, поэтому размер записывался по старому адресу и оставался нулевым.
  • Скан LVM, дошедший до multipath-карты без путей, блокировался в ядре вместо отказа, и каждый зависший скан держал карту открытой. Из-за этого агент останавливался, multipath -f не мог удалить карту, а том оставался в Node.status.volumesInUse и не подключался на другом узле. Теперь такие карты — device-mapper с UUID mpath- и без slaves — отбрасываются в global_filter каждой команды LVM.

Обновления безопасности

Обновления безопасности в этом релизе:

  • Закрыт анонимный доступ к метрикам контроллера и scheduler extender. Раньше эндпоинты никого не аутентифицировали, были доступны из любого пода кластера, а ServiceMonitor отправлял на них токен ServiceAccount’а Prometheus по обычному HTTP.
  • golang.org/x/crypto, используемый хуками модуля, обновлён до 0.56.0 — это закрывает CVE-2026-56854 (критическая, обход аутентификации в x/crypto/ssh), CVE-2026-56855 и CVE-2026-78662.

Рекомендации по обновлению

Перед обновлением учтите следующее:

  • Для метрик руками делать нечего: поставляемый с модулем ServiceMonitor уже опрашивает прокси по HTTPS с токеном. Перенастроить придётся только собственный сборщик, который читал метрики контроллера напрямую по HTTP: его нужно направить на порт прокси и выдать ему право get на deployments/prometheus-metrics.
  • Формат записей лога изменился, поэтому фильтр, искавший имя компонента внутри текста сообщения, нужно перевести на поле logger.

v0.7.3

  • Добавлено условие Missing у BlockDevice: исчезнувшее, но занятое устройство (например, входящее в LVM Physical Volume) больше не остаётся навсегда с устаревшим status.path. Сначала выставляется Unknown, True — только если устройство отсутствует непрерывно 10 минут, поэтому мигающий путь iSCSI, восстановившийся сам, не помечается. Условие снимается, как только устройство находится снова; сам объект не удаляется, чтобы не рвать ссылки из LVMVolumeGroup и LVMLogicalVolume
  • Исправление: агент больше не падает на закэшированном логическом томе без атрибутов LVM
  • Исправление: потолки VPA для агента, scheduler-extender и контроллера подняты до измеренного потребления
  • Исправление: релизный образ больше не собирается из кэша с устаревшим changelog.yaml — зависимости git-маппинга привязаны к стадии install, на которой файл и копируется
  • Обновление базовых образов до v2.1.3 и lib-helm до 1.72.14
  • Документация: описаны серийные номера виртуальных дисков
  • Внутренние изменения в сборке модуля

v0.7.2

  • Исправление: контроллеру выданы права на запись событий (create и patch) — раньше запись события отклонялась по правам
  • Фиксы CVE
  • Внутренние изменения в сборке: обновлён CI, в релизный образ добавлены crds, docs и openapi

v0.7.1

  • Исправление: одно «осиротевшее» устройство device-mapper без диска больше не останавливает обнаружение BlockDevice на всём узле — раньше из-за него агент не создавал ни одного BlockDevice на ноде, включая исправные диски
  • Исправление: LVMVolumeGroup с единственным PV, чьё имя не удалось определить сразу, больше не зависает в Pending навсегда — устранены пустая публикация status.nodes и отсутствие повторной попытки при отсутствии udev-событий
  • Исправление: агент подставляет унаследованный от родительского устройства серийный номер, если прямое чтение серийника не удалось (участники multipath, crypt/dm-устройства) — раньше такие устройства пропускались при обнаружении BlockDevice
  • Опциональные ресурсы (VerticalPodAutoscaler, PodMonitor/ServiceMonitor) теперь включаются по факту наличия CRD в API, а не по списку enabledModules
  • Документация: исправлено дублирование ключа description в русских CRD LVMVolumeGroup, ломавшее docs-builder, добавлено недостающее описание status.extentSize и восстановлено описание blockDevice

v0.7.0

  • Исправление: агент больше не принимает за свои LVM-структуры внутри блочных устройств, отданных виртуальным машинам, — в LVM global_filter возвращено исключение /dev/loop. Устранены вызванные этим отказы LVMVolumeGroup с причинами CacheEmpty и ScanFailed — имя VG больше не считается идентификатором, а предупреждение LVM о дубликате чужого имени не приписывается нашей группе
  • Добавлена поддержка LVM на файлах: поле spec.fileDevices у LVMVolumeGroup и LVMVolumeGroupSet. Агент создаёт файл, подключает его как loop-устройство и использует как PV, что даёт LVM-хранилище на узле без свободного диска; поле blockDeviceSelector стало необязательным
  • Планировщик (scheduler-extender) учитывает PVC, перечисленные в аннотации пода extra-pvcs
  • LVMLogicalVolume, LVMLogicalVolumeSnapshot и LVMVolumeGroupSet публикуют status.conditions; у BlockDevice появилось условие Consumable, объясняющее, почему устройство нельзя использовать; обработка условий LVMVolumeGroup приведена к общему виду
  • Исправление: том, созданный из снапшота или клонированием, расширяется до запрошенного размера — раньше PVC оставался в Pending в ожидании размера, который никогда не появлялся
  • Исправление: тонкий пул, заданный процентом от размера VG, больше не застревает в VGConfigurationApplied=False из-за округления LVM на один экстент
  • Исправление: холостой вызов lvextend распознаётся как безобидный и на LVM 2.03.16 — иначе LVMVolumeGroup оставался в NotReady
  • Исправление: при взятии существующей VG под управление blockDeviceSelector больше не остаётся пустым
  • Исправление: после pvcreate и vgcreate агент вызывает udevadm, чтобы обновить базу udev
  • Исправление: при включённом storage-foundation агент загружает модуль ядра dm_snapshot
  • Удалён устаревший CRD LvmVolumeGroupBackup, оставшийся от разовой миграции: новый хук снимает финализаторы с остатков и удаляет сам CRD
  • Добавлен экспериментальный режим обнаружения блочных устройств через netlink, включаемый флагом ENABLE_NETLINK_BLOCK_DEVICE_DISCOVERY
  • Обновление базовых образов до v1.3.25, Go 1.26.5 и lib-helm до 1.72.13
  • Устранены уязвимости в golang.org/x/net, golang.org/x/sys и golang.org/x/crypto
  • Внутренние изменения в сборке модуля и CI, значительно расширен набор e2e-тестов

v0.6.10

  • Из LVM global_filter удалено общее accept-правило, которое приводило к сканированию нестандартных путей (/dev/disk/by-diskseq/*) и дублированию имён VG

v0.6.9

  • Агент теперь игнорирует «чужие» блочные устройства (rbd, drbd, nbd, loop) при сканировании LVM
  • Исправлена обработка дублирующихся имён VG: статус LVMVolumeGroup больше не повреждается
  • Устранена блокировка запуска пода агента; добавлены таймауты на LVM-команды
  • Улучшена стабильность имён устаревших блочных устройств: сопоставление по серийному номеру или WWN предотвращает пересоздание при смене имени
  • Исправлена валидация селектора BlockDevice: оператор In теперь единственный допустимый

v0.6.8

  • Исправлена гонка в scheduler-extender при пустом PVC.Status.Phase: решение о привязке PVC теперь принимается по Spec.VolumeName, узлы без подходящей LVMVolumeGroup всегда отбраковываются
  • Agent теперь планируется также на узлах данных sds-elastic
  • Обновление базовых образов и lib-helm до 1.72.0

v0.6.7

  • Обновление базовых образов, Go 1.25.10 и lib-helm 1.71.12
  • Внутренние изменения в структуре и сборке модуля

v0.6.6

  • Внутренние изменения в структуре и сборке модуля

v0.6.5

  • Обновление базовых образов, Go 1.25.10 и lib-helm 1.71.11
  • Внутренние изменения в сборку модуля

v0.6.4

  • Исправления в структуру модуля

v0.6.3

  • scheduler-extender: PVC с отсутствующим StorageClass больше не блокируют планирование пода

v0.6.2

  • Изменения в CI: DistroPackagesProxy и env прокси в werf, доработки CVE-сканов (role_name, checkout)
  • Добавлены кластерные роли user-authz в шаблонах

v0.6.1

  • Добавлено определение точек монтирования через парсер mountinfo в агенте
  • Добавлен учёт locality реплик в scheduler-extender для replicated-томов
  • Исправлены гонки и зацикливание реконсиляции в контроллерах LVG/LLV
  • Учтён ExtentSize при сравнении в discoverer и добавлен fallback 4Mi в контроллере LLV
  • Убрана ложная пометка LLV как Failed при actualSize > spec.size
  • Исправлено двойное вычитание Failed LLV с actualSize при подсчёте свободного места в scheduler-extender
  • Обновление базовых образов и lib-helm

v0.6.0

  • Фиксы CVE
  • Переход на общий scheduler для SDS
  • Замена фиксированной resize delta на автоматическое определение дельты размера LVM раздела
  • Автоактивация LVM разделов при операциях с томами

v0.5.16

  • Добавлен хук для очистки ресурсов при выключении модуля
  • Убрана настройка enableThinProvisioning, предполагаем, что thin provisioning всегда включен
  • Обновление module-sdk для фикса CVE, обновление golang

v0.5.15

  • Добавлены метрики для LVM томов
  • Обновление module-sdk для фикса CVE
  • Рефакторинг манифестов

v0.5.14

  • Обновлены версии базовых образов и lib-helm
  • Установлено значение по умолчанию для enableThinProvisioning в true
  • Улучшены документация
  • Исправления в манифестах
  • Добавлена поддержка HA mode

v0.5.13

  • Обновлена версия базовых образов

v0.5.12

  • Обновлена версия Go до 1.24.9
  • Обновлена lib-helm до deckhouse_lib_helm-1.64.1
  • Обновлены документации

v0.5.11

  • Исправлена очистка томов в некоторых ОС

v0.5.10

  • Удалены requirements к Python

v0.5.9

  • Исправлена ошибка с инактивированными логическими томами

v0.5.8

  • Добавлены файлы release notes

v0.5.7

  • Исправлена ошибка при установке модуля на нодах с containerd v2

v0.5.6

  • Добавлена дополнительные монтирования для поддержки containerd v2

v0.5.5

  • Фиксы CVE

v0.5.4

  • Фиксы CVE
  • Внутренние изменения для поддержки containerd v2

v0.5.3

  • Поправлен баг, препятствующий обновлению статусов LVG при наличии в кластере missed/notready нод

v0.5.2

  • Убрана поддержка модуля sds-drbd
  • Добавлено сокрытие устройств csi-scsi-generic

v0.5.1

  • Технический релиз, рефакторинг модуля

v0.5.0

  • Добавлена возможность затирания данных в enterprise версиях
  • Множественные правки в документацию

v0.4.6

  • Технический релиз. Убран статус “Превью” в документации

v0.4.5

  • Многочисленные правки в документации
  • Добавлены LVMVolumeGroupSet и LVMLogicalVolumeSnapshots
  • Исправлена работа с labels и finalizers в ряде внутренних объектов
  • Добавлена загрузка dm_snapshot при необходимости

v0.4.3

  • Устранено падение скрипта миграции BlockDevices при отсутствии финалайзеров на ресурсах

v0.4.2

  • Фикс для поддержки серийных номеров BlockDevice длиной до 63 символов

v0.4.1

  • Исправлена потенциальная проблема с отсутствующими labels в хуке миграции LvmVolumeGroup->LVMVolumeGroup
  • Добавлен контроллер, отслеживающий labels на ресурсах BlockDevice для оперативной актуализации ресурсов LVMVolumeGroup

v0.4.0

  • Ресурсы LvmVolumeGroups будут мигированы в LVMVolumeGroups
  • Точные списки BlockDevices в LVMVolumeGroups будут мигрированы в селекторы
  • Множественные правки в контроллеры и документации

v0.3.2

  • Фикс в работе sds-health-watcher-controller, из-за которого он мог некорректно обрабатывать статус некоторых нод

v0.3.1

  • Обновление golang до актуальной 1.22.6 для закрытия известных уязвимостей

v0.3.0

  • Добавлена настройка thin provisioning в mc, для автоматической подгрузки модуля dm_thin_pool
  • Образы переведены на distroless
  • Добавлены labels к сущности BlockDevices (для будущего использования в BlockDevicesSelectors)
  • Множественные правки багов и документации

v0.2.5

  • Добавлены метрики и их сбор в Prometheus, порты хелсчеков переведены на правильные

v0.2.4

  • Добавлено авторасширение для thin pools LVM volume groups и LVM logical volumes

v0.2.3

  • Добавлен внутренний кэш для ускорения работы
  • Добавлены health и readiness проверки в контроллер
  • Улучшено отображение ресурсов в cli
  • Теперь LVM volume group удаляются при удалении соответствующего ресурса k8s, а не при добавлении аннотации
  • Добавлено указание размера LVM volume group в процентах
  • Добавлена поддержка AllocationLimit в LVM volume group
  • Добавлена поддержка непрерывных (contiguous) томов в sds-local-volume

v0.2.1

  • Добавили поддержку multipath устройств

v0.2.0

  • Добавлен LVMLogicalVolumeWatcher CRDs
  • Добавлены дополнительные тестовые случаи
  • Добавлена функция AreSizesEqualWithinDelta
  • Исправлен resize для thinPools
  • Добавлены тесты к LvmLogicalVolumeWatcher контроллеру
  • Исправлено именование в LVMLogicalVolume
  • Добавлена node affinity
  • Улучшена обработка LVMLogicalVolume: логирование, отображение размера и обработка событий
  • Статически скомпонованные nsenter, lsblk и lvm утилиты
  • Исправлено последовательное обнаружение путем переключения на динамический lsblk
  • Переписан bin-copier скрипт на Golang
  • Перемещены lsblk и его библиотеки в образ агента
  • Добавлено поле age
  • Реализована фильтрация stderr для команд LVM
  • Добавлены bench-тесты для LVMLogicalVolume контроллера
  • Изменен тип размера со string на quantity
  • Добавлена параллельная обработка в lvm_logical_volume_watcher и валидация размера VG в lvm_volume_group_watcher