На связи Илья Шуйков, руководитель продукта «Фабрика данных» компании Диасофт.
В прошлой статье мы рассказали, зачем понадобилось строить свое объектное хранилище, и как устроен 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:
# Тегируем образ для вашего registrydocker tag qs3archipelago:latest your-registry.example.com/qs3archipelago:latest
# Публикуем в registrydocker 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-stopped weed-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-stopped networks: weed-net: driver: bridge volumes: weed-master-data: weed-volume-data: weed-filer-data: weed-admin-data:
Важно о volumes: Используйте named volumes (как в примере выше) для сохранения данных между перезапусками Docker. Анонимные volumes или bind mounts без явного указания пути могут привести к потере данных.
Запуск:docker-compose up -d
Что получаете:
Master UI: http://localhost:9333
Volume Server: http://localhost:8080
Filer UI: http://localhost:8888
S3 API: http://localhost:8333
Admin UI: http://localhost:8081
Шаг 2: Проверка работоспособности
# Проверяем Mastercurl http://localhost:9333/cluster/status
# Проверяем Filercurl http://localhost:8888/
# Проверяем S3curl http://localhost:8333/status
Шаг 3: Настройка S3-доступа
По умолчанию S3 Gateway требует аутентификации. Создайте ключи доступа:
Через Admin UI:
Откройте http://localhost:8081
Войдите с credentials из WEED_ADMIN_USER / WEED_ADMIN_PASSWORD
Перейдите в раздел S3 → Identities
Создайте нового пользователя с 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
# Тегируем для вашего registrydocker 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: v1 kind: Secret metadata: name: postgres-credentials namespace: qs3archipelago type: Opaque stringData: 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: v1 kind: Secret metadata: name: postgres-credentials namespace: qs3archipelago type: Opaque stringData: 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 и секретов
# Создаем namespacekubectl 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 Gateway s3: 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 UI admin: 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 Driver cosi: 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:
Откройте Admin UI (через Ingress или port-forward)
Перейдите в раздел S3 → Identities
Создайте пользователя с 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 с ключами из Шага 6aws 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/v1 kind: StorageClass metadata: name: s3archipelago-storage provisioner: seaweedfs-csi-driver parameters: collection: "default" replication: "000" reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true kubectl apply -f storageclass.yaml
Часть 3: Использование CSI Driver
После установки CSI Driver вы можете создавать PersistentVolumeClaim, которые автоматически провизионируются в S3 Архипелаге.
Пример PVC
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-app-data spec: accessModes: - ReadWriteMany storageClassName: s3archipelago-storage resources: requests: storage: 10Gi
Использование в поде
apiVersion: v1 kind: Pod metadata: name: my-app spec: 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:
# В контейнере Filerkubectl 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