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

Страницы:  1

Ответить
 

Professor Seleznov


На связи Илья Шуйков, руководитель продукта «Фабрика данных» компании Диасофт.
В прошлой статье мы рассказали, зачем понадобилось строить свое объектное хранилище, и как устроен 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
-Источник
 
Loading...
Error