Storage Pools

Настройка SeaweedFS storage пулов для tiered object storage

Storage пулы позволяют разделять SeaweedFS volume servers по типу диска. Каждый пул создает отдельный Volume StatefulSet с tag SeaweedFS diskType и соответствующий набор COSI resources (BucketClasses и BucketAccessClasses), на которые могут ссылаться buckets.

Когда использовать пулы

Используйте storage пулы, когда в кластере доступны разные уровни хранения и требуется управлять тем, какой из них будет использоваться для бакета. Например, у вас могут быть быстрые NVMe-диски для часто запрашиваемых данных и большие HDD-диски для архивного хранения.

Если все volume servers используют одно и то же хранилище, пулы не нужны: достаточно BucketClass по умолчанию.

Включение SeaweedFS для tenant

Перед настройкой пулов включите SeaweedFS для tenant:

kubectl patch -n tenant-root tenants.apps.cozystack.io root --type=merge -p '{
  "spec":{
    "seaweedfs": true
  }
}'

Дождитесь готовности SeaweedFS HelmRelease:

kubectl -n tenant-root get hr seaweedfs

Ожидаемый вывод:

NAME        AGE   READY   STATUS
seaweedfs   2m    True    Helm upgrade succeeded for release tenant-root/seaweedfs.v1 with chart seaweedfs@...

Конфигурация pool

Когда SeaweedFS запущен, пропатчите его HelmRelease, чтобы добавить storage пулы:

kubectl patch -n tenant-root helmreleases.helm.toolkit.fluxcd.io seaweedfs --type=merge -p '{
  "spec":{
    "values":{
      "volume":{
        "pools":{
          "ssd":{
            "diskType": "ssd",
            "size": "50Gi",
            "storageClass": "local-nvme"
          },
          "hdd":{
            "diskType": "hdd",
            "size": "500Gi",
            "storageClass": "local-hdd",
            "replicas": 3
          }
        }
      }
    }
  }
}'

Эквивалентный полный ресурс выглядит так:

apiVersion: apps.cozystack.io/v1alpha1
kind: SeaweedFS
metadata:
  name: seaweedfs
  namespace: tenant-example
spec:
  host: s3.example.com
  topology: Simple
  volume:
    replicas: 2
    size: 100Gi
    pools:
      ssd:
        diskType: ssd
        size: 50Gi
        storageClass: local-nvme
      hdd:
        diskType: hdd
        size: 500Gi
        storageClass: local-hdd
        replicas: 3

Параметры pool

ПараметрОбязательныйОписание
diskTypeДаTag типа диска SeaweedFS: lowercase alphanumeric, например ssd, hdd, nvme
replicasНетКоличество реплик volume server. По умолчанию volume.replicas
sizeНетРазмер PVC на реплику. По умолчанию volume.size
storageClassНетKubernetes StorageClass для PVC. По умолчанию volume.storageClass
resourcesНетЯвные CPU/memory limits. По умолчанию volume.resources
resourcesPresetНетSizing preset, когда resources не задан. По умолчанию volume.resourcesPreset

Правила именования

Имена пулов должны быть валидными DNS labels: строчные буквы, цифры и дефисы. Следующие суффиксы зарезервированы и не должны использоваться как имена пулов:

  • Имена, заканчивающиеся на -lock (зарезервировано для object-lock BucketClasses)
  • Имена, заканчивающиеся на -readonly (зарезервировано для read-only BucketAccessClasses)

COSI resources, создаваемые для каждого pool

Каждый pool автоматически создает четыре COSI resources:

РесурсШаблон имениНазначение
BucketClass{namespace}-{pool}Стандартное создание bucket
BucketClass{namespace}-{pool}-lockСоздание bucket с включенным object locking
BucketAccessClass{namespace}-{pool}Read-write credentials
BucketAccessClass{namespace}-{pool}-readonlyRead-only credentials

Например, pool с именем ssd в namespace tenant-example создает:

  • BucketClass tenant-example-ssd
  • BucketClass tenant-example-ssd-lock
  • BucketAccessClass tenant-example-ssd
  • BucketAccessClass tenant-example-ssd-readonly

MultiZone topology с пулами

В многозонной топологии пулы определяются отдельно для каждой зоны в volume.zones[zone].pools.

Параметры зоны

Каждая зона, помимо пула, принимает следующие параметры:

ПараметрОбязательныйОписание
replicasНетКоличество реплик volume server в этой зоне. По умолчанию volume.replicas
sizeНетРазмер PVC на реплику. По умолчанию volume.size
storageClassНетKubernetes StorageClass для PVC. По умолчанию volume.storageClass
dataCenterНетИмя data center в SeaweedFS. По умолчанию имя ключа zone, например zone dc1 получает dataCenter: dc1
nodeSelectorНетYAML nodeSelector для планирования pods сервера volume. По умолчанию topology.kubernetes.io/zone: <zoneName>
poolsНетсопоставление пулов хранения для этой зоны. Структура такая же, как у volume.pools

Пример

Пропатчите SeaweedFS HelmRelease, чтобы добавить пулы для каждой зоны:

kubectl patch -n tenant-example helmreleases.helm.toolkit.fluxcd.io seaweedfs --type=merge -p '{
  "spec":{
    "values":{
      "volume":{
        "zones":{
          "dc1":{
            "pools":{
              "ssd":{"diskType": "ssd", "size": "50Gi"},
              "hdd":{"diskType": "hdd", "size": "500Gi"}
            }
          },
          "dc2":{
            "pools":{
              "ssd":{"diskType": "ssd", "size": "50Gi"},
              "hdd":{"diskType": "hdd", "size": "500Gi"}
            }
          }
        }
      }
    }
  }
}'

В этом примере zone dc1 автоматически получает dataCenter: dc1 и nodeSelector: {topology.kubernetes.io/zone: dc1}.

Чтобы переопределить значения по умолчанию, задайте их явно:

volume:
  zones:
    us-east-1a:
      dataCenter: us-east
      nodeSelector:
        topology.kubernetes.io/zone: us-east-1a
        node.kubernetes.io/instance-type: storage-optimized
      pools:
        ssd:
          diskType: ssd
          size: 50Gi

Эквивалентный полный ресурс с явными настройками zones:

apiVersion: apps.cozystack.io/v1alpha1
kind: SeaweedFS
metadata:
  name: seaweedfs
  namespace: tenant-example
spec:
  host: s3.example.com
  topology: MultiZone
  volume:
    replicas: 2
    size: 100Gi
    zones:
      dc1:
        pools:
          ssd:
            diskType: ssd
            size: 50Gi
          hdd:
            diskType: hdd
            size: 500Gi
      dc2:
        pools:
          ssd:
            diskType: ssd
            size: 50Gi
          hdd:
            diskType: hdd
            size: 500Gi

Каждая комбинация зона+пул создает собственный Volume StatefulSet. В этом примере это четыре StatefulSets: seaweedfs-volume-dc1-ssd, seaweedfs-volume-dc1-hdd, seaweedfs-volume-dc2-ssd и seaweedfs-volume-dc2-hdd.

COSI resources дедуплицируются между зонами: если и dc1, и dc2 определяют pool ssd с одинаковым diskType, создается только один набор ресурсов BucketClass/BucketAccessClass.

Проверка

После развертывания SeaweedFS с пулами проверьте ресурсы:

# Проверьте, что volume server StatefulSets созданы для каждого pool
kubectl get statefulset -n tenant-example -l app.kubernetes.io/name=seaweedfs

# Проверьте BucketClasses
kubectl get bucketclass

# Проверьте BucketAccessClasses
kubectl get bucketaccessclass

Вы должны увидеть ресурсы BucketClass и BucketAccessClass для каждого имени pool.

Связанная документация

Last modified 2026-06-29: translate 1.5 (73d3d03)