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

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

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.caSecretRef
          объект
          Secret в неймспейсе модуля с 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.endpoint
      объект
      S3-эндпоинт, через который клиенты обращаются к хранилищу.
      • status.endpoint.external
        строка
        URL 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.tolerations
        массив объектов
        Tolerations для подов data plane (та же структура, что у spec.tolerations пода).
        • spec.placement.tolerations.effect
          строка
          Effect 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.endpoint
      объект
      S3-эндпоинт, через который клиенты обращаются к хранилищу.
      • status.endpoint.external
        строка
        URL 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.days
        целое число
        Retention по умолчанию в днях; отсутствует, если правила по умолчанию нет.
      • 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.endpoint
      объект
      S3-эндпоинт указанного хранилища. Это также копия значения, описанного выше.
      • status.endpoint.external
        строка
        URL 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