На связи Илья Шуйков, руководитель продукта «Фабрика данных» компании Диасофт.
В прошлой статье мы рассказали, зачем понадобилось строить свое объектное хранилище, и как устроен 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-.tar.gz)
- Helm-чарт для Kubernetes
- Документация по установке
Загрузка Docker-образа
Загрузите образ из архива в локальный Docker:
# Распаковка и загрузка образа
gunzip -c qs3archipelago-.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-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
Что получаете:
Шаг 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:
- Откройте 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:8333aws s3 cp /etc/hosts s3://test-bucket/hosts.txt --endpoint-url http://localhost:8333aws 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-.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: 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 и секретов
# Создаем 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 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 к Filerkubectl 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:8333aws s3 cp /etc/hosts s3://test-bucket/hosts.txt --endpoint-url http://localhost:8333aws 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-.tar.gz | docker loaddocker tag s3archcsidriver:latest your-registry.example.com/s3archcsidriver:latestdocker 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:
# В контейнере 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
-Источник