Стадия жизненного цикла модуля: Предварительная версия (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, а ServiceAccount csi не был привязан ни к тому, ни к другому, поэтому прокси отвечал 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