Стадия жизненного цикла модуля: Experimental
У модуля есть требования для установки
Модуль находится в стадии Experimental. API, настройки и кастомные ресурсы могут меняться без предупреждения; не используйте его в production-нагрузках.
Модуль sds-elastic устанавливает Rook Ceph в кластер Deckhouse Kubernetes Platform и управляет им, превращая набор узлов в распределённую систему хранения на базе Ceph. Модуль предоставляет блочные тома (RBD) и общую файловую систему (CephFS) через StorageClass’ы csi-ceph, без необходимости ручного развёртывания Rook.
Управление разнесено по трём кастомным ресурсам из API-группы storage.deckhouse.io/v1alpha1:
ElasticCluster(ec) — описывает желаемое состояние Ceph-кластера: какие узлы участвуют (storage.nodeSelector), какие BlockDevice CR используются под OSD (storage.blockDeviceSelector) и, опционально, какие CIDR используются для публичной и кластерной сети. Контроллер по этому описанию поднимает RookCephCluster(mon/mgr/osd).ElasticStorageClass(esc) — описывает один Ceph-пул и соответствующий ему KubernetesStorageClass, поднимаемый через модуль csi-ceph.spec.replication(AvailabilityWithoutConsistency/ConsistencyAndAvailability/HighRedundancy) транслируется в production-настройки пула. Ссылается на родительскийElasticClusterпо имени (spec.clusterRef).ElasticClusterCredential(ecc) — внутренний cluster-scoped бэкап идентичности Ceph-кластера (FSID, mon-secret, admin-secret), заполняемый контроллером из Secret’аrook-ceph-mon. Оператор кластера этим CR напрямую не управляет; ресурс нужен, чтобы идентичность переживала пересоздание namespaced8-sds-elastic.
Модуль запускает Deployment оператора Rook Ceph, ConfigMap rook-ceph-operator-config, полный набор CRD Ceph и три CRD storage.deckhouse.io, перечисленных выше.
Основные возможности
- Развёртывание кластера через единственный ElasticCluster, отбирающий BlockDevice / Node CR по label-селекторам.
- LVM-схема под OSD: для каждого подходящего BlockDevice контроллер создаёт одну LVMVolumeGroup, одну LVMLogicalVolume и один локальный
PersistentVolume, привязанный к helm-managedStorageClasssds-elastic-osd(provisionerkubernetes.io/no-provisioner,volumeBindingMode: WaitForFirstConsumer). Rook потребляет эти PV как OSD черезstorageClassDeviceSets. - Три стратегии репликации в ElasticStorageClass:
AvailabilityWithoutConsistency(2 реплики,min_size=1,requireSafeReplicaSize=false),ConsistencyAndAvailability(3 реплики,min_size=2, по умолчанию) иHighRedundancy(4 реплики,min_size=2,requireSafeReplicaSize=true; переживает одновременный отказ двух хостов с непрерывным I/O и сохраняет ещё одну реплику как запас на восстановление; требует не менее 5 storage-узлов). РежимErasureCodedCompactвременно отключён и недоступен для выбора. - RBD- и CephFS-пулы в ElasticStorageClass — один ESC даёт один Ceph-пул и один
CephStorageClassмодуля csi-ceph с тем же именем. - Автоматическая интеграция с csi-ceph: контроллер поддерживает один
CephClusterConnection(1:1 с родительским ElasticCluster) и по одномуCephStorageClassна каждый ElasticStorageClass; vendor-CR редактировать вручную не нужно. - Бэкап идентичности через ElasticClusterCredential: FSID и mon/admin-secret зеркалируются из Secret’а
rook-ceph-mon, чтобы идентичность кластера переживала пересоздание namespace.
Системные требования
-
Deckhouse Kubernetes Platform версии
1.72или новее, с не менее чем тремя узлами для демонов Ceph (mon,mgr,OSD). -
Два непересекающихся IPv4-CIDR, доступных со всех storage-узлов:
- один — для публичной сети Ceph (клиентский трафик);
- другой — для кластерной сети Ceph (репликация и heartbeat).
Допускается использовать один CIDR для обоих случаев, если разделение сетей не требуется.
spec.networkможно вовсе не задавать — тогда Rook слушает на всех host-IP storage-узлов (host networking). -
Включённый модуль sds-node-configurator (≥ 0.6.8). В нём живут CRD
BlockDeviceиLVMVolumeGroup, на которые ссылается ElasticCluster и в которые контроллер пишет. -
Включённый модуль csi-ceph (≥ 0.5.26). В нём живут CRD
CephClusterConnectionиCephStorageClass, в которые пишет контроллер sds-elastic. -
Включённый модуль snapshot-controller для поддержки VolumeSnapshot (опционально).
Ограничения
- Один Ceph-кластер на инстанс модуля. Контроллер всегда реконсайлит единственный Rook
CephClusterс именемceph-clusterв namespaced8-sds-elastic, сколько бы объектовElasticClusterни было создано. Несколько объектов будут конкурировать за один backend; создавайте только один на кластер. - Поставляемый с модулем Rook оператор регистрирует свои CR под переименованной API-группой
internal.sdselastic.deckhouse.io(в upstream —ceph.rook.io); это изолирует sds-elastic от пользовательской установки Rook на том же кластере. - Прямые правки ресурсов Rook (
internal.sdselastic.deckhouse.io) в namespaced8-sds-elasticзапрещены validating-вебхуком. Все изменения вносите черезElasticCluster/ElasticStorageClass. - RGW и S3-бакеты не поддерживаются в этом релизе. Контроллер ObjectBucket (OBC) в Rook отключён через
ROOK_DISABLE_OBJECT_BUCKET_CLAIM=true, а CRDobjectbucket.ioне поставляются. - Поле
ElasticCluster.spec.networkнеизменяемо после создания (CEL в CRD + дублирующая проверка в validating-вебхуке): изменение public/cluster CIDR на живом кластере инвалидирует endpoints mon-ов и host-network bindings, поэтому смена сети требует удаления и пересозданияElasticCluster. - Поля
ElasticCluster.spec.storage.nodeSelectorиspec.storage.blockDeviceSelectorредактируются после создания. Validating-вебхук отклоняет правки, сужающие селекторы так, что уже усыновлённыеBlockDeviceоказались бы вне области действия (контроллер не может безопасно вывести LVG/LLV/PV без ручного вмешательства), и правки, которые перетянули бы под этот ECBlockDevice, уже принадлежащий другомуElasticCluster. Полный контракт владения и процедура ручного освобождения BD — в USAGE.md. - Поля
ElasticStorageClass.spec.{clusterRef,type,replication}неизменяемы после создания (CEL + validating-вебхук). Чтобы заменить пул, создайте новыйElasticStorageClassс другим именем. - Имя
sds-elastic-osdзарезервировано под helm-managed внутреннийStorageClass;ElasticStorageClassс такимmetadata.nameотклоняется вебхуком. - Режим
ErasureCodedCompactвременно отключён: значение исключено из enumspec.replicationи отклоняется validating-вебхуком, поэтому его нельзя выбрать ни в одномElasticStorageClass. replication: HighRedundancyтребует не менее 5 storage-узлов (4 — для CRUSH-размещения пула приfailureDomain=host, 5 — для кворума из 5 mon). Контроллер автоматически повышает нижележащийCephClusterдоmon.count=5,mgr.count=3, пока существует хотя бы один HighRedundancy ESC, и не возвращает счётчики обратно после удаления триггерного ESC (молчаливое ослабление отказоустойчивости на живом кластере небезопасно). Чтобы пересчитать топологию принудительно, оператор может очиститьElasticCluster.status.cephTopologyчерез status-subresource. Validating-вебхук ESC отклоняет CREATE HighRedundancy ESC, если родительскийElasticClusterотсутствует, подspec.storage.nodeSelectorподходит < 5 узлов, либо adoptedBlockDeviceродительского EC лежат на < 4 разных узлах. Поэтому отправка EC и HighRedundancy ESC однимkubectl applyотклоняется — сначала нужно применить EC и дождаться, пока на его узлах появятся adopted BD.- CRD Rook и Ceph входят в поставку модуля и не настраиваются пользователем.
- Teardown
ElasticCluster/ElasticStorageClassвыполняется через finalizer’ы: при удалении контроллер сносит управляемые им RookCephCluster/CephClusterConnectionи нижележащие пулы / файловые системы вместе с ихCephStorageClassмодуля csi-ceph. Объекты per-device (LVMVolumeGroup/LVMLogicalVolume/ локальныеPersistentVolume) и лейбл владения наBlockDeviceнамеренно сохраняются и вычищаются вручную; сквозной GC этих объектов через OwnerReferences пока не подключён (запланировано в backlog как B20). См. USAGE.md.