Стадия жизненного цикла модуля: Экспериментальная версия
У модуля есть требования для установки
Deckhouse Platform устанавливает CRD, но не удаляет их при отключении модуля. Если вам больше не нужны созданные CRD, удалите их.
SDSElasticStore
Короткие имена: sdsestore
Область: Cluster
Версия: v1alpha1
Объектное хранилище на Ceph RADOS Gateway: создаёт Rook
CephObjectStore поверх уже развёрнутого модулем sds-elastic
ElasticCluster. Принимает собственные настройки пулов Ceph —
репликацию или erasure coding — вместо кросс-бэкендного интента
(intent — высокоуровневое «намерение» вроде None/Standard/High)
отказоустойчивости.
Имя сознательно разведено и с ElasticCluster (ресурс sds-elastic,
на который ссылается хранилище), и с CephObjectStore (ресурс Rook,
который создаётся автоматически).
Напрямую не потребляется: на него ссылается ObjectStore через
spec.storeRef, а пользователь указывает имя этого ObjectStore в
своём Bucket.
-
объектspecЖелаемое состояние хранилища.
-
объектspec.dataPool
Отказоустойчивость пула с данными объектов в собственных терминах Ceph: ровно одно из
replicatedилиerasureCoded. По умолчанию — репликация с size 3.Именно здесь отказ от интента
None/Standard/Highвиден отчётливее всего: erasure coding — это пара(k, m), и никакое число реплик её не выражает.-
объектspec.dataPool.erasureCodedКаждый объект разбивается на data- и coding-чанки: CPU и задержка в обмен на полезную ёмкость.
-
целое числоspec.dataPool.erasureCoded.codingChunks
Обязательный параметр
m— сколько считается coding-чанков, то есть сколько отказов переживает пул. Для их размещения нужноk + mдоменов отказа.Допустимые значения:
1 <= X -
целое числоspec.dataPool.erasureCoded.dataChunks
Обязательный параметр
k— на сколько data-чанков разбивается объект.Допустимые значения:
2 <= X
-
-
объектspec.dataPool.replicatedПолные копии каждого объекта.
-
целое числоspec.dataPool.replicated.size
Обязательный параметр
Число копий, включая основную. Минимум — 2, разумное значение — 3: при size 1 данные теряются с любым OSD, а при size 2 ввод-вывод блокируется в degraded-состоянии.Допустимые значения:
2 <= X
-
-
-
строкаspec.elasticClusterRef
Обязательный параметр
ИмяElasticCluster(sds-elastic), в Ceph-кластере которого живут пулы RGW. Неизменяемо после создания: пулы лежат именно в этом кластере, и переключение хранилища оставило бы данные брошенными.Длина:
1..30Шаблон:
^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ -
объектspec.encryption
Шифрование хранимых данных объектов на стороне сервера.
В отличие от
SeaweedFSStore, здесь нужно внешнее хранилище секретов — Deckhouse Stronghold: серверное шифрование RGW использует ключи в KMS, и режима, в котором ключ можно просто передать демону, у него нет. Эта асимметрия вынесена в API сознательно — иначе здесь была бы ссылка на ключ, которую принимают и которая не выполняет дополнительных действий.Настраивается при этом блок
securityу самогоCephObjectStore, который Rook превращает в опции шифрования демонов RGW. Ключевой материал не хранится в модуле ни в один момент: модуль хранит только токен, с помощью которого RGW обращается к Stronghold.-
строкаspec.encryption.mode
Чем шифруются данные.
Disabled— ничем.ServerManaged— RGW шифрует каждый объект ключом данных, который берёт из Deckhouse Stronghold (SSE-S3). Изменений на клиенте не требуется.
Обратно выключить нельзя: уже записанным объектам ключи из KMS всё равно нужны.
По умолчанию:
DisabledДопустимые значения:
Disabled,ServerManaged -
объектspec.encryption.stronghold
Экземпляр Deckhouse Stronghold, против которого шифрует RGW.
До Rook при этом доезжает словарь Vault (
KMS_PROVIDER: vault,VAULT_ADDR), и это не обходной манёвр: Stronghold сохраняет API Vault, который использует RGW. Поэтому можно использовать и любое другое Vault-совместимое хранилище — просто документация описывает Stronghold.transit-движок обязателен, а путь его монтирования не настраивается: для SSE-S3 Rook собирает префикс RGW из одного имени движка (
/v1/transit), поэтому transit, смонтированный в другом месте, был бы здесь задан, принят и никогда не использован.-
строкаspec.encryption.stronghold.address
Обязательный параметр
Адрес API Stronghold, напримерhttps://stronghold.d8-stronghold.svc.cluster.local:8200.Минимальная длина:
1Шаблон:
^https?:// -
объектspec.encryption.stronghold.caSecretRefSecret в неймспейсе модуля с CA-бандлом для Stronghold с приватным сертификатом, в ключе
ca.crt. Копируется в неймспейс sds-elastic под тем ключом, который Rook проецирует в под RGW (cert).-
строкаspec.encryption.stronghold.caSecretRef.name
Обязательный параметр
Имя Secret.Длина:
1..253
-
-
объектspec.encryption.stronghold.tokenSecretRef
Обязательный параметр
Secret в неймспейсе модуля с токеном Stronghold, в ключе
token.Rook ищет токен в неймспейсе самого
CephObjectStore, то есть в неймспейсе sds-elastic, а не модуля. Поэтому модуль копирует этот Secret туда, копия принадлежит хранилищу и поддерживается в соответствии с оригиналом.Именно токен, а не аутентификация через Kubernetes, — поскольку для RGW Rook подключает только её. Храните токен короткоживущим: ротация доезжает до копии на следующем reconcile.
-
строкаspec.encryption.stronghold.tokenSecretRef.name
Обязательный параметр
Имя Secret.Длина:
1..253
-
-
-
-
объектspec.gatewayСлой RGW, обслуживающий S3.
-
целое числоspec.gateway.instancesЧисло демонов RGW. По умолчанию
1.Допустимые значения:
1 <= X
-
-
объектspec.metadataPoolОтказоустойчивость метаданных RGW (индекс, лог, метаданные бакетов). Всегда репликация: метаданным RGW нужен omap, которого erasure-coded пулы не поддерживают. По умолчанию size 3.
-
целое числоspec.metadataPool.size
Обязательный параметр
Число копий, включая основную.Допустимые значения:
2 <= X
-
-
объектspec.publish
Публикует S3-эндпоинт этого хранилища за пределы кластера — через реализацию Gateway API из модуля
alb. Если поле не задано (по умолчанию), хранилище доступно только внутри кластера.Объект
Gatewayздесь не создаётся: им владеет администратор или команда, черезALBInstanceлибоClusterALBInstance. Модуль только подключает к нему маршрут. Подключение маршрута из другого неймспейса разрешает сторона цели (ReferenceGrantв неймспейсе Gateway либоallowedRoutesу listener); если оно не разрешено, хранилище сообщает об этом в своих conditions, а не пытается выдать права само себе.-
строкаspec.publish.addressing
Как клиент адресует бакет на опубликованном эндпоинте.
PathStyle—https://s3.example.com/<bucket>/<key>. Одно DNS-имя и один сертификат — то, что администратор может получить всегда.VirtualHosted—https://<bucket>.s3.example.com/<key>. Требует wildcard-DNS и wildcard-сертификата (только DNS-01) и поддерживается S3-шлюзами бэкендов неодинаково.
По умолчанию:
PathStyleДопустимые значения:
PathStyle,VirtualHosted -
объектspec.publish.gatewayRef
Обязательный параметр
Gateway, к которому подключается маршрут. Неймспейс входит в ссылку, потому что общий Gateway живёт в неймспейсе контроллераalb, а не рядом с хранилищем.-
строкаspec.publish.gatewayRef.name
Обязательный параметр
Имя объекта Gateway.Длина:
1..253 -
строкаspec.publish.gatewayRef.namespace
Обязательный параметр
Неймспейс, в котором находится Gateway.Длина:
1..63
-
-
строкаspec.publish.hostname
Обязательный параметр
Имя хоста, на котором отвечает опубликованный эндпоинт, напримерs3.example.com. Wildcard (*.s3.example.com) обязателен для адресацииVirtualHostedи запрещён дляPathStyle.Длина:
1..253Шаблон:
^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)+$ -
объектspec.publish.tls
Обязательный параметр
Серверный сертификат опубликованного эндпоинта. Обязателен: ключи SigV4 передаются в заголовкеAuthorization, поэтому публикация по обычному HTTP отдала бы бакет любому, кто видит трафик. Режимinsecureне поддерживается.-
объектspec.publish.tls.secretRef
Обязательный параметр
Secret типаkubernetes.io/tlsв неймспейсе модуля. Модуль не выпускает сертификаты и не зависит от API cert-manager: укажите Secret, созданный cert-manager, либо добавьте свой. Смена сертификата — это запись в этот Secret, хранилище при этом не пересоздаётся.-
строкаspec.publish.tls.secretRef.name
Обязательный параметр
Имя Secret с сертификатом.Длина:
1..253
-
-
-
-
строкаspec.reclaimPolicy
Что происходит с пулами Ceph при удалении хранилища.
Retain— пулы сохраняются (preservePoolsOnDelete: true), ни один объект не теряется. СамCephObjectStoreпри этом всё равно удаляется: если оставить его, Ceph-кластер останется занятым иElasticClusterникогда не удалится.Delete— пулы RGW и все объекты в них уничтожаются.
Неизменяемо после создания.
По умолчанию:
RetainДопустимые значения:
Retain,Delete
-
-
объектstatusНаблюдаемое состояние хранилища.
-
объектstatus.adminSecretRef
Ссылка на Secret (в неймспейсе модуля) с учётными данными администратора бэкенда, которые контроллер использует для управления бакетами и ключами.
Заполняется не всеми бэкендами: учётные данные Ceph RGW принадлежат Rook и лежат в неймспейсе sds-elastic, а не модуля.
-
строкаstatus.adminSecretRef.name
Обязательный параметр
Имя Secret.Длина:
1..253
-
-
объектstatus.backendДвижок (engine — конкретная реализация бэкенда) этого хранилища и его запущенная версия.
-
строкаstatus.backend.typeДвижок бэкенда.
Допустимые значения:
SeaweedFS,CephRGW -
строкаstatus.backend.versionЗапущенная версия бэкенда.
-
-
объектstatus.capacityИспользование хранилища по данным бэкенда.
-
строкаstatus.capacity.availableСвободная ёмкость, Kubernetes Quantity (BinarySI).
-
строкаstatus.capacity.lastUpdatedВремя последнего замера ёмкости.
-
строкаstatus.capacity.totalПолная ёмкость, Kubernetes Quantity (BinarySI).
-
строкаstatus.capacity.usedЗанятая ёмкость, Kubernetes Quantity (BinarySI).
-
строкаstatus.capacity.usedPercent
used / total * 100, с двумя знаками после запятой.
-
-
массив объектовstatus.conditionsПостадийные condition:
BackendReady,EndpointReadyи агрегатноеReady.-
строкаstatus.conditions.lastTransitionTimeВремя последнего перехода condition.
-
строкаstatus.conditions.messageЧеловекочитаемое описание текущего статуса.
Максимальная длина:
32768 -
целое числоstatus.conditions.observedGenerationЗначение
metadata.generation, для которого выставлен condition.Допустимые значения:
0 <= X -
строкаstatus.conditions.reasonМашинно-читаемая причина текущего статуса.
Длина:
1..1024Шаблон:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
строкаstatus.conditions.statusТекущий статус condition.
Допустимые значения:
True,False,Unknown -
строкаstatus.conditions.typeТип condition.
Максимальная длина:
316Шаблон:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
объектstatus.encryption
Что на самом деле шифрует хранимые данные.
Отпечатка ключа здесь нет, в отличие от
SeaweedFSStore: на этом бэкенде ключ живёт в KMS и через модуль не проходит, так что считать отпечаток нечему — а отпечаток токена наводил бы на мысль, что данные зависят от него, чего нет.-
строкаstatus.encryption.keyFingerprintЭтим бэкендом не публикуется; описание публикации приведено выше.
-
строкаstatus.encryption.messageПочему действующий режим не тот, который просит спека.
-
строкаstatus.encryption.modeЧто делает бэкенд — не всегда то, что просит спека: хранилище, чью конфигурацию KMS применить не удалось, продолжает работать в том режиме, в котором уже работало.
Допустимые значения:
Disabled,ServerManaged -
строкаstatus.encryption.sinceКогда этот режим вступил в силу.
-
-
объектstatus.endpointS3-эндпоинт, через который клиенты обращаются к хранилищу.
-
строкаstatus.endpoint.externalURL S3-эндпоинта, доступный за пределами кластера. Заполняется только при действующей конфигурации
spec.publish; для неопубликованного хранилища остаётся пустым. -
строкаstatus.endpoint.internalВнутрикластерный URL S3-эндпоинта (DNS Service).
-
строкаstatus.endpoint.regionРегион S3 по умолчанию.
-
-
объектstatus.integrity
Что известно о целостности хранимых данных: когда проверяли, кто проверял и что нашли.
Отсутствие блока означает, что проверок ещё не было, — а это не то же самое, что «всё в порядке». Именно поэтому отметка времени вынесена в отдельное поле и не выводится из счётчиков.
-
целое числоstatus.integrity.damagedСколько единиц найдено повреждёнными.
-
массив строкstatus.integrity.detailsДословный текст бэкенда по каждой находке, ограниченный по количеству и длине. Не пересказывается: только текст движка называет том, объект и контрольные суммы, а искать диск будут именно по нему.
-
строкаstatus.integrity.lastScrubTimeКогда получен опубликованный результат.
-
целое числоstatus.integrity.repairedКоличество повреждений, устранённых модулем. Значение учитывается отдельно от
damaged, чтобы устранённые повреждения не учитывались как текущие. -
объектstatus.integrity.scannedОхват проверки.
-
целое числоstatus.integrity.scanned.objectsСколько объектов просмотрено, если бэкенд их считает.
-
целое числоstatus.integrity.scanned.volumesСколько единиц хранения просмотрено — томов SeaweedFS, placement group у Ceph.
-
-
строкаstatus.integrity.source
Кто проверял.
Module— проверял модуль (у SeaweedFS проверка есть, но сама она не запускается).Backend— движок проверяет по своему расписанию, а модуль сообщает найденное (Ceph).
Допустимые значения:
Module,Backend -
целое числоstatus.integrity.unreachable
Сколько узлов хранения не удалось опросить вовсе.
Значение учитывается отдельно от
damaged: недоступный во время проверки узел не считается повреждённым. Если есть недоступные узлы и повреждения не обнаружены,IntegrityHealthyостаётся в состоянииUnknown, а неTrue.
-
-
целое числоstatus.observedGenerationПоследнее значение
metadata.generation, обработанное контроллером. -
строкаstatus.phaseАгрегатная фаза:
Pending,InProgress,Ready,Error.Допустимые значения:
Pending,InProgress,Ready,Error -
объектstatus.redundancy
Столько ли копий у данных, сколько просит спека.
Отделено от
integrity, потому что недостача копии — это не повреждение: у хранилища, которому не хватает реплики, все байты могут быть целы, и оно в одном диске от того, чтобы их не осталось. Один общий счётчик скрыл бы то из двух, что случилось вторым.-
целое числоstatus.redundancy.copiesWantedСколько копий каждой единицы хранения требует настройка репликации, считая оригинал.
-
массив строкstatus.redundancy.detailsКаким томам не хватает копий и насколько, с ограничением по количеству строк.
-
строкаstatus.redundancy.lastCheckTimeКогда сделан этот подсчёт. Он берётся из топологии мастера, поэтому обновляется на каждом reconcile, независимо от расписания проверки целостности.
-
целое числоstatus.redundancy.underReplicatedУ скольких из них копий меньше, чем запрошено.
-
целое числоstatus.redundancy.volumesСколько единиц хранения посчитано.
-
-
SeaweedFSStore
Короткие имена: swfsstore
Область: Cluster
Версия: v1alpha1
Объектное хранилище на SeaweedFS: StatefulSet master, volume и filer на PVC, S3-gateway перед ними. Принимает собственные настройки SeaweedFS — сколько каких компонентов и код репликации — вместо кросс-бэкендного интента (intent — высокоуровневое «намерение» вроде None/Standard/High) отказоустойчивости.
Напрямую не потребляется: на него ссылается ObjectStore через
spec.storeRef, а пользователь указывает имя этого ObjectStore в
своём Bucket.
-
объектspecЖелаемое состояние хранилища.
-
объектspec.encryption
Шифрование хранимых данных объектов на стороне сервера.
Если поле не задано, объекты пишутся как пришли: их читает любой, у кого в руках диск. При
ServerManagedмодуль передаёт S3-gateway ключ из Secret и проставляет на каждом своём бакете шифрование по умолчанию — объекты шифруются без изменений в приложениях, которые их пишут.Состав поля отличается от
SDSElasticStore: SeaweedFS шифрует ключ данных каждого объекта с помощью ключа, предоставляемого модулем. Ceph RGW для аналогичного сценария использует внешний Vault.-
объектspec.encryption.keySecretRef
Secret в неймспейсе модуля с ключом-обёрткой, в одном из двух ключей:
kek(32 байта в hex, используется напрямую) либоkey(любая парольная фраза, из которой ключ выводится).Ссылка, а не значение в спеке, чтобы ключ не появлялся в объекте хранилища. Обратите внимание, что значит его смена: бэкенд не выполняет повторное шифрование ключей, поэтому объекты, записанные под прежним ключом, перестают читаться. Модуль считает отпечаток ключа и отказывается применять сменившийся — состояние отражается в
status.encryption.-
строкаspec.encryption.keySecretRef.name
Обязательный параметр
Имя Secret.Длина:
1..253
-
-
строкаspec.encryption.mode
Чем шифруются данные.
Disabled— ничем.ServerManaged— S3-gateway шифрует каждый объект собственным ключом данных, завёрнутым в ключ изkeySecretRef. Ни чтение, ни запись не требуют изменений на клиенте, а ключ-обёртка не попадает в хранилище метаданных.
Отключить шифрование после включения нельзя: ранее записанным объектам по-прежнему требуется ключ. Для перехода к хранению без шифрования необходимо создать новое хранилище.
По умолчанию:
DisabledДопустимые значения:
Disabled,ServerManaged
-
-
объектspec.externalMetadataStoreПараметры подключения к PostgreSQL для
metadataStore: External. Обязателен вместе с ним и запрещён без него.-
объектspec.externalMetadataStore.secretRef
Обязательный параметр
Secret в неймспейсе модуля (
d8-sds-object) с параметрами подключения. Ключи:host(обязателен) — имя или адрес сервера;port— TCP-порт,5432если не задан;database(обязателен) — база, в которую filer записывает метаданные;username,password(обязательны) — роль, которой разрешено создавать в ней таблицы: filer создаёт по таблице на бакет при первом обращении;sslmode— режим libpq,requireесли не задан.disableотправляет пароль открытым текстом и отклоняется;ca.crt— PEM-набор для проверки сервера. Если он есть, он монтируется в filer и соединение сверяет сервер с ним; если нет,requireшифрует, но не проверяет, кто на той стороне.
Secret, а не поля здесь: подключение несёт пароль, а пароль в spec — это пароль в каждом
d8 k get -o yamlи в каждой резервной копии ресурсов кластера.-
строкаspec.externalMetadataStore.secretRef.name
Обязательный параметр
Имя Secret.Длина:
1..253
-
-
целое числоspec.filersЧисло filer-серверов; каждый заодно обслуживает S3-gateway. Больше одного требует общей базы метаданных —
metadataStore: PostgresилиExternal. По умолчанию1.По умолчанию:
1Допустимые значения:
1 <= X -
объектspec.integrity
Периодическая проверка целостности данных.
SeaweedFS проверяет контрольную сумму при каждом чтении объекта и поддерживает полную проверку всех объектов без чтения через шлюз. Автоматический запуск этой проверки в SeaweedFS отсутствует, поэтому расписанием проверок управляет модуль.
У
SDSElasticStoreтакого поля нет: Ceph выполняет проверку по собственному расписанию, а модуль только сообщает найденное.-
булевыйspec.integrity.autoRepair
Разрешает модулю заменить повреждённую копию тома свежей, вытянутой с целой копии.
По умолчанию автоматическое восстановление отключено, поскольку оно удаляет повреждённую копию данных и заменяет её исправной.
Восстановление запускается только при наличии другой копии того же тома, которая успешно прошла проверку целостности в том же цикле. Если хотя бы одно условие не выполнено, модуль сообщает о повреждении и не удаляет повреждённую копию.
По умолчанию:
false -
булевыйspec.integrity.enabled
falseотключает периодическую проверку. Отдельный параметр позволяет явно отключить проверку вместо использования большого значения интервала.По умолчанию:
true -
строкаspec.integrity.interval
Интервал между проверками целостности. По умолчанию
168h(раз в неделю), значения меньше1hподнимаются до1h.Значение по умолчанию сознательно консервативно: режим
Fullчитает каждый хранимый байт, и стоимость этого на большом хранилище не измерена. Уменьшайте, если диски хранилища важнее его пропускной способности на чтение. -
строкаspec.integrity.mode
Насколько тщательная проверка.
Full— проверяет контрольную сумму каждого объекта, то есть читает все данные.Index— проверяет только индексы томов. Дёшево, находит битый индекс, но не испорченное тело объекта — а искали именно его.
По умолчанию:
FullДопустимые значения:
Index,Full
-
-
целое числоspec.masters
Число master-серверов. Мастера держат Raft-кворум, поэтому осмысленны нечётные значения:
1— если хранилище может уйти вместе со своим узлом,3— если не может..Неизменяемо после создания: менять число членов живого Raft-кворума значит его потерять.
По умолчанию:
3Допустимые значения:
1 <= X -
строкаspec.metadataStore
Где filer хранит метаданные.
LevelDB— встроенное хранилище на собственном PVC filer. Без внешних зависимостей и без возможности разделения: один filer.Postgres— Postgres рядом, через модуль managed-postgres; именно он позволяет нескольким filer работать с одними и теми же данными.External— PostgreSQL, который модуль не разворачивает и который описан вexternalMetadataStore. Возможности те же, что уPostgres, но доступность, резервное копирование и обновление базы обеспечивает внешняя система.
Неизменяемо после создания: метаданные между вариантами не переносятся.
По умолчанию:
LevelDBДопустимые значения:
LevelDB,Postgres,External -
объектspec.placementРазмещение data plane хранилища.
-
объектspec.placement.nodeSelectorЛейблы узлов, которым должны соответствовать поды data plane (семантика та же, что у
spec.nodeSelectorпода). -
массив объектовspec.placement.tolerationsTolerations для подов data plane (та же структура, что у
spec.tolerationsпода).-
строкаspec.placement.tolerations.effectEffect taint.
Допустимые значения:
‘’,NoSchedule,PreferNoSchedule,NoExecute -
строкаspec.placement.tolerations.keyКлюч taint.
-
строкаspec.placement.tolerations.operatorОператор сравнения.
Допустимые значения:
Exists,Equal -
целое числоspec.placement.tolerations.tolerationSecondsВремя, в течение которого под остаётся на узле с taint.
-
строкаspec.placement.tolerations.valueЗначение taint.
-
-
-
строкаspec.postgresClassName
Имя PostgresClass, из которого разворачивается управляемая база метаданных. Пусто — класс с именем
default.Это единственная ручка, которой хранилище влияет на размещение подов базы: у ресурса Postgres полей планирования нет вовсе, поэтому
spec.placementна них не действует —tolerations,nodeSelectorиnodeAffinityэто поля PostgresClass. Чтобы увести базу на выделенные узлы, создайте класс с нужным размещением и укажите его здесь.Действует только при
metadataStore: Postgres.Максимальная длина:
253 -
объектspec.publish
Публикует S3-эндпоинт этого хранилища за пределы кластера — через реализацию Gateway API из модуля
alb. Если поле не задано (по умолчанию), хранилище доступно только внутри кластера.Объект
Gatewayздесь не создаётся: им владеет администратор или команда, черезALBInstanceлибоClusterALBInstance. Модуль только подключает к нему маршрут. Подключение маршрута из другого неймспейса разрешает сторона цели (ReferenceGrantв неймспейсе Gateway либоallowedRoutesу listener); если оно не разрешено, хранилище сообщает об этом в своих conditions, а не пытается выдать права само себе.-
строкаspec.publish.addressing
Как клиент адресует бакет на опубликованном эндпоинте.
PathStyle—https://s3.example.com/<bucket>/<key>. Одно DNS-имя и один сертификат — то, что администратор может получить всегда.VirtualHosted—https://<bucket>.s3.example.com/<key>. Требует wildcard-DNS и wildcard-сертификата (только DNS-01) и поддерживается S3-шлюзами бэкендов неодинаково.
По умолчанию:
PathStyleДопустимые значения:
PathStyle,VirtualHosted -
объектspec.publish.gatewayRef
Обязательный параметр
Gateway, к которому подключается маршрут. Неймспейс входит в ссылку, потому что общий Gateway живёт в неймспейсе контроллераalb, а не рядом с хранилищем.-
строкаspec.publish.gatewayRef.name
Обязательный параметр
Имя объекта Gateway.Длина:
1..253 -
строкаspec.publish.gatewayRef.namespace
Обязательный параметр
Неймспейс, в котором находится Gateway.Длина:
1..63
-
-
строкаspec.publish.hostname
Обязательный параметр
Имя хоста, на котором отвечает опубликованный эндпоинт, напримерs3.example.com. Wildcard (*.s3.example.com) обязателен для адресацииVirtualHostedи запрещён дляPathStyle.Длина:
1..253Шаблон:
^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)+$ -
объектspec.publish.tls
Обязательный параметр
Серверный сертификат опубликованного эндпоинта. Обязателен: ключи SigV4 передаются в заголовкеAuthorization, поэтому публикация по обычному HTTP отдала бы бакет любому, кто видит трафик. Режимinsecureне поддерживается.-
объектspec.publish.tls.secretRef
Обязательный параметр
Secret типаkubernetes.io/tlsв неймспейсе модуля. Модуль не выпускает сертификаты и не зависит от API cert-manager: укажите Secret, созданный cert-manager, либо добавьте свой. Смена сертификата — это запись в этот Secret, хранилище при этом не пересоздаётся.-
строкаspec.publish.tls.secretRef.name
Обязательный параметр
Имя Secret с сертификатом.Длина:
1..253
-
-
-
-
строкаspec.reclaimPolicy
Что происходит с сохранёнными данными при удалении хранилища.
Retain— PVC сохраняются, ничего из записанного не теряется.Delete— PVC удаляются вместе с рабочими нагрузками.
Неизменяемо после создания.
По умолчанию:
RetainДопустимые значения:
Retain,Delete -
строкаspec.replication
Собственный трёхзначный код репликации SeaweedFS
xyz: копии в других датацентрах, других стойках и на других серверах той же стойки.000— одна копия,001— одна дополнительная копия на другом сервере,002— две..Допускается только
00z: все volume-серверы модуль разворачивает в одном кластере Kubernetes с топологией SeaweedFS по умолчанию, поэтому копию в другой стойке или датацентре положить некуда — запись никогда не завершится.Неизменяемо после создания: повышение кода не перереплицирует уже записанное.
По умолчанию:
001Шаблон:
^[0-9]{3}$ -
объектspec.storage
Обязательный параметр
PVC под data plane.-
строкаspec.storage.class
Обязательный параметр
Имя Kubernetes StorageClass для создания PVC. Неизменяемо после создания.Длина:
1..253 -
строкаspec.storage.sizePerNode
Ёмкость на один volume-сервер в формате Kubernetes Quantity (BinarySI), например
50Giили2Ti. Суммарная ёмкость хранилища — примерноsizePerNode, умноженная наvolumeServers. По умолчанию10Gi.Неизменяемо после создания. Это размер volumeClaimTemplate у StatefulSet, менять который Kubernetes не позволяет, поэтому новое значение не дошло бы ни до уже выданных томов, ни до тома следующего volume-сервера. Чтобы увеличить store, добавьте volume-серверы.
Шаблон:
^[0-9]+(\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|k|M|G|T|P|E)?$
-
-
строкаspec.volumeIndex
Где volume-сервер держит needle map — индекс «идентификатор объекта → смещение», по записи на каждый объект.
Memory(по умолчанию) — в памяти, как и в самом движке. Быстрее всего, но объём ограничен только числом объектов на сервере: примерно 12 байт на объект, поэтому сервер с мелкими объектами требует гигабайтов, и ни одно поле спеки не говорит, сколько именно.LevelDB— на диске volume-сервера. Расходует около 6 МиБ кешей на том независимо от его наполнения, поэтому этот расход можно указать в requests пода — и модуль указывает.
Граница выгоды — примерно полмиллиона объектов на том: за ней
LevelDBне только предсказуем по памяти, но и экономнее.По умолчанию:
MemoryДопустимые значения:
Memory,LevelDB -
целое числоspec.volumeServers
Число volume-серверов, хранящих данные. Должно быть не меньше числа копий из
replication: SeaweedFS кладёт каждую копию на отдельный volume-сервер, поэтому store с меньшим их числом не разместил бы ни одного тома. Такой store отклоняется при создании.Значение можно только увеличивать. При удалении volume-сервера удаляется его PVC вместе с хранящимися на нём объектами. Автоматическое перемещение данных перед удалением не выполняется.
По умолчанию:
3Допустимые значения:
1 <= X
-
-
объектstatusНаблюдаемое состояние хранилища.
-
объектstatus.adminSecretRef
Ссылка на Secret (в неймспейсе модуля) с учётными данными администратора бэкенда, которые контроллер использует для управления бакетами и ключами.
Заполняется не всеми бэкендами: учётные данные Ceph RGW принадлежат Rook и лежат в неймспейсе sds-elastic, а не модуля.
-
строкаstatus.adminSecretRef.name
Обязательный параметр
Имя Secret.Длина:
1..253
-
-
объектstatus.backendДвижок (engine — конкретная реализация бэкенда) этого хранилища и его запущенная версия.
-
строкаstatus.backend.typeДвижок бэкенда.
Допустимые значения:
SeaweedFS,CephRGW -
строкаstatus.backend.versionЗапущенная версия бэкенда.
-
-
объектstatus.capacityИспользование хранилища по данным бэкенда.
-
строкаstatus.capacity.availableСвободная ёмкость, Kubernetes Quantity (BinarySI).
-
строкаstatus.capacity.lastUpdatedВремя последнего замера ёмкости.
-
строкаstatus.capacity.totalПолная ёмкость, Kubernetes Quantity (BinarySI).
-
строкаstatus.capacity.usedЗанятая ёмкость, Kubernetes Quantity (BinarySI).
-
строкаstatus.capacity.usedPercent
used / total * 100, с двумя знаками после запятой.
-
-
массив объектовstatus.conditionsПостадийные condition:
BackendReady,EndpointReadyи агрегатноеReady.-
строкаstatus.conditions.lastTransitionTimeВремя последнего перехода condition.
-
строкаstatus.conditions.messageЧеловекочитаемое описание текущего статуса.
Максимальная длина:
32768 -
целое числоstatus.conditions.observedGenerationЗначение
metadata.generation, для которого выставлен condition.Допустимые значения:
0 <= X -
строкаstatus.conditions.reasonМашинно-читаемая причина текущего статуса.
Длина:
1..1024Шаблон:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
строкаstatus.conditions.statusТекущий статус condition.
Допустимые значения:
True,False,Unknown -
строкаstatus.conditions.typeТип condition.
Максимальная длина:
316Шаблон:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
объектstatus.encryption
Состояние шифрования хранимых данных и используемого ключа.
keyFingerprintпозволяет обнаружить изменение ключа-обёртки. Смена ключа не приводит к повторному шифрованию ранее записанных объектов, поэтому они становятся недоступны для чтения с новым ключом. Gateway считывает ключ при запуске, поэтому изменение Secret применяется только после перезапуска компонента.-
строкаstatus.encryption.keyFingerprintОпознаёт ключ-обёртку, не раскрывая его. Это тот ключ, под которым записаны хранимые объекты; спека, называющая другой, сообщается, а не применяется.
-
строкаstatus.encryption.messageПочему действующий режим не тот, который просит спека.
-
строкаstatus.encryption.modeЧто делает бэкенд — не всегда то, что просит спека: хранилище, чей ключ не удалось прочитать, продолжает работать в том режиме, в котором уже работало.
Допустимые значения:
Disabled,ServerManaged -
строкаstatus.encryption.sinceКогда этот режим и ключ вступили в силу.
-
-
объектstatus.endpointS3-эндпоинт, через который клиенты обращаются к хранилищу.
-
строкаstatus.endpoint.externalURL S3-эндпоинта, доступный за пределами кластера. Заполняется только при действующей конфигурации
spec.publish; для неопубликованного хранилища остаётся пустым. -
строкаstatus.endpoint.internalВнутрикластерный URL S3-эндпоинта (DNS Service).
-
строкаstatus.endpoint.regionРегион S3 по умолчанию.
-
-
объектstatus.integrity
Что известно о целостности хранимых данных: когда проверяли, кто проверял и что нашли.
Отсутствие блока означает, что проверок ещё не было, — а это не то же самое, что «всё в порядке». Именно поэтому отметка времени вынесена в отдельное поле и не выводится из счётчиков.
-
целое числоstatus.integrity.damagedСколько единиц найдено повреждёнными.
-
массив строкstatus.integrity.detailsДословный текст бэкенда по каждой находке, ограниченный по количеству и длине. Не пересказывается: только текст движка называет том, объект и контрольные суммы, а искать диск будут именно по нему.
-
строкаstatus.integrity.lastScrubTimeКогда получен опубликованный результат.
-
целое числоstatus.integrity.repairedКоличество повреждений, устранённых модулем. Значение отделено от
damagedдля разделения текущих и уже устранённых повреждений. Устранённое повреждение не является текущей проблемой. -
объектstatus.integrity.scannedОхват проверки.
-
целое числоstatus.integrity.scanned.objectsСколько объектов просмотрено, если бэкенд их считает.
-
целое числоstatus.integrity.scanned.volumesСколько единиц хранения просмотрено — томов SeaweedFS, placement group у Ceph.
-
-
строкаstatus.integrity.source
Кто проверял.
Module— проверял модуль (у SeaweedFS проверка есть, но сама она не запускается).Backend— движок проверяет по своему расписанию, а модуль сообщает найденное (Ceph).
Допустимые значения:
Module,Backend -
целое числоstatus.integrity.unreachable
Сколько узлов хранения осталось непроверенными: они не ответили либо проверка не уложилась в отведённое на них время. Что именно произошло с каждым, написано в
details.Значение учитывается отдельно от
damaged: volume-сервер, который перезапускался во время проверки и не вернул данные, не считается повреждённым. Если есть непроверенные узлы и повреждения не обнаружены,IntegrityHealthyостаётся в состоянииUnknown, а неTrue.Проход, не проверивший вообще ничего, не обновляет
lastScrubTime: там остаются результат и время последней проверки, которая что-то прочитала.
-
-
целое числоstatus.observedGenerationПоследнее значение
metadata.generation, обработанное контроллером. -
строкаstatus.phaseАгрегатная фаза:
Pending,InProgress,Ready,Error.Допустимые значения:
Pending,InProgress,Ready,Error -
объектstatus.redundancy
Столько ли копий у данных, сколько просит спека.
Отделено от
integrity, потому что недостача копии — это не повреждение: у хранилища, которому не хватает реплики, все байты могут быть целы, и оно в одном диске от того, чтобы их не осталось. Один общий счётчик скрыл бы то из двух, что случилось вторым.-
целое числоstatus.redundancy.copiesWantedСколько копий каждой единицы хранения требует настройка репликации, считая оригинал.
-
массив строкstatus.redundancy.detailsКаким томам не хватает копий и насколько, с ограничением по количеству строк.
-
строкаstatus.redundancy.lastCheckTimeКогда сделан этот подсчёт. Он берётся из топологии мастера, поэтому обновляется на каждом reconcile, независимо от расписания проверки целостности.
-
целое числоstatus.redundancy.underReplicatedУ скольких из них копий меньше, чем запрошено.
-
целое числоstatus.redundancy.volumesСколько единиц хранения посчитано.
-
-
BucketAccess
Короткие имена: ba
Область: Namespaced
Версия: v1alpha1
Запрашивает доступ к cluster-scoped бакету Bucket из
потребляющего неймспейса. Контроллер генерирует отдельную пару
access key / secret key для этого доступа, кладёт в тот же неймспейс
Secret, указанный в status.secretRef, со стандартными переменными
подключения к S3 и отзывает ключ при удалении ресурса.
Доступ локален для неймспейса по построению: Bucket, на который он
ссылается, обязан быть в этом же неймспейсе, а его данные приватны для
него. Учётные данные выдаются только после перехода указанного Bucket
в состояние Bound.
Ротация ключей: установите или измените аннотацию
storage.deckhouse.io/rotate, чтобы выпустить новую пару ключей
(Secret обновляется, предыдущий ключ отзывается).
-
объектspecЖелаемое состояние доступа.
-
строкаspec.bucketRef
Обязательный параметр
Имя Bucket (в том же неймспейсе), к данным которого выдаются учётные данные. Bucket должен быть в состоянииBound. Неизменяемо после создания.Длина:
1..253Шаблон:
^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ -
строкаspec.credentialsSecretNameПереопределяет имя Secret с учётными данными в неймспейсе доступа. По умолчанию
<metadata.name>-s3-credentials.Длина:
1..253 -
строкаspec.endpointScope
Какой из адресов хранилища попадёт в Secret с учётными данными, в ключ
S3_ENDPOINT.Internal(по умолчанию) — внутрикластерный адрес Service. Большинство потребителей живёт в этом же кластере, и перевод их на внешний балансировщик без спроса стоил бы задержки и исходящего трафика.External— опубликованный адрес; доступен только пока действуетspec.publishу хранилища.
Если для непубликованного хранилища указано
External, переход на внутренний адрес не выполняется. BucketAccess остаётся в состоянии NotReady и сообщает причину. Это предотвращает выдачу Secret с адресом, недоступным из ожидаемой сети.Допустимые значения:
Internal,External -
строкаspec.permission
Уровень доступа для выданных учётных данных.
ReadWrite(по умолчанию) — чтение и запись объектов.ReadOnly— только чтение объектов.
По умолчанию:
ReadWriteДопустимые значения:
ReadWrite,ReadOnly
-
-
объектstatusНаблюдаемое состояние доступа.
-
строкаstatus.accessKeyIDПубличный идентификатор ключа доступа, выданного для этого доступа (секретный ключ записывается только в Secret).
-
строкаstatus.bucketNameФактическое имя бакета, к которому предоставлен доступ.
-
массив объектовstatus.conditionsПокомпонентные condition:
AccessGranted,CredentialsReadyи агрегатноеReady.-
строкаstatus.conditions.lastTransitionTimeВремя последнего перехода condition.
-
строкаstatus.conditions.messageЧеловекочитаемое описание текущего статуса.
Максимальная длина:
32768 -
целое числоstatus.conditions.observedGenerationЗначение
metadata.generation, для которого выставлен condition.Допустимые значения:
0 <= X -
строкаstatus.conditions.reasonМашинно-читаемая причина текущего статуса.
Длина:
1..1024Шаблон:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
строкаstatus.conditions.statusТекущий статус condition.
Допустимые значения:
True,False,Unknown -
строкаstatus.conditions.typeТип condition.
Максимальная длина:
316Шаблон:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
строкаstatus.endpointВнутрикластерный URL S3-эндпоинта кластера-владельца.
-
строкаstatus.lastRotationTimeВремя последней выдачи ключа.
-
целое числоstatus.observedGenerationПоследнее значение
metadata.generation, обработанное контроллером. -
строкаstatus.observedRotationПоследнее обработанное контроллером значение аннотации
storage.deckhouse.io/rotate. -
строкаstatus.phaseАгрегатная фаза:
Pending,InProgress,Ready,Error.Допустимые значения:
Pending,InProgress,Ready,Error -
объектstatus.secretRefСсылка на Secret (в неймспейсе этого доступа) с переменными подключения и учётными данными S3:
S3_ENDPOINT,S3_REGION,S3_BUCKET,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY.-
строкаstatus.secretRef.name
Обязательный параметр
Имя Secret.Длина:
1..253
-
-
BucketContents
Короткие имена: bktc
Область: Cluster
Версия: v1alpha1
Backing-объект для одного S3-бакета в кластере ObjectStore — то же, что PersistentVolume для заявки. Контроллер создаёт его для namespaced-ресурса Bucket и разворачивает сам бакет в бэкенде; вручную объявлять его не предполагается — вебхук принимает ресурс только от ServiceAccount модуля.
Ресурс cluster-scoped, учётные данные здесь не выдаются: неймспейс владеющего Bucket запрашивает доступ и получает Secret с учётными данными через namespaced-ресурсы BucketAccess.
Ресурс сохраняется после удаления связанного Bucket, если это
определено политикой хранения. При Retain ресурс переходит в фазу
Released, а данные сохраняются независимо от удаления неймспейса. Bucket с тем же именем, созданный заново в том же неймспейсе,
снова к нему привязывается, и данные возвращаются вместе с ним.
-
объектspecЖелаемое состояние бакета.
-
строкаspec.accessPolicy
Политика доступа к бакету.
Private(по умолчанию) — доступ только с выданными учётными данными.PublicRead— объекты доступны на чтение анонимно; запись по-прежнему требует учётных данных, а листинг бакета не выдаётся (анонимному клиенту нужно знать ключ объекта).
По умолчанию:
PrivateДопустимые значения:
Private,PublicRead -
строкаspec.bucketNameИмя бакета в S3. Если не задано — используется
metadata.name. Должно соответствовать правилам именования бакетов S3. Неизменяемо после создания.Длина:
3..63Шаблон:
^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ -
объектspec.bucketRef
Ссылка на Bucket, которому принадлежит этот объект.
Это авторитетная запись о владельце: она называет единственный неймспейс, которому можно выпускать учётные данные к бакету. Выставить поле может только ServiceAccount модуля (проверяется вебхуком при создании), после создания оно неизменяемо — поэтому объект нельзя переназначить другому Bucket, а чужой Bucket не может присвоить себе уже принадлежащие кому-то данные. Лейблы
storage.deckhouse.io/owned-by-bucket-*дублируют его для выборок по лейблам, но пользователь может их изменить, и для авторизации они не используются.Объект в фазе
Releasedего сохраняет: это запись о том, чьи были данные, и именно она позволяет тому же Bucket — созданному заново с тем же именем в том же неймспейсе — забрать их обратно.-
строкаspec.bucketRef.name
Обязательный параметр
Имя Bucket-владельца.Длина:
1..253 -
строкаspec.bucketRef.namespace
Обязательный параметр
Неймспейс Bucket-владельца.Длина:
1..253
-
-
объектspec.lifecycleОтражает правила истечения владеющего Bucket. В отличие от objectLock синхронизируется на каждом проходе: истечение можно менять на живом бакете, и правило, убранное из Bucket, обязано перестать удалять объекты.
-
массив объектовspec.lifecycle.rulesПрименяемые правила. Пустой список полностью убирает конфигурацию lifecycle с бакета.
-
целое числоspec.lifecycle.rules.abortIncompleteUploadsAfterDaysУбрать части multipart-загрузки, которая так и не завершилась: они занимают место и не попадают ни в один листинг.
Допустимые значения:
1 <= X -
целое числоspec.lifecycle.rules.expireAfterDaysУдалить объект через столько дней после записи. На версионированном бакете это делает текущую версию неактуальной, а не удаляет данные.
Допустимые значения:
1 <= X -
целое числоspec.lifecycle.rules.expireNoncurrentAfterDaysУдалить версию через столько дней после того, как она перестала быть текущей. Object lock сильнее: версия под непросроченным retention не удаляется.
Допустимые значения:
1 <= X -
строкаspec.lifecycle.rules.idИмя правила в бэкенде, чтобы его можно было узнать в выводе
aws s3api get-bucket-lifecycle-configuration. Если не задано, выводится из позиции правила.Длина:
1..255 -
строкаspec.lifecycle.rules.prefixОграничивает правило ключами, начинающимися с этой строки. Без него правило действует на все объекты бакета.
Максимальная длина:
1024
-
-
-
объектspec.objectLockБлокировка объектов, запрошенная владеющим Bucket: версию под retention нельзя удалить, пока срок не истечёт. Неизменяемо — бэкенд принимает блокировку только при создании бакета.
-
целое числоspec.objectLock.days
Обязательный параметр
Retention по умолчанию для новых объектов, в днях.Допустимые значения:
1 <= X -
строкаspec.objectLock.mode
Обязательный параметр
Режим retention для новых объектов.Complianceнельзя обойти; в режимеGovernanceудаление возможно при наличии соответствующих прав.Допустимые значения:
Governance,Compliance
-
-
объектspec.quotaНеобязательные лимиты использования бакета. Применение зависит от возможностей бэкенда.
-
целое числоspec.quota.maxObjectsМаксимальное число объектов.
0(по умолчанию) — без лимита.Допустимые значения:
0 <= X -
строкаspec.quota.maxSizeМаксимальный суммарный размер бакета в формате Kubernetes Quantity (BinarySI), например
10Gi. Без значения — без лимита.Шаблон:
^[0-9]+(\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|k|M|G|T|P|E)?$
-
-
строкаspec.reclaimPolicy
Что происходит с данными бакета при удалении Bucket.
Retain(по умолчанию) — бакет и его объекты сохраняются в бэкенде.Delete— бакет и все его объекты удаляются.
По умолчанию:
RetainДопустимые значения:
Retain,Delete -
объектspec.storeRef
Обязательный параметр
Хранилище, в котором лежит этот бакет. Контроллер выводит ссылку из класса
ObjectStoreвладеющегоBucketи записывает её сюда; хранилище должно существовать и быть в фазеReadyдо создания бакета.Здесь именно хранилище, а не класс, и это сознательно: данные лежат в хранилище, поэтому удаление или переключение класса не должно менять место, где эти contents ищут свои данные.
Неизменяемо после создания.
-
строкаspec.storeRef.kind
Обязательный параметр
Kind объекта хранилища, напримерSeaweedFSStore.Длина:
1..63 -
строкаspec.storeRef.name
Обязательный параметр
Имя объекта хранилища.Длина:
1..30Шаблон:
^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
-
-
строкаspec.versioningВерсионирование, запрошенное владеющим Bucket.
По умолчанию:
SuspendedДопустимые значения:
Enabled,Suspended
-
-
объектstatusНаблюдаемое состояние бакета.
-
строкаstatus.bucketNameФактическое имя бакета, созданного в бэкенде.
-
массив объектовstatus.conditionsПокомпонентные condition:
BucketReadyи агрегатноеReady.-
строкаstatus.conditions.lastTransitionTimeВремя последнего перехода condition.
-
строкаstatus.conditions.messageЧеловекочитаемое описание текущего статуса.
Максимальная длина:
32768 -
целое числоstatus.conditions.observedGenerationЗначение
metadata.generation, для которого выставлен condition.Допустимые значения:
0 <= X -
строкаstatus.conditions.reasonМашинно-читаемая причина текущего статуса.
Длина:
1..1024Шаблон:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
строкаstatus.conditions.statusТекущий статус condition.
Допустимые значения:
True,False,Unknown -
строкаstatus.conditions.typeТип condition.
Максимальная длина:
316Шаблон:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
строкаstatus.endpointВнутрикластерный URL S3-эндпоинта кластера-владельца.
-
объектstatus.objectLockКонфигурация блокировки объектов, прочитанная у бэкенда.
-
целое числоstatus.objectLock.daysRetention по умолчанию в днях; отсутствует, если правила по умолчанию нет.
-
булевыйstatus.objectLock.enabled
Обязательный параметр
Включена ли блокировка объектов на бакете. Остаётсяtrueи без правила retention по умолчанию: выключить блокировку у бакета уже нельзя, а уже защищённые объекты остаются защищёнными. -
строкаstatus.objectLock.modeРежим retention по умолчанию; отсутствует, если у бакета есть блокировка, но нет правила по умолчанию.
Допустимые значения:
Governance,Compliance
-
-
целое числоstatus.observedGenerationПоследнее значение
metadata.generation, обработанное контроллером. -
строкаstatus.phaseАгрегатная фаза:
Pending,InProgress,Ready,Error.Допустимые значения:
Pending,InProgress,Ready,Released,Error -
строкаstatus.versioningСостояние версионирования, прочитанное у бэкенда. Не копия запроса: версионирование могло быть включено не этим модулем, и копия
specне отражала бы это состояние.Допустимые значения:
Enabled,Suspended
-
Bucket
Короткие имена: bkt
Область: Namespaced
Версия: v1alpha1
Bucket — то, что создаёт пользователь, чтобы получить бакет.
Контроллер разворачивает под него cluster-scoped BucketContents в
spec.objectStoreRef, принадлежащий этому Bucket и приватный для
данного неймспейса, — та же схема, что PersistentVolumeClaim и
PersistentVolume.
Привязка к уже существующему бакету не предусмотрена: для неё нужна была политика, разрешающая неймспейсу брать чужой бакет, а этот механизм убран вместе с доступом между неймспейсами.
Учётные данные запрашиваются отдельно ресурсом BucketAccess,
ссылающимся на этот Bucket по имени в том же неймспейсе.
Удаление при reclaimPolicy: Retain оставляет BucketContents в фазе
Released с сохранёнными данными; Bucket с тем же именем, созданный
заново в том же неймспейсе, снова их подхватывает.
-
объектspecЖелаемое состояние бакета.
-
строкаspec.accessPolicy
Политика доступа к бакету.
Private(по умолчанию) — доступ только с выданными учётными данными.PublicRead— объекты доступны на чтение анонимно; запись по-прежнему требует учётных данных, а листинг бакета не выдаётся (анонимному клиенту нужно знать ключ объекта).
По умолчанию:
PrivateДопустимые значения:
Private,PublicRead -
объектspec.lifecycle
Настройка автоматического удаления объектов по расписанию, например для бакетов с логами или временными данными.
Поддерживается только удаление по истечении срока. Перенос объектов между уровнями хранения (lifecycle transition) не поддерживается SeaweedFS 4.39, поэтому этот сценарий не предоставляется модулем.
-
массив объектовspec.lifecycle.rulesПрименяемые правила. Пустой список полностью убирает конфигурацию lifecycle с бакета.
-
целое числоspec.lifecycle.rules.abortIncompleteUploadsAfterDaysУдаляет части незавершённой multipart-загрузки. Такие части занимают место, но не отображаются в списке объектов.
Допустимые значения:
1 <= X -
целое числоspec.lifecycle.rules.expireAfterDaysУдалить объект через столько дней после записи. На версионированном бакете это делает текущую версию неактуальной, а не удаляет данные; место освобождает
expireNoncurrentAfterDays.Допустимые значения:
1 <= X -
целое числоspec.lifecycle.rules.expireNoncurrentAfterDays
Удалить версию через столько дней после того, как она перестала быть текущей. Имеет смысл только на версионированном бакете.
Object lock сильнее: версия под непросроченным retention не удаляется, что бы здесь ни стояло.
Допустимые значения:
1 <= X -
строкаspec.lifecycle.rules.idИмя правила в бэкенде, чтобы его можно было узнать в выводе
aws s3api get-bucket-lifecycle-configuration. Если не задано, выводится из позиции правила.Длина:
1..255 -
строкаspec.lifecycle.rules.prefixОграничивает правило ключами, начинающимися с этой строки. Без него правило действует на все объекты бакета — именно поэтому случайный
expireAfterDaysна весь бакет стоит перечитать дважды.Максимальная длина:
1024
-
-
-
объектspec.objectLock
Включает режим WORM (Write Once Read Many). Версию объекта с действующим retention нельзя удалить до истечения срока хранения.
Требует
versioning: Enabledи неизменяемо: нельзя ни добавить к существующему бакету, ни убрать, ни перенастроить. Ceph RGW принимает блокировку только при создании бакета, поэтому изменяемое поле означало бы, что один и тот же манифест на одном хранилище включает защиту, а на другом отдаёт ошибку, и в манифесте не видно, на каком.Вместе с этим полем запрещён
reclaimPolicy: Delete: бакет с защищёнными объектами удалить нельзя, поэтому такая пара оставила бы объект вTerminatingдо истечения последнего срока.Legal hold (бессрочная блокировка удаления) здесь не настраивается — это операция клиента над объектом. Пока она стоит, удаление невозможно, и помогает только её снятие.
-
целое числоspec.objectLock.days
Обязательный параметр
Сколько дней новый объект остаётся защищённым. Дни, а не длительность, потому что S3 выражает retention по умолчанию целыми днями или целыми годами.Допустимые значения:
1 <= X -
строкаspec.objectLock.mode
Обязательный параметр
Режим retention для новых объектов.
Governance— вызывающий с правом обхода всё же может удалить защищённую версию.Compliance— удаление невозможно до истечения срока; срок объекта можно продлить, но не сократить.
Допустимые значения:
Governance,Compliance
-
-
строкаspec.objectStoreRef
Обязательный параметр
Имя ObjectStore, в котором создаётся бакет. Неизменяемо после создания.Длина:
1..30Шаблон:
^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ -
объектspec.quota
Необязательные лимиты использования бакета. Применение зависит от возможностей бэкенда.
Если не задано, берётся квота класса
ObjectStore, если она там есть; запрос больше разрешённого классом отклоняет admission-вебхук.-
целое числоspec.quota.maxObjectsМаксимальное число объектов.
0(по умолчанию) — без лимита.Допустимые значения:
0 <= X -
строкаspec.quota.maxSizeМаксимальный суммарный размер в формате Kubernetes Quantity (BinarySI), например
10Gi. Без значения — без лимита.Шаблон:
^[0-9]+(\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|k|M|G|T|P|E)?$
-
-
строкаspec.reclaimPolicy
Что происходит с данными бакета при удалении этого Bucket.
Retain— бакет и его объекты сохраняются,BucketContentsостаётся в фазеReleased.Delete— бакет и все его объекты удаляются.
Если не задано, берётся значение по умолчанию из класса
ObjectStore; если в классе значение не указано, используетсяRetain. Значение по умолчанию в схеме не задано, чтобы отличать значение, указанное пользователем, от значения, полученного из ObjectStore.Допустимые значения:
Retain,Delete -
строкаspec.versioning
Хранить каждую версию объекта вместо перезаписи.
Включить можно и позже, а выключить обратно — уже нет, если задан
objectLock: блокировка объектов построена на версиях, и оба бэкенда отказываются выключать версионирование на заблокированном бакете.По умолчанию:
SuspendedДопустимые значения:
Enabled,Suspended
-
-
объектstatusНаблюдаемое состояние бакета.
-
строкаstatus.bucketContentsNameИмя cluster-scoped
BucketContents, которым владеет этот Bucket. Имя выводит контроллер, поэтому читать его нужно отсюда. -
массив объектовstatus.conditionsПостадийные condition:
Bound,ContentsReadyи агрегатноеReady.-
строкаstatus.conditions.lastTransitionTimeВремя последнего перехода condition.
-
строкаstatus.conditions.messageЧеловекочитаемое описание текущего статуса.
Максимальная длина:
32768 -
целое числоstatus.conditions.observedGenerationЗначение
metadata.generation, для которого выставлен condition.Допустимые значения:
0 <= X -
строкаstatus.conditions.reasonМашинно-читаемая причина текущего статуса.
Длина:
1..1024Шаблон:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
строкаstatus.conditions.statusТекущий статус condition.
Допустимые значения:
True,False,Unknown -
строкаstatus.conditions.typeТип condition.
Максимальная длина:
316Шаблон:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
строкаstatus.endpointВнутрикластерный URL S3-эндпоинта бэкенда ObjectStore.
-
целое числоstatus.observedGenerationПоследнее значение
metadata.generation, обработанное контроллером. -
строкаstatus.phaseАгрегатная фаза:
Pending,InProgress,Ready,Error.Допустимые значения:
Pending,InProgress,Ready,Error
-
ObjectStore
Короткие имена: ostore
Область: Cluster
Версия: v1alpha1
Класс, который потребляет пользователь, — аналог StorageClass.
Собственного data plane у него нет: он лишь ссылается на один
объект хранилища через spec.storeRef и задаёт значения по умолчанию,
которые наследуют созданные через него бакеты.
Имя класса и есть интерфейс потребления, поэтому Bucket ссылается на
него обычной строкой: типизированная ссылка {kind, name} на
конкретное бэкенд-специфичное хранилище — дело администратора и дальше
класса не идёт.
Несколько классов могут указывать на одно и то же хранилище с разными
значениями по умолчанию — как несколько StorageClass на одном пуле.
Поля spec.type нет: бэкенд следует из storeRef.kind.
-
объектspecЖелаемое состояние класса.
-
объектspec.quotaНеобязательный потолок для бакетов этого класса.
Bucket, запросивший больше разрешённого классом, отклоняется admission-вебхуком;Bucket, в котором значение не указано, получает эти значения.-
целое числоspec.quota.maxObjectsМаксимальное число объектов в бакете.
0(по умолчанию) — без потолка.Допустимые значения:
0 <= X -
строкаspec.quota.maxSizeМаксимальный суммарный размер одного бакета в формате Kubernetes Quantity (BinarySI), например
100Gi. Не указано — потолка по размеру нет.Шаблон:
^[0-9]+(\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|k|M|G|T|P|E)?$
-
-
строкаspec.reclaimPolicy
Значение по умолчанию, которое получает
Bucketэтого класса, если не задал своё.Retain(по умолчанию) — удалённыйBucketоставляет свойBucketContentsв фазеReleased, данные сохраняются.Delete— бакет и все объекты в нём удаляются вместе сBucket.
По умолчанию:
RetainДопустимые значения:
Retain,Delete -
объектspec.storeRef
Обязательный параметр
Объект хранилища, предоставляющий data plane.
Неизменяемо после создания.
-
строкаspec.storeRef.kind
Обязательный параметр
Kind объекта хранилища, например
SeaweedFSStoreилиSDSElasticStore.Сознательно не enum: иначе каждый новый бэкенд требовал бы правки этой CRD — той самой связности, от которой избавляет разведение хранилища по Kind, — а этой схемой валидируется каждый класс в кластере. Значение проверяет admission-вебхук по списку реализованных модулем Kind, а во время работы источник истины — реестр драйверов контроллера: Kind без драйвера не обрабатывается.
Длина:
1..63 -
строкаspec.storeRef.name
Обязательный параметр
Имя объекта хранилища.Длина:
1..30Шаблон:
^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
-
-
-
объектstatusНаблюдаемое состояние класса.
-
объектstatus.backendДвижок (engine — конкретная реализация бэкенда) за указанным хранилищем, выведенный из
storeRef.kind. Это копия, избавляющая читателя класса от лишнего запроса; источник истины — объект хранилища.-
строкаstatus.backend.typeДвижок бэкенда.
Допустимые значения:
SeaweedFS,CephRGW -
строкаstatus.backend.versionЗапущенная версия бэкенда.
-
-
массив объектовstatus.conditionsПостадийные condition:
StoreResolved,StoreReadyи агрегатноеReady.-
строкаstatus.conditions.lastTransitionTimeВремя последнего перехода condition.
-
строкаstatus.conditions.messageЧеловекочитаемое описание текущего статуса.
Максимальная длина:
32768 -
целое числоstatus.conditions.observedGenerationЗначение
metadata.generation, для которого выставлен condition.Допустимые значения:
0 <= X -
строкаstatus.conditions.reasonМашинно-читаемая причина текущего статуса.
Длина:
1..1024Шаблон:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
строкаstatus.conditions.statusТекущий статус condition.
Допустимые значения:
True,False,Unknown -
строкаstatus.conditions.typeТип condition.
Максимальная длина:
316Шаблон:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
объектstatus.endpointS3-эндпоинт указанного хранилища. Это также копия значения, описанного выше.
-
строкаstatus.endpoint.externalURL S3-эндпоинта, доступный из внешней сети; заполнен только пока хранилище опубликовано (
spec.publish). Пусто — честный ответ для неопубликованного хранилища: выдавать нечего. -
строкаstatus.endpoint.internalВнутрикластерный URL S3-эндпоинта (DNS Service).
-
строкаstatus.endpoint.regionРегион S3 по умолчанию.
-
-
целое числоstatus.observedGenerationПоследнее значение
metadata.generation, обработанное контроллером. -
строкаstatus.phaseАгрегатная фаза:
Pending,InProgress,Ready,Error.Readyозначает, чтоspec.storeRefразрешается и само хранилище в состоянииReady.Допустимые значения:
Pending,InProgress,Ready,Error
-