毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
0. はじめに
これまでS3互換オブジェクトストレージとしてスタンダードに使われてきたMinIOですが、開発は継続されるもののコンテナイメージが提供されなくなりました。脆弱性の修正はソースコードだけで、コンテナイメージは提供されません。
これでは手軽にHelmとかでインストールできないので、SeaweedFSを試してみました。
1. 概要
1-1. 目的
K3S上にSeaweedFSをHelmでインストールし、GitLab Runnerキャッシュ用の S3 互換オブジェクトストレージを構築する。
1-2. 環境
| 項目 | 値 |
|---|---|
| Kubernetes | k3s |
| StorageClass | local-path |
| Helmチャート | seaweedfs/seaweedfs v4.0.409 (appVersion 4.09) |
| チャートリポジトリ | https://seaweedfs.github.io/seaweedfs/helm |
1-3. 構成のポイント
| 項目 | 設定 |
|---|---|
| S3の動作方式 | 独立S3 Deployment(s3.enabled=true, filer.s3.enabled=false) |
| 認証設定 | Kubernetes Secret 経由(s3.existingConfigSecret) |
| ストレージ設定 |
volume.dataDirs[0].* で PVC を指定 |
| レプリケーション |
global.replicationPlacement="000"(レプリカなし) |
注意:
filer.s3.enabled=trueにするとFiler内蔵S3サーバーが起動し、v4.0.409 ではs3.go:308で nil pointer dereferenceが発生する。S3は独立 Deploymentで動作させること。
2. インストール手順
2-1. Helmリポジトリの追加
helm repo add seaweedfs https://seaweedfs.github.io/seaweedfs/helm
2-2. Namespaceの作成
kubectl create namespace seaweedfs
2-3. S3認証用Secretの作成
kubectl create secret generic seaweedfs-s3-secret \
-n seaweedfs \
--from-literal=seaweedfs_s3_config='{"identities":[{"name":"admin","credentials":[{"accessKey":"seaweedfs","secretKey":"ChangeMe!Pass0"}],"actions":["Admin","Read","Write"]}]}'
2-4. Helmでインストール
helm upgrade --install seaweedfs seaweedfs/seaweedfs \
-n seaweedfs \
--set master.replicas=1 \
--set volume.replicas=1 \
--set filer.replicas=1 \
--set filer.s3.enabled=false \
--set s3.enabled=true \
--set s3.enableAuth=true \
--set s3.port=9000 \
--set s3.existingConfigSecret=seaweedfs-s3-secret \
--set global.replicationPlacement="000" \
--set global.enableReplication=true \
--set volume.dataDirs[0].name=data \
--set volume.dataDirs[0].type=persistentVolumeClaim \
--set volume.dataDirs[0].storageClass=local-path \
--set volume.dataDirs[0].size=10Gi \
--set volume.dataDirs[0].maxVolumes=0 \
--set volume.resources.requests.memory=1Gi
volume.dataDirs[0].sizeはお好みで修正してください。
2-5. デプロイ確認
kubectl get pods -n seaweedfs
全Podが1/1 Runningであることを確認する。
3. 疎通確認
3-1. S3エンドポイントの確認
kubectl get svc -n seaweedfs | grep s3
3-2. AWS CLI による接続テスト
kubectl run s3-test --rm -it --restart=Never --image=amazon/aws-cli -n seaweedfs \
--env="AWS_ACCESS_KEY_ID=seaweedfs" \
--env="AWS_SECRET_ACCESS_KEY=ChangeMe!Pass0" \
-- --endpoint-url http://seaweedfs-s3.seaweedfs:8333 s3 ls --region us-east-1
エラーなく空の結果が返れば正常。
4. 接続情報
4-1. S3 接続パラメータ
| 項目 | 値 |
|---|---|
| S3 エンドポイント | http://seaweedfs-s3.seaweedfs:8333 |
| Access Key | seaweedfs |
| Secret Key | ChangeMe!Pass0 |
| Region | us-east-1 |
| S3 ポート | 9000 |
注意: SeaweedFSのデフォルトポートは、MinIOのデフォルトポート
9000ではなく8333であるため、Helm起動時に--set s3.port=9000で変更しています。