S3 Архипелаг: разворачиваем объектное хранилище за 15 минут

от автора

На связи Илья Шуйков, руководитель продукта «Фабрика данных» компании Диасофт.

В прошлой статье мы рассказали, зачем понадобилось строить свое объектное хранилище, и как устроен S3 Архипелаг изнутри. Теперь — практика: берем дистрибутив и разворачиваем рабочее хранилище.

Коротко о дистрибутиве

S3 Архипелаг входит в состав «Фабрики данных» (Digital Q.DataFactory) – нашего промышленного решения класса Data Lakehouse. Но использовать его можно и отдельно как самостоятельное S3-хранилище.

У S3 Архипелаг есть бесплатная лицензия на 500 ГБ – скачивайте и пользуйтесь без ограничений по функциональности. S3 API, монтирование через FUSE, Erasure Coding, tiered storage – все включено. Лицензия бессрочная – хватит для тестов, пилотов и небольших продуктивных инсталляций.

Возможности:

  • Полная совместимость с S3 API – работает с любыми S3-клиентами и SDK

  • Erasure Coding – экономия дискового пространства до 50% по сравнению с репликацией

  • Tiered storage – автоматическое перемещение данных между горячим и холодным хранилищем

  • FUSE/HDFS – монтируйте хранилище как файловую систему

  • Горизонтальное масштабирование – добавляйте узлы без остановки кластера

  • Два режима развертывания: Standalone для быстрого старта и Kubernetes для production. Времени понадобится минут 15.

 S3 Архипелаг состоит из нескольких компонентов:

  • Master – координатор кластера, управляет топологией и репликацией

  • Volume Server – хранит данные, упакованные в тома

  • Filer – слой метаданных, работает с PostgreSQL

  • S3 Gateway – S3-совместимый API для приложений

  • Admin UI – веб-интерфейс администрирования

  • SFTP Server – доступ к файлам по SFTP (опционально)

В Standalone-режиме все это запускается через Docker Compose. В Kubernetes – через Helm-чарты с полной отказоустойчивостью.

Где взять дистрибутив

Заходим на страницу продукта, жмем «Скачать бесплатно», вводим имя и почту. Через пару секунд начнется загрузка архива.

В архиве:
— Docker-образ (qs3archipelago-<version>.tar.gz)
— Helm-чарт для Kubernetes
— Документация по установке

Загрузка Docker-образа

Загрузите образ из архива в локальный Docker:

# Распаковка и загрузка образа
gunzip -c qs3archipelago-<version>.tar.gz | docker load
# Проверка загрузки
docker images | grep qs3archipelago

После загрузки образ будет доступен локально. Если вам нужно использовать его на нескольких машинах или в Kubernetes, опубликуйте образ в ваш container registry:

# Тегируем образ для вашего registry
docker tag qs3archipelago:latest your-registry.example.com/qs3archipelago:latest
# Публикуем в registry
docker push your-registry.example.com/qs3archipelago:latest

Примечание: Замените your-registry.example.com на адрес вашего container registry (Harbor, Nexus, GitLab Registry и т.д.).

Часть 1: Standalone-режим

Идеально для разработки, тестирования или небольших инсталляций до 10-20 TB.

Требования

  • 4 ядра CPU

  • 8 GB RAM

  • Любые диски (SSD предпочтительнее)

  • Docker и Docker Compose

  • PostgreSQL 15.6+

Шаг 0: Подготовка PostgreSQL

База данных метаданных — обязательный компонент. Настройте её первой.

Создайте базу данных и пользователя:

— Подключитесь к PostgreSQL как администратор

CREATE USER qs3archipelago WITH PASSWORD 'your_secure_password';
CREATE DATABASE qs3archipelago OWNER qs3archipelago;

Схема public используется по умолчанию. Если нужна другая схема, задайте ее через переменную окружения DB_SCHEMA.

Шаг 1: Docker Compose

Docker Compose — рекомендуемый способ запуска в Standalone-режиме. Каждый компонент запускается в отдельном контейнере.

Создайте файл docker-compose.yaml:

version: "3.8"services:  weed-master:    image: qs3archipelago:latest #или your-registry.example.com/qs3archipelago:latest    container_name: weed-master    user: "30002:30002"    environment:      #Команда запуска      WEED_COMMAND: master      WEED_LOG_LEVEL: "1"      # Сетевые настройки      WEED_IP: weed-master      WEED_IP_BIND: 0.0.0.0      # Настройки Master      WEED_MASTER_PORT: "9333"      WEED_MASTER_DIR: /data      WEED_MASTER_DEFAULT_REPLICATION: "000"      WEED_MASTER_VOLUME_SIZE_LIMIT_MB: "1000"      # Метрики      WEED_METRICS_PORT: "9327"      # Raft настройки      WEED_MASTER_ELECTION_TIMEOUT: "10s"      WEED_MASTER_HEARTBEAT_INTERVAL: "300ms"      # PostgreSQL (для лицензирования)      WEED_LEVELDB2_ENABLED: "false"      WEED_POSTGRES2_ENABLED: "true"      WEED_POSTGRES2_HOSTNAME: "host.docker.internal"        # или IP вашего PostgreSQL      WEED_POSTGRES2_PORT: "5432"      WEED_POSTGRES2_USERNAME: "qs3archipelago"      WEED_POSTGRES2_PASSWORD: "your_secure_password"      WEED_POSTGRES2_DATABASE: "qs3archipelago"      WEED_POSTGRES2_SSLMODE: "disable"    ports:      - "9333:9333"        # HTTP API      - "19333:19333"      # gRPC      - "9327:9327"        # Metrics    volumes:      - weed-master-data:/data    networks:      - weed-net    restart: unless-stoppedweed-volume:    image: qs3archipelago:latest    container_name: weed-volume    user: "30002:30002"    depends_on:      - weed-master    environment:      WEED_COMMAND: volume      WEED_LOG_LEVEL: "1"      WEED_IP: weed-volume      WEED_IP_BIND: 0.0.0.0      # Настройки Volume Server      WEED_VOLUME_PORT: "8080"      WEED_VOLUME_DIR: /data      WEED_VOLUME_DIR_IDX: /data      WEED_VOLUME_READ_MODE: proxy      WEED_VOLUME_MIN_FREE_SPACE_PERCENT: "1"      WEED_VOLUME_COMPACTION_MBPS: "50"      # Подключение к Master      WEED_MASTER_SERVERS: weed-master:9333      WEED_METRICS_PORT: "9327"    ports:      - "8080:8080"    volumes:      - weed-volume-data:/data    networks:      - weed-net    restart: unless-stopped  weed-filer:    image: qs3archipelago:latest    container_name: weed-filer    user: "30002:30002"    depends_on:      - weed-master      - weed-volume    environment:      WEED_COMMAND: filer      WEED_LOG_LEVEL: "1"      # Настройки Filer      WEED_IP: weed-filer      WEED_IP_BIND: 0.0.0.0      WEED_FILER_PORT: "8888"      WEED_FILER_GRPC_PORT: "18888"      WEED_FILER_DIR_LIST_LIMIT: "100000"      WEED_FILER_DEFAULT_REPLICA_PLACEMENT: "000"      WEED_FILER_BUCKETS_FOLDER: "/buckets"      WEED_FILER_QUEUES_FOLDER: "/queues"      WEED_FILER_OPTIONS_RECURSIVE_DELETE: "false"      # Подключение к Master      WEED_MASTER_SERVERS: weed-master:9333      WEED_FILER_MASTER: weed-master:9333      # PostgreSQL (бэкенд метаданных)      WEED_LEVELDB2_ENABLED: "false"      WEED_POSTGRES2_ENABLED: "true"      WEED_POSTGRES2_HOSTNAME: "host.docker.internal"      # или IP вашего PostgreSQL      WEED_POSTGRES2_PORT: "5432"      WEED_POSTGRES2_USERNAME: "qs3archipelago"      WEED_POSTGRES2_PASSWORD: "your_secure_password"      WEED_POSTGRES2_DATABASE: "qs3archipelago"      WEED_POSTGRES2_SSLMODE: "disable"      WEED_METRICS_PORT: "9327"    ports:      - "8888:8888"      - "18888:18888"    volumes:      - weed-filer-data:/data    networks:      - weed-net    restart: unless-stopped  weed-s3:    image: qs3archipelago:latest    container_name: weed-s3    user: "30002:30002"    depends_on:      - weed-filer    environment:      WEED_COMMAND: s3      WEED_LOG_LEVEL: "1"      WEED_IP: weed-s3      WEED_IP_BIND: 0.0.0.0      # Настройки S3 Gateway      WEED_S3_PORT: "8333"      WEED_S3_FILER: weed-filer:8888      WEED_METRICS_PORT: "9327"    ports:      - "8333:8333"    networks:      - weed-net    restart: unless-stopped  weed-admin:    image: qs3archipelago:latest    container_name: weed-admin    user: "30002:30002"    depends_on:      - weed-master    environment:      WEED_COMMAND: admin      WEED_LOG_LEVEL: "1"      # Настройки Admin UI      WEED_ADMIN_PORT: "8081"      WEED_ADMIN_DATA_DIR: /data      WEED_ADMIN_USER: admin      WEED_ADMIN_PASSWORD: admin    # Измените на безопасный пароль!      WEED_ADMIN_MASTERS: weed-master:9333    ports:      - "8081:8081"    volumes:      - weed-admin-data:/data    networks:      - weed-net    restart: unless-stoppednetworks:  weed-net:    driver: bridgevolumes:  weed-master-data:  weed-volume-data:  weed-filer-data:  weed-admin-data:

Важно о volumes: Используйте named volumes (как в примере выше) для сохранения данных между перезапусками Docker. Анонимные volumes или bind mounts без явного указания пути могут привести к потере данных.

Запуск:
docker-compose up -d

 Что получаете:

Шаг 2: Проверка работоспособности

# Проверяем Master
curl http://localhost:9333/cluster/status

# Проверяем Filer
curl http://localhost:8888/

# Проверяем S3
curl http://localhost:8333/status

Шаг 3: Настройка S3-доступа

По умолчанию S3 Gateway требует аутентификации. Создайте ключи доступа:

Через Admin UI:

  1. Откройте http://localhost:8081

  2. Войдите с credentials из WEED_ADMIN_USER / WEED_ADMIN_PASSWORD

  3. Перейдите в раздел S3 → Identities

  4. Создайте нового пользователя с Access Key и Secret Key

Настройка aws-cli:

aws configure
# AWS Access Key ID: your_access_key
# AWS Secret Access Key: your_secret_key
# Default region name: ru-msk-1
# Default output format: json

# Тестируем
aws s3 mb s3://test-bucket --endpoint-url http://localhost:8333
aws s3 cp /etc/hosts s3://test-bucket/hosts.txt --endpoint-url http://localhost:8333
aws s3 ls s3://test-bucket/ --endpoint-url http://localhost:8333

Масштабирование Standalone

Нужно больше места? Добавьте Volume Server в docker-compose.yaml:

yaml  weed-volume2:    image: qs3archipelago:latest    container_name: weed-volume2    user: "30002:30002"    depends_on:      - weed-master    environment:      WEED_COMMAND: volume      WEED_IP: weed-volume2      WEED_IP_BIND: 0.0.0.0      WEED_VOLUME_PORT: "8080"      WEED_VOLUME_DIR: /data      WEED_MASTER_SERVERS: weed-master:9333    volumes:      - weed-volume2-data:/data    networks:      - weed-net    restart: unless-stopped

Master автоматически подхватит новый узел.

Часть 2: Kubernetes-режим

Для production-окружений с отказоустойчивостью и автоматическим масштабированием.

Требования:

  • Kubernetes 1.24+ (проверено на Deckhouse, vanilla K8s)

  • Helm 3.x

  • PostgreSQL 15.6+ (рекомендуем Digital Q.DataBase или свой кластер)

  • StorageClass для persistent volumes

  • Container registry с загруженным образом S3 Архипелаг

Подготовка образа для Kubernetes

Перед установкой загрузите Docker-образ в ваш container registry:

# Загружаем образ из архива
gunzip -c qs3archipelago-<version>.tar.gz | docker load

# Тегируем для вашего registry
docker tag qs3archipelago:latest your-registry.example.com/qs3archipelago:latest

 # Публикуем
docker push your-registry.example.com/qs3archipelago:latest

Архитектура кластера

Типичный production-кластер:

Control Plane (3 узла для Master + Filer):

  • CPU: 8-16 ядер

  • RAM: 32-64 GB

  • Диски: 2x SSD 500 GB (RAID1 для БД метаданных)

  • Сеть: 10GbE

Data Plane (6+ узлов для Volume Servers):

  • CPU: 8-16 ядер

  • RAM: 32-64 GB

  • Диски: 8-12x HDD/SSD

  • Сеть: 10GbE (или 25GbE для высоких нагрузок)

Шаг 1: Подготовка PostgreSQL

Для автоматической инициализации БД (создание пользователя, базы, схемы, таблиц) скрипту init-db.sh нужны административные права в PostgreSQL.

Вариант A: Ручная подготовка (рекомендуется)

Создайте базу и пользователя вручную:

— Подключитесь как администратор (postgres)

CREATE USER qs3archipelago WITH PASSWORD 'your_secure_password';
CREATE DATABASE qs3archipelago OWNER qs3archipelago;

 Затем создайте Secret с credentials приложения:

apiVersion: v1kind: Secretmetadata:  name: postgres-credentials  namespace: qs3archipelagotype: OpaquestringData:  hostname: "postgres-service.postgres-namespace.svc.cluster.local"  port: "5432"  username: "qs3archipelago"  password: "your_secure_password"  database: "qs3archipelago"kubectl apply -f postgres-secret.yaml

Таблица filemeta создастся автоматически при первом запуске Filer.

Вариант B: Автоматическая инициализация

Если хотите, чтобы init-db.sh создал всё автоматически, передайте административные credentials:

Способ 1: Указать админа напрямую в WEED_POSTGRES2_USERNAME:

apiVersion: v1kind: Secretmetadata:  name: postgres-credentials  namespace: qs3archipelagotype: OpaquestringData:  hostname: "postgres-service.postgres-namespace.svc.cluster.local"  port: "5432"  # Админ PostgreSQL для DDL-операций (CREATE DATABASE, CREATE USER)  username: "postgres"  password: "postgres_admin_password"  database: "qs3archipelago"

Способ 2: Использовать отдельные переменные для админа. Если WEED_POSTGRES2_USERNAME не имеет прав на создание БД и таблиц, добавьте в extraEnvironmentVars для master и filters:

DB_ADMIN: "postgres"
DB_ADMINPASSWORD: "postgres_admin_password"

Скрипт использует DB_ADMIN / DB_ADMINPASSWORD для DDL-операций, а WEED_POSTGRES2_USERNAME – для работы с приложением

Скрипт создаст пользователя qs3archipelago, базу данных, схему и таблицу filemeta.

Шаг 2: Создание namespace и секретов

# Создаем namespace
kubectl create namespace qs3archipelago

 # Секрет для админ-панели
kubectl create secret generic qs3archipelago-admin-configuration \
  --namespace qs3archipelago \
  --from-literal=username=admin \
  --from-literal=password=your_admin_password

Шаг 3: Подготовка values.yaml

Создайте файл values.yaml для Helm:

nameOverride: "qs3archipelago"global:  createClusterRole: true  # Укажите адрес вашего container registry  registry: "your-registry.example.com"  repository: "qs3archipelago"  imageName: qs3archipelago  imagePullPolicy: IfNotPresent  serviceAccountName: "qs3archipelago"  enableSecurity: false  enableReplication: false  replicationPlacement: "000"  # Мониторинг Prometheus (опционально)  monitoring:    enabled: false    namespace: monitoring    gatewayHost: null    gatewayPort: null  extraEnvironmentVars:    # Контекстный путь для Admin UI (опционально)   # WEED_ADMIN_CONTEXT_PATH: "/qs3arc"  # Имя кластера для идентификации  WEED_CLUSTER_DEFAULT: "qs3archipelago"  # Адрес Master-сервера для внутренней коммуникации  WEED_CLUSTER_SW_MASTER: "qs3archipelago-master.qs3archipelago:9333"  # Адрес Filer для внутренней коммуникации  WEED_CLUSTER_SW_FILER: "qs3archipelago-filer-client.qs3archipelago:8888"  # Путь к директории с бакетами в Filer  WEED_FILER_BUCKETS_FOLDER: "/buckets"  # Запрет рекурсивного удаления (защита от rm -rf)  WEED_FILER_OPTIONS_RECURSIVE_DELETE: "false"  # Путь к директории очередей  WEED_FILER_QUEUES_FOLDER: "/queues"  # Отключение встроенного LevelDB (используем PostgreSQL)  WEED_LEVELDB2_ENABLED: "false"  # Включение PostgreSQL как бэкенда метаданных  WEED_POSTGRES2_ENABLED: "true"  # Режим SSL для PostgreSQL     # ВАЖНО: Для production используйте verify-full с настроенными сертификатами     # disable - трафик к БД идет открытым текстом  WEED_POSTGRES2_SSLMODE: "disable"image:  # Укажите адрес вашего container registry  registry: "your-registry.example.com"  repository: "qs3archipelago"  tag: "latest"   # Укажите конкретную версию для production# Master Server - координатор кластераmaster:  enabled: true  replicas: 3     # Для HA нужно минимум 3  updatePartition: 0  serviceAccountName: "qs3archipelago"  podSecurityContext:    enabled: true    fsGroup: 30002  data:    type: "emptyDir"   # Или persistentVolumeClaim для production  logs:    type: "emptyDir"  extraEnvironmentVars:    # Количество томов для создания при репликации    WEED_MASTER_VOLUME_GROWTH_COPY_1: '2'    WEED_MASTER_VOLUME_GROWTH_COPY_2: '2'    WEED_MASTER_VOLUME_GROWTH_COPY_3: '1'    WEED_MASTER_VOLUME_GROWTH_COPY_OTHER: '1'    # PostgreSQL credentials из секрета    WEED_POSTGRES2_USERNAME:      secretKeyRef:        name: postgres-credentials        key: username    WEED_POSTGRES2_PASSWORD:      secretKeyRef:        name: postgres-credentials        key: password    WEED_POSTGRES2_DATABASE:      secretKeyRef:        name: postgres-credentials        key: database    WEED_POSTGRES2_HOSTNAME:      secretKeyRef:        name: postgres-credentials        key: hostname    WEED_POSTGRES2_PORT:      secretKeyRef:        name: postgres-credentials        key: port# Volume Server - хранение данныхvolume:  enabled: true  replicas: 2   # Минимум 2 для отказоустойчивости  serviceAccountName: "qs3archipelago"  podManagementPolicy: Parallel  # Скорость компактификации в MB/s  compactionMBps: "80"  # Минимальный процент свободного места на диске  minFreeSpacePercent: 5  podSecurityContext:    enabled: true    fsGroup: 30002  dataDirs:    - name: data1      type: "persistentVolumeClaim"      size: 100Gi      # Укажите ваш StorageClass      # Примеры: standard, gp2, yc-network-ssd, local-path      storageClass: "local-storage-class"      annotations: {}      maxVolumes: 0  logs:    type: "persistentVolumeClaim"    size: 10Gi    storageClass: "local-storage-class"    annotations: {}  idx:    type: "persistentVolumeClaim"    size: 10Gi    storageClass: "local-storage-class"    annotations: {}# Filer - слой метаданныхfiler:  enabled: true  replicas: 2  defaultReplicaPlacement: "000"  serviceAccountName: "qs3archipelago"  podSecurityContext:    enabled: true    fsGroup: 30002  data:    type: "persistentVolumeClaim"    size: 10Gi    storageClass: "local-storage-class"    annotations: {}  logs:    type: "persistentVolumeClaim"    size: 10Gi    storageClass: "local-storage-class"    annotations: {}  extraEnvironmentVars:    WEED_MYSQL_ENABLED: "false"    WEED_LEVELDB2_ENABLED: "false"    WEED_POSTGRES2_ENABLED: "true"    WEED_POSTGRES2_SSLMODE: "disable"# Подключение к PostgreSQL через секрет  secretExtraEnvironmentVars:    WEED_POSTGRES2_USERNAME:      secretKeyRef:        name: postgres-credentials        key: username    WEED_POSTGRES2_PASSWORD:      secretKeyRef:        name: postgres-credentials        key: password    WEED_POSTGRES2_DATABASE:      secretKeyRef:        name: postgres-credentials        key: database    WEED_POSTGRES2_HOSTNAME:      secretKeyRef:        name: postgres-credentials        key: hostname    WEED_POSTGRES2_PORT:      secretKeyRef:        name: postgres-credentials        key: port# Ingress для внешнего доступа  ingress:    enabled: true    className: "istio"   # Для production используйте istio    # className: "nginx" # Альтернатива для dev/test    host: "filer.your-domain.com"    path: "/"    pathType: Prefix    annotations:      cert-manager.io/cluster-issuer: cluster-acme-issuer    tls:      - secretName: filer-tls-secret        hosts:          - "filer.your-domain.com"# S3 Gateways3:  enabled: true  replicas: 2  enableAuth: true   # Требует настройки ключей доступа (см. Шаг 6)  existingConfigSecret: null  podSecurityContext:    enabled: true    fsGroup: 30002  logs:    type: "emptyDir"  ingress:    enabled: true    className: "istio"    host: "s3.your-domain.com"    path: "/"    pathType: Prefix    annotations:      cert-manager.io/cluster-issuer: cluster-acme-issuer    tls:      - secretName: s3-tls-secret        hosts:          - "s3.your-domain.com"# SFTP Server (опционально)sftp:  enabled: false# Worker (опционально)worker:  enabled: false# Admin UIadmin:  enabled: true  replicas: 1  secret:    existingSecret: "qs3archipelago-admin-configuration"    userKey: "username"    pwKey: "password"  masters: "qs3archipelago-master.qs3archipelago:9333"  podSecurityContext:    enabled: true    fsGroup: 30002  data:    type: "persistentVolumeClaim"    size: 5Gi    storageClass: "local-storage-class"  logs:    type: "emptyDir"  ingress:    enabled: true    className: "istio"    host: "admin.your-domain.com"    path: "/"    pathType: Prefix    annotations:      cert-manager.io/cluster-issuer: cluster-acme-issuer    tls:      - secretName: admin-tls-secret        hosts:          - "admin.your-domain.com"# All-in-One режим (для dev/test)allInOne:  enabled: false# COSI Drivercosi:  enabled: false

Шаг 4: Установка через Helm

helm install qs3archipelago ./qs3archipelago \
  --namespace qs3archipelago \
  --values values.yaml \
  --create-namespace

 Шаг 5: Проверка установки

# Проверяем поды
kubectl get pods -n qs3archipelago

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

# NAME                                  READY   STATUS    RESTARTS   AGE
# qs3archipelago-master-0               1/1     Running   0          2m
# qs3archipelago-master-1               1/1     Running   0          2m
# qs3archipelago-master-2               1/1     Running   0          2m
# qs3archipelago-volume-0               1/1     Running   0          2m
# qs3archipelago-volume-1               1/1     Running   0          2m
# qs3archipelago-filer-0                1/1     Running   0          2m
# qs3archipelago-filer-1                1/1     Running   0          2m
# qs3archipelago-s3-xxxxx-xxxxx         1/1     Running   0          2m
# qs3archipelago-admin-0                1/1     Running   0          2m

 # Проверяем сервисы
kubectl get svc -n qs3archipelago

 # Логи Filer (проверяем подключение к БД)
kubectl logs -n qs3archipelago qs3archipelago-filer-0 | head -50

Шаг 6: Настройка S3-доступа

S3 Gateway настроен с enableAuth: true, поэтому нужно создать ключи доступа.

Через Admin UI:

  1. Откройте Admin UI (через Ingress или port-forward)

  2. Перейдите в раздел S3 → Identities

  3. Создайте пользователя с Access Key и Secret Key

Через командную строку:

# Port-forward к Filer
kubectl port-forward -n qs3archipelago svc/qs3archipelago-filer-client 8888:8888 &

 # Создание S3-пользователя
kubectl exec -it -n qs3archipelago qs3archipelago-filer-0 -- \
  /usr/bin/weed s3 configure \
  -filer=localhost:8888 \
  -user=s3admin \
  -access_key=your_access_key \
  -secret_key=your_secret_key \
  -actions=Admin,Read,Write,List,Tagging

Шаг 7: Тестирование S3 API

# Port-forward для локального тестирования
kubectl port-forward -n qs3archipelago svc/qs3archipelago-s3 8333:8333 &

# Настройка aws-cli с ключами из Шага 6
aws configure
# AWS Access Key ID: your_access_key
# AWS Secret Access Key: your_secret_key # Default region name: ru-msk-1
# Default output format: json

# Тестируем
aws s3 mb s3://test-bucket --endpoint-url http://localhost:8333
aws s3 cp /etc/hosts s3://test-bucket/hosts.txt --endpoint-url http://localhost:8333
aws s3 ls s3://test-bucket/ --endpoint-url http://localhost:8333

Шаг 8: Установка CSI Driver (опционально)

CSI Driver позволяет использовать S3 Архипелаг как постоянное хранилище для подов Kubernetes с динамическим выделением томов.

Важно: Устанавливайте CSI Driver только после того, как кластер S3 Архипелаг полностью развернут и работает (Шаги 4-7). CSI Driver требует доступа к Filer.

Загрузите образ CSI Driver из архива и опубликуйте в ваш registry:
gunzip -c s3archcsidriver-<version>.tar.gz | docker load
docker tag s3archcsidriver:latest your-registry.example.com/s3archcsidriver:latest
docker push your-registry.example.com/s3archcsidriver:latest

Установите через Helm:

helm install s3archipelago-csi-driver ./s3archcsidriver
  --namespace kube-system
  --set image.registry=your-registry.example.com
  --set image.repository=s3archcsidriver
  --set seaweedfs.filer=qs3archipelago-filer-client.qs3archipelago:8888

Создайте StorageClass:

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: s3archipelago-storageprovisioner: seaweedfs-csi-driverparameters:  collection: "default"  replication: "000"reclaimPolicy: DeletevolumeBindingMode: ImmediateallowVolumeExpansion: truekubectl apply -f storageclass.yaml

Часть 3: Использование CSI Driver

После установки CSI Driver вы можете создавать PersistentVolumeClaim, которые автоматически провизионируются в S3 Архипелаге.

Пример PVC

apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: my-app-dataspec:  accessModes:    - ReadWriteMany  storageClassName: s3archipelago-storage  resources:    requests:      storage: 10Gi

Использование в поде

apiVersion: v1kind: Podmetadata:  name: my-appspec:  containers:    - name: app      image: nginx      volumeMounts:        - name: data          mountPath: /data  volumes:    - name: data      persistentVolumeClaim:        claimName: my-app-data

Часть 4: Интеграция с SSO (опционально)

S3 Архипелаг поддерживает интеграцию с Keycloak для единого входа (SSO).

Настройка Keycloak

Добавьте переменные окружения в global.extraEnvironmentVars:

global:  extraEnvironmentVars:    # ... другие переменные ...    # SSO через Keycloak    SEAWEED_SSO_KEYCLOAK_ENABLED: "true"    SEAWEED_SSO_KEYCLOAK_URL: "https://keycloak.your-domain.com/auth"    SEAWEED_SSO_KEYCLOAK_REALM: "your-realm"    SEAWEED_SSO_KEYCLOAK_CLIENT_ID: "qs3archipelago"    SEAWEED_SSO_KEYCLOAK_CLIENT_SECRET: "your-client-secret"    SEAWEED_SSO_KEYCLOAK_ADMIN_URL: "https://admin.qs3archipelago.your-domain.com"

После включения SSO пользователи смогут входить в Admin UI через Keycloak.

Переменные окружения

Общие переменные

Переменная

Описание

По умолчанию

WEED_COMMAND

Команда запуска: master, volume, filer, s3, admin, server

WEED_LOG_LEVEL

Уровень логирования (0-4)

1

WEED_IP

IP-адрес или hostname сервиса

WEED_IP_BIND

IP для привязки (0.0.0.0 для всех интерфейсов)

0.0.0.0

WEED_DIR

Директория для данных (режим server)

WEED_METRICS_PORT

Порт для метрик Prometheus

9327

Переменные кластера

Переменная

Описание

По умолчанию

WEED_CLUSTER_DEFAULT

Имя кластера для идентификации

WEED_CLUSTER_SW_MASTER

Адрес Master-сервера (host:port)

WEED_CLUSTER_SW_FILER

Адрес Filer-сервера (host:port)

Переменные Master

Переменная

Описание

По умолчанию

WEED_MASTER_PORT

HTTP-порт Master

9333

WEED_MASTER_DIR

Директория для данных Master

WEED_MASTER_DEFAULT_REPLICATION

Схема репликации по умолчанию

000

WEED_MASTER_VOLUME_SIZE_LIMIT_MB

Максимальный размер тома (MB)

1000

WEED_MASTER_ELECTION_TIMEOUT

Таймаут выборов лидера

10s

WEED_MASTER_HEARTBEAT_INTERVAL

Интервал heartbeat

300ms

WEED_MASTER_SERVERS

Адреса Master-серверов

WEED_MASTER_VOLUME_GROWTH_COPY_1

Количество томов при репликации x1

2

WEED_MASTER_VOLUME_GROWTH_COPY_2

Количество томов при репликации x2

2

WEED_MASTER_VOLUME_GROWTH_COPY_3

Количество томов при репликации x3

1

WEED_MASTER_VOLUME_GROWTH_COPY_OTHER

Количество томов для других схем

1

Переменные Volume Server

Переменная

Описание

По умолчанию

WEED_VOLUME_PORT

HTTP-порт Volume Server

8080

WEED_VOLUME_DIR

Директория для данных

WEED_VOLUME_DIR_IDX

Директория для индексов

WEED_VOLUME_READ_MODE

Режим чтения: proxy или redirect

proxy

WEED_VOLUME_MIN_FREE_SPACE_PERCENT

Минимум свободного места (%)

1

WEED_VOLUME_COMPACTION_MBPS

Скорость компактификации (MB/s)

50

Переменные Filer

Переменная

Описание

По умолчанию

WEED_FILER_PORT

HTTP-порт Filer

8888

WEED_FILER_GRPC_PORT

gRPC-порт Filer

18888

WEED_FILER_DIR_LIST_LIMIT

Лимит записей в листинге

100000

WEED_FILER_DEFAULT_REPLICA_PLACEMENT

Схема репликации

000

WEED_FILER_BUCKETS_FOLDER

Путь к директории бакетов

/buckets

WEED_FILER_QUEUES_FOLDER

Путь к директории очередей

/queues

WEED_FILER_OPTIONS_RECURSIVE_DELETE

Разрешить рекурсивное удаление

false

WEED_FILER_MASTER

Адрес Master-сервера

Переменные S3 Gateway

Переменная

Описание

По умолчанию

WEED_S3_PORT

HTTP-порт S3 Gateway

8333

WEED_S3_FILER

Адрес Filer (host:port)

Переменные Admin UI

Переменная

Описание

По умолчанию

WEED_ADMIN_PORT

HTTP-порт Admin UI

8081

WEED_ADMIN_DATA_DIR

Директория для данных

WEED_ADMIN_USER

Имя пользователя

admin

WEED_ADMIN_PASSWORD

Пароль

WEED_ADMIN_MASTERS

Адреса Master-серверов

WEED_ADMIN_CONTEXT_PATH

Контекстный путь (для reverse proxy)

/

Переменные PostgreSQL

Переменная

Описание

По умолчанию

WEED_POSTGRES2_ENABLED

Включить PostgreSQL бэкенд

false

WEED_POSTGRES2_HOSTNAME

Хост PostgreSQL

WEED_POSTGRES2_PORT

Порт PostgreSQL

5432

WEED_POSTGRES2_USERNAME

Пользователь

WEED_POSTGRES2_PASSWORD

Пароль

WEED_POSTGRES2_DATABASE

Имя базы данных

WEED_POSTGRES2_SSLMODE

Режим SSL: disable, require, verify-full

disable

WEED_LEVELDB2_ENABLED

Включить LevelDB (отключите при использовании PostgreSQL)

true

Устранение неполадок

Filer не запускается

Проверьте подключение к PostgreSQL:

# В контейнере Filer
kubectl exec -it -n qs3archipelago qs3archipelago-filer-0 -- \
  psql "postgresql://user:password@host:5432/database?sslmode=disable" -c "SELECT 1"

Volume Server не регистрируется

Проверьте связность с Master:
kubectl exec -it -n qs3archipelago qs3archipelago-volume-0 -- \
  curl http://qs3archipelago-master:9333/cluster/status

S3 возвращает 403

Проверьте, что ключи доступа созданы и совпадают с настройками aws-cli.

Что дальше

  • Настройте мониторинг через Prometheus/Grafana

  • Включите репликацию для отказоустойчивости данных

  • Настройте lifecycle policies для автоматического удаления старых данных

  • Интегрируйте с вашими приложениями через S3 SDK

ссылка на оригинал статьи https://habr.com/ru/articles/1032522/