Стадия жизненного цикла модуля: Предварительная версия (preview)
У модуля есть требования для установки
v0.9.10
Дата релиза: 2026-09-24
Том, потерявший копию с данными, теперь восстанавливается сам в пределах ограничения ресинхронизаций, которое включено по умолчанию; отдельный том можно приостановить, не останавливая контроллер; бинарные файлы на Go пересобраны с исправленными grpc и x/crypto.
Ключевые изменения
Изменения в этом релизе:
- Сходимость раскладки сама пересоздаёт потерянную копию
ReplicatedVolumeс данными (diskful), а не останавливается наTransitionUnsupportedв ожидании реплики, созданной вручную. resyncSlotsPerNodeвключён по умолчанию (4), поэтому выход узла из строя не запускает разом все ресинхронизации томов, которые на нём были.spec.maintenance: NoResourceReconciliationвReplicatedVolumeприостанавливает согласование этого тома, его реплик и его ресурсов DRBD, а все остальные тома продолжают согласовываться.
Новый функционал
В этом релизе добавлено:
- В
ReplicatedVolumeпоявилось полеspec.maintenance. Со значениемNoResourceReconciliationконтроллер не совершает над томом никаких действий: ни решений о составе и раскладке, ни изменений реплик и подключений, ни вывода конфигурации, ни обработки удаления. Пауза распространяется на реплики тома и их ресурсы DRBD; ресурс DRBD, приостановленный вручную, остаётся как есть.Ready,ResilientиAttachedReadyпродолжают публиковаться, остальной статус замирает, а пауза отражается условиемUnderMaintenanceи колонкойMaintenanceвkubectl get replicatedvolume -o wide. Приостановленный том не удаляется до конца: он и его PVC остаются вTerminating, пока поле не очищено. - Если в раскладке
ReplicatedVolumeкопий с данными меньше, чем задано, недостающая копия создаётся и синхронизируется автоматически — например, при r1 → r2, r1 → r3 или после потери копии вместе с узлом. Изменения, для которых нужно удалить реплику, по-прежнему не выполняются автоматически: уменьшение числа копий, замена копии с живым участником и r2 → r3 при лишней реплике-арбитре (tie-breaker) — удалите арбитра, и копия будет восстановлена. Если копию некуда разместить, том сообщаетCannotConvergeс причиной от планировщика.
Улучшения
В этом релизе улучшено:
- Значение
resyncSlotsPerNodeпо умолчанию меняется с 0 (без ограничения) на 4, поэтому нагрузка от восстановления после отказа узла ограничена. Значение, явно заданное в настройках модуля, сохраняется; 0 по-прежнему отключает ограничение. - Проба состояния и локальные метрики контроллера переезжают с портов 4271 и 4272 на 8081 и 127.0.0.1:8082, а livenessprobe контроллера CSI больше не использует порт 4261. Эти порты входят в диапазон 4200–4299, отведённый модулям, которые слушают порты в сети узла, а ни один из этих подов в ней не работает. При обновлении поды перезапускаются.
Исправления
В этом релизе исправлено:
- При включённом ограничении ресинхронизаций несколько томов могли одновременно выбрать один и тот же узел для приёма или отправки данных: размещение оставалось невидимым для других обработчиков, пока не возвращалось через watch, и в начале каждой волны ограничение на узел превышалось. Теперь оба конца передачи резервируются до записи размещения и освобождаются, как только реплика перестаёт ждать данные.
- В новом кластере метка узла
storage.deckhouse.io/sds-replicated-volume-nodeставилась только на узлы, уже подходящие дляReplicatedStoragePool. Именно эта метка запускает агентsds-node-configurator, который создаёт ресурсыBlockDeviceдля построенияLVMVolumeGroup, поэтому ни один пул не мог получить подходящие узлы. Теперь метку сразу получают узлы, подходящие подdataNodes.nodeSelector.
Обновления безопасности
Обновления безопасности в этом релизе:
google.golang.org/grpcобновлён с v1.82.1 до v1.83.2 в CSI-драйвере,linstor-csi,linstor-affinity-controllerиlinstor-scheduler-extender, что закрывает CVE-2026-84303, CVE-2026-84304 и CVE-2026-84445.golang.org/x/cryptoобновлён с v0.53.0 до v0.57.0 в хуках модуля (go-hooks) иlinstor-scheduler-extender, что закрывает CVE-2026-56854 (обход аутентификации по адресу источника вx/crypto/ssh), CVE-2026-56855 и CVE-2026-78662.
Несовместимые изменения
Изменения, влияющие на обратную совместимость:
evict.shиreplicas_manager.shустанавливаются в/var/lib/deckhouse/sbinвместо/opt/deckhouse/sbin, а старые копии удаляются с узлов. Регламенты и скрипты, которые вызывают их по старому пути, должны перейти на новый.
Рекомендации по обновлению
Перед обновлением учтите следующее:
- Руками делать ничего не нужно. После обновления конфигурация узлов переносит
evict.shиreplicas_manager.shв/var/lib/deckhouse/sbin; исправьте регламенты, в которых вызывается/opt/deckhouse/sbin/evict.sh. - Если
resyncSlotsPerNodeне был задан, после обновления действует ограничение 4, и тома, которым не хватало копии с данными, начинают восстанавливаться в его пределах. Чтобы оставить ресинхронизации без ограничения, задайтеresyncSlotsPerNode: 0.
Документация
Изменения в документации:
- В руководстве по использованию описано восстановление потерянной реплики, которое больше не требует ручных действий, а описание алерта
D8ReplicatedVolumeLayoutDegradedбольше не ведёт через создание реплики вручную.
v0.9.9
Дата релиза: 2026-09-21
ReplicatedVolume теперь сообщает, где размещены его реплики, в -o wide вернулись две колонки, которых не хватало картине конфигурации и раскладки, а включение лимитера заливок больше не упирает контроллер в потолок памяти.
Ключевые изменения
Изменения в этом релизе:
ReplicatedVolumeсообщает о размещении: условияScheduledиSatisfyEligibleNodesвыставляются впервые, аstatus.eligibleNodesViolationsперечисляет реплики на узлах, которые не разрешены их пулом хранения, с причиной по каждой.kubectl get replicatedvolume -o wideпоказываетCONVERGEDиCONFIGURATIONREADY: том с застрявшей раскладкой или с неверной конфигурацией виден в списке, а не только внутри объекта.- Включение
resyncSlotsPerNodeбольше не стоит контроллеру целого кластера в памяти: на кластере из тысяч томов он упирался в лимит своего пода.
Новый функционал
В этом релизе добавлено:
Scheduledсообщает, для всех ли реплик тома выбран узел; агрегируется по неудаляемым репликам, которые размещает планировщик, — репликиAccess, которые следуют за своим потребителем, исключены. Условие ортогонально доступности и не входит вReady: том с неправильно размещённой репликой продолжает обслуживать ввод-вывод.SatisfyEligibleNodesсообщает, согласуется ли размещение с eligible-узлами (разрешёнными узлами) пула хранения, аstatus.eligibleNodesViolationsперечисляет нарушающие реплики с узлом и причиной. Кроме вердикта по каждой реплике проверяется то, что видно только по составу участников: приTransZonal— узел без зоны, зона, в которой у пула нет разрешённых узлов, и все voter’ы, собранные в одну зону; приZonal— каждый voter вне домашней зоны.ReplicatedStorageClassсчитает такие тома вstatus.volumes.inConflictWithEligibleNodesи выставляет по ним условиеVolumesSatisfyEligibleNodes— пока условие тома не писалось, счётчик был структурно прибит к нулю.
Улучшения
В этом релизе улучшено:
- В список
ReplicatedVolumeвернулись две широкие колонки:CONVERGED(условиеMembershipLayoutConverged— единственный способ увидеть в списке членство, которое без человека не сдвинется) иCONFIGURATIONREADY(верна ли и актуальна ли сама конфигурация относительно класса хранения — та половина ответа, которой нет уCONFIGURED). Обе только в-o wide, вывод по умолчанию не изменился.
Исправления
В этом релизе исправлено:
- Лимитер заливок больше не вычитывает весь кластер на каждое решение. Раньше каждое решение о бюджете материализовало все
ReplicatedVolumeи всеReplicatedVolumeReplica, и десять воркеров одновременно выходили за лимит памяти пода контроллера; теперь выборки сужены индексами по полям, а очередь собирается по одной заявке, так что кандидат стоит сотни байт, а не своих реплик. Сами решения не изменились. - Метрики CSI-контроллера и CSI-драйвера на узлах снова собираются. Их sidecar’ы
kube-rbac-proxyавторизуют каждый scrape черезTokenReviewиSubjectAccessReview, а ServiceAccountcsiне был привязан ни к тому, ни к другому, поэтому прокси отвечал 401, а поды оставалисьReady— единственным симптомом былиup == 0по обеим джобам и вечныйTargetDown. - Той же привязки не было у контроллера старой control plane: прокси метрик рендерится,
ServiceMonitorвыбирает Service, а каждый scrape отклонялся API-сервером.
Рекомендации по обновлению
Перед обновлением учтите следующее:
- Руками делать нечего, тома никуда не переезжают: два условия о размещении только сообщают о том, что уже есть.
- Класс хранения, у томов которого реплики стоят на неразрешённых узлах, может впервые после обновления выйти из
Ready— вPartiallyAlignedпри стратегии разрешения конфликтовManualи вRollingOutтам, где разрешение включено. Размещение было неверным и раньше, теперь о нём сообщается. Какие именно реплики имеются в виду, видно вstatus.eligibleNodesViolationsтех томов, которые посчитал класс.
Документация
Изменения в документации:
- Инструкция по миграции Replication r3 → r2 называет существующие колонки: прогресс по каждому тому смотрят в
LAYOUTи, в-o wide, вCONVERGED.
v0.9.8
Дата релиза: 2026-09-14
Сертификаты модуля теперь обновляются и раскатываются сами, ложный алерт об истечении больше не срабатывает, а контроллер отдаёт метрики за kube-rbac-proxy.
Ключевые изменения
Изменения в этом релизе:
- Сертификаты модуля переподписываются за 45 дней до истечения, а использующие их рабочие нагрузки перезапускаются автоматически. До сих пор сертификаты не обновлялись вовсе: они перевыпускались только когда их Secret пропадал или оказывался пустым.
D8LinstorCertificateExpiringIn30dбольше не срабатывает на сертификатах, которые модулю не принадлежат. Хук помечал все Secret в неймспейсе модуля, включая сертификаты Let’s Encrypt, скопированные туда модулемsecret-copier.- Контроллер отдаёт метрики за
kube-rbac-proxy, вместе сServiceMonitorдля Prometheus.
Новый функционал
В этом релизе добавлено:
- Контроллер публикует метрики: сам он слушает на
127.0.0.1, аkube-rbac-proxyв том же поде отдаёт их по TLS, поэтому для доступа нуженgetнаdeployments/prometheus-metrics, и это право выдано только сборщику Prometheus.ServiceMonitorсоздаётся там, где такой вид ресурса есть, а порты настраиваются значениями модуляoldControllerMetricsPortиoldControllerMetricsProxyPort.
Улучшения
В этом релизе улучшено:
- Контроллер пишет логи через общий логгер в том же структурированном формате, что и остальные модули, вместо собственной копии прежнего пакета логирования.
Исправления
В этом релизе исправлено:
- Сертификаты обновляются без ручного вмешательства. Каждая группа сертификатов теперь хранит свой CA, сертификат и закрытый ключ в собственном Secret, и сертификат переподписывается тем же CA за 45 дней до истечения; CA живёт десять лет и заменяется только когда уже не может покрыть полный срок жизни сертификата. Обновление вступает в силу после перезапуска, и новый хук перезапускает рабочие нагрузки, которые ссылаются на обновлённый Secret с сертификатом.
- Хук пометки истекающих сертификатов теперь смотрит только на Secret самого модуля, снимает свою метку с остальных и больше не паникует на Secret без меток. Раньше он помечал все Secret в неймспейсе модуля, поэтому скопированные туда другими модулями сертификаты раз в несколько недель поднимали
D8LinstorCertificateExpiringIn30d. - Secret
linstor-scheduler-admission-certs, оставшийся от ранее удалённого компонента, больше не заставляет перевыпускать группу сертификатов вебхуков при каждом прогоне хуков — что каждый раз заново выпускало CA и переписывалоcaBundleвебхуков. Он убран из группы и из схемы openapi, а отдельный хук удаляет и сам оставшийся Secret. - Том, файловую систему которому CSI-драйвер создаёт сам после неудачного монтирования, форматируется командой
mkfs.ext4 -m0и больше не отдаёт суперпользователю 5 % своего объёма.
Рекомендации по обновлению
Перед обновлением учтите следующее:
- Руками делать ничего не нужно, и обновление ничего не ротирует: группы сертификатов, выпущенные прежними версиями, чей ключ CA неизвестен, остаются нетронутыми, пока их сертификаты не устареют.
- Рабочие нагрузки, которым нужен обновлённый сертификат, перезапускает хук на следующей после обновления сходимости. Переподпись за 45 дней оставляет прежний сертификат действительным всё это время.
v0.9.7
- Исправление: контроллеру выданы права patch на events вместо list — повторная запись события больше не отклоняется по правам
- Исправление: VPA переведён с устаревшего режима обновления Auto на InPlaceOrRecreate
- Опциональные ресурсы включаются по наличию CRD в API, а не по списку включённых модулей — проверки переведены на helm_lib_api_version_exists
- Обновление базовых образов до v2.1.2 и Go до 1.26.6
- Внутренние изменения в сборке: обновлён CI, в релизный образ добавлены crds, docs и openapi
v0.9.6
- Исправление: сервисный аккаунт CSI модуля больше не блокируется валидирующим вебхуком при создании RWX PersistentVolumeClaim
- Исправлены ссылки в документации
- Обновление базовых образов и lib-helm до 1.72.13
v0.9.5
- Зависимость от модуля snapshot-controller стала необязательной: VolumeSnapshotClass создается только при наличии CRD группы snapshot.storage.k8s.io, остальная функциональность работает без него
- Исправление: в секрете deckhouse-registry остаются учетные данные только активного источника образов
- Исправление: LINSTOR больше не запрашивает список всех CRD кластера при определении версии базы данных
- Исправление: LINSTOR игнорирует неизвестные свойства объектов при работе с Kubernetes API
- Исправление: установка DRBD на узлах переустанавливает пакет при устаревших исходниках и строже проверяет версию загруженного модуля
- Перевыпуск сертификатов переведен на ручную процедуру, описанную в FAQ; хук-триггер manualcertrenewal-trigger удален
- Обновление базовых образов, container-base и lib-helm до 1.72.12
- Устранены уязвимости, найденные при сканировании образов модуля
- Внутренние изменения в сборке модуля
v0.9.4
- При пробросе меток из ReplicatedStorageClass в StorageClass теперь исключаются метки с заданными игнорируемыми префиксами
- Обновление базовых образов и lib-helm до 1.72.0
v0.9.3
- Метки из ReplicatedStorageClass теперь пробрасываются в управляемый StorageClass Kubernetes
- Обновление базовых образов, Go 1.25.10 и lib-helm 1.71.12
v0.9.2
- Добавлен маркер x-config-version в OpenAPI-схему config-values для версионирования параметров модуля
v0.9.1
- Документация — уточнения в FAQ об SSD
- Внутренние изменения в структуре и сборке модуля
v0.9.0
- Обновление DRBD до версии 9.2.16. Внимание: потребуется перезагрузка нод
- Внутренние изменения в модуле
v0.8.19
- Обновление базовых образов, Go 1.25.10 и lib-helm 1.71.11
- Внутренние изменения в сборку модуля
v0.8.18
- Исправления в структуру модуля
v0.8.17
- Изменения в CI: DistroPackagesProxy и env прокси в werf, доработки CVE-сканов (role_name, checkout)
- Добавлены кластерные роли user-authz в шаблонах
v0.8.16
- Добавлены недостающие точки монтирования в distroless-образе webhooks
- Обновление базовых образов, Go и lib-helm (фикс CVE)
- Уточнения в документации
v0.8.15
- Добавлен хук для очистки ресурсов при выключении модуля
- Убрана настройка enableThinProvisioning, предполагаем, что thin provisioning всегда включен
- Обновление module-sdk для фикса CVE, обновление golang
v0.8.14
- Исправления в документации
- Переработка манифестов
- Добавлен запрет на заказ RWX томов для всех, кроме модуля virtualization
v0.8.13
- Переключено с yum на dnf для установки пакетов на CentOS-подобных дистрибутивах
- Исправление CVE
- Обновление документации
- Увеличен timeout liveness пробы linstor-controller до 60 секунд
v0.8.12
- Исправление в документации
- Фикс HA-mode, теперь он работает корректно
- Убран функционал scheduler, остававшийся для совместимости со старыми версиями Deckhouse
v0.8.11
- Обновлена версия базовых образов
v0.8.10
- Обновлена версия Go до 1.24.9
- Обновлена lib-helm до deckhouse_lib_helm-1.64.1
v0.8.9
- Уточнен адрес, к которому linstor satellite будет привязываться (чтобы избежать потенциального доступа извне кластера)
v0.8.8
- Обновлены базовые образы до v0.5.34
- Добавлены pull secrets для CSI controller и node
v0.8.7
- Исправлена ошибка с несоздающейся FS при создании томов
- Правки в документацию
v0.8.6
- Добавлены файлы release notes
- Перевод хуков в модуле с python на golang
- Документация улучшена
v0.8.5
- Добавлены дополнительные монтирования для поддержки containerd v2
v0.8.4
- Добавлена информация о необходимости snapshot-controller для работы модуля
v0.8.3
- Правки в документацию
- Добавлена зависимость от snapshot-controller
v0.8.2
- Правки в хук обновления сертификатов
- Удаление устаревших хуков миграции
v0.8.1
- Правки в документацию (добавлена инструкция по расширению ReplicatedStoragePool на новый узел кластера)
v0.8.0
- Рефакторинг модуля
- Правки в документацию
- Правки для поддержки снимков томов
v0.7.4
- Если топология позволяет, контроллером убирается аннотация для StorageClass, запрещающая заказ RWX томов
v0.7.3
- Рефакторинг модуля
- Исправлен podAntiAffinity для sds-replicated-volume-controller
v0.7.2
- Изменения в хуки для корректного процесса ручного обновления сертификатов
- Поправлена группировка алерт D8NodeHighUnknownMemoryUsage
v0.7.1
- Добавлен патч в CSI для полноценной поддержки топологий, указанных в ReplicatedStorageClass (могли игнорироваться)
- Добавлен алерт D8NodeHighUnknownMemoryUsage для отлова случаев утечки памяти в DRBD (о проблемах сообщать в team storage)
v0.6.0
- Обновление DRBD до версии v9.2.12, решающее ряд проблем (в частности улучшающее стабильность DRBD diskless реплик)
v0.5.1
- Исправлен алерт на некорректное количество реплик ресурсов
- Исправления в расписание job по снятию резервных копий БД Linstor
v0.5.0
- Множественные небольшие правки в templates, monitoring alerts и документацию
- Переход с linstor scheduler-extender на внутренние механизмы самого Deckhouse (KubeSchedulerWebhookConfiguration)
- Перевод образов на distroless
- Поправлен и дополнен скрипт для вывода drbd ресурсов с ноды
v0.4.3
- Технический релиз. Правки и дополнения в скрипт по вытеснению ресурсов с ноды evict.sh, правки в templates и документацию
v0.4.1
- В скрипте очистки ноды от DRBD-ресурсов evict.sh теперь учитывается установленный параметр AutoplaceTarget, перемещаемые реплики не будут перемещены на ноды со значением AutoplaceTarget равном false
v0.4.0
- Обновлены библиотеки golang API для поддержки sds-node-configurator v0.4.0
- Множественные правки в контроллеры и документации
v0.3.5
- Множественные исправления и улучшения в evict.sh и replicas_managers.sh (также, они теперь автоматически устанавливаются в /opt/deckhouse/sbin)
- DRBD теперь корректно собирается на ALT Linux и с ядром Linux 6.5+
- Добавлены правила anti-affinity для pod’ов контроллеров
- Множественные исправления в дашборде и алертах
- Параметр isDefault удален; используйте стандартную аннотацию k8s вместо него
- Добавлены liveness и readiness checks для контроллеров
- Резервное копирование переключено на выделенный CR вместо использования секретов в namespace модуля
- Запрещено создание пулов на эфемерных узлах
- Множественные исправления документации
- CSI endpoint мигрирует с linstor.csi.linbit.com на replicated.csi.deckhouse.io
v0.2.9
- Добавлены настройки диапазона портов DRBD
- Исправлен путь в liveness-satellite
- Исправлена опечатка lvmVolumeGroups и thinPoolName в примерах
- Добавлена проверка свойства AutoplaceTarget узла Linstor
- Изменено lvmvolumegroups на lvmVolumeGroups в русской документации
- Исправлен linstor satellite VPA
v0.2.8
- Добавлена проверка существования файла /etc/modules
- Добавлен liveness probe для linstor-node
- Добавлено поле age
- Предотвращение перезагрузки узлов при удалении томов
v0.1.11
- Фикс enabled скрипта, модуль не будет выключен, если из кластера пропадет модуль sds-node-configurator