Skip to content
Open Source

建立 S3 物件儲存與儲存貯體

建立 SeaweedFS 物件儲存,讓應用程式透過 S3 連線上傳檔案並管理儲存貯體。

在專案選 新增 → 物件儲存,填入容量與第一個儲存貯體,再 檢查變更。儲存服務就緒後,用 接到服務 加入 S3 端點與金鑰,讓應用程式上傳檔案。

  • 已有專案,並有建立物件儲存的權限。替應用程式加入連線時,另需修改該服務的權限。顯示私密存取金鑰需要讀取機密的權限。
  • 管理員已安裝 SeaweedFS Operator,見管理叢集元件。
  • 叢集有可用的儲存類別與空間。
  • 準備使用相容 S3 的應用程式或用戶端。建立表單配置的端點供叢集內使用。

開啟 新增 → 物件儲存,填寫:

欄位填寫方式
名稱例如 files。最多 30 個字元,以小寫字母開頭,使用小寫字母、數字與連字號。
儲存空間檔案資料的磁碟區大小,預設 10Gi。
儲存貯體例如 uploads。可留空,之後再新增。名稱使用 3 到 63 個小寫字母、數字或連字號,開頭與結尾須為字母或數字。
儲存類別選擇檔案要放置的儲存空間,容量能否擴充依儲存類別而定。

容量欄位設定的是 volume server 的資料空間。master 與 filer 也各有 1 GiB 的持久儲存空間。

可在建立表單的 接到服務 先勾選應用程式,或等物件儲存就緒後再連接。按 檢查變更,確認名稱、容量、儲存貯體與要修改的服務,再套用。

這份變更會建立 SeaweedFS 儲存服務、供應用程式使用的身分與金鑰,以及選定的儲存貯體。

從專案打開物件儲存的 概覽,等待狀態 就緒,並確認 組成部分 與 儲存貯體。剛建立時連線金鑰可能尚未產生,可到 事件 和 日誌 查看 operator 的建立進度。

  1. 在物件儲存的 概覽 → 連線 按 接到服務。
  2. 勾選同專案的應用程式,選擇 儲存貯體,確認 變數名稱 與 會加入的變數。
  3. 按 檢查變更,核對將更新的服務並套用。
  4. 讓應用程式的 S3 用戶端讀取這些變數,再上傳並讀回一個測試檔案。

沒有名稱衝突、也沒有自行改名時,預設加入:

變數內容
S3_ENDPOINT私有 S3 HTTP 端點,例如 http://files-s3.shop.svc:8333。以頁面顯示的實際值為準。
S3_ACCESS_KEY_ID從機密讀取的存取金鑰 ID。
S3_SECRET_ACCESS_KEY從機密讀取的私密存取金鑰。
S3_REGIONus-east-1。
S3_BUCKET這次選擇的儲存貯體,未選擇時不加入。

應用程式原本已經有相同名稱的變數時,表單會提示衝突,或建議在變數名稱前面加上物件儲存的名稱。依 會加入的變數 對照應用程式實際使用的設定。加入變數會更新服務副本。

需要手動設定時,在 連線 複製 端點、區域 與 存取金鑰 ID。有權限時,按 私密存取金鑰 旁的 顯示。端點使用叢集 DNS,叢集外的電腦無法直接使用這個位址。

要新增儲存貯體,在 概覽 的 儲存貯體 按 新增儲存貯體,填入名稱,檢查變更 後套用。等待該列顯示 Ready,再讓應用程式使用它。

貯體清單會列出容量與物件數,還沒有統計時顯示 還沒統計。上傳、下載與瀏覽檔案用 S3 用戶端,這個頁面只管理儲存貯體。

刪除時,按貯體該列的刪除按鈕,閱讀確認內容,再套用。Zeabur 建立的貯體使用 Delete 回收政策,刪除時會連同檔案移除。既有貯體若使用保留政策,確認內容會說明檔案保留在儲存服務。

物件儲存頁面提供 概覽、日誌、事件 與 設定。要擴充檔案資料的空間,在 設定 → 儲存空間 填入更大的值,例如 20Gi,按 檢查變更,確認後按 擴充到 20Gi。Operator 會直接擴充磁碟,檔案都會保留。容量只能擴大,欄位下方會寫出目前的儲存類別能否擴充。

其他 operator 設定,在 設定 上方切換到 YAML 修改,再檢查變更後套用。

要把檔案留在另一個位置,從能連到私有端點的應用程式或 S3 用戶端,將貯體內容複製到另一個 S3 服務,並確認複本能讀取。檔案的複製排程與還原由該工具管理,這個頁面沒有資料庫那樣的 備份 分頁或還原按鈕。

概覽 顯示 就緒,組成部分 的 master、volume、filer、S3 都在執行,儲存貯體 每一列顯示 Ready,連線 有 存取金鑰 ID,就可以使用。用 kubectl 查看:

kubectl -n shop get seaweed files
kubectl -n shop get buckets.seaweed.seaweedfs.com
kubectl -n shop get secret files-app -o jsonpath='{.data.accessKey}' | base64 -d

files-app 機密由 SeaweedFS Operator 依 S3Credentials 建立,有 accessKey 和 secretKey。它出現之後,應用程式就能連線。從叢集內的 Pod 用 S3 用戶端列出儲存貯體,例如 aws --endpoint-url http://files-s3.shop.svc:8333 s3 ls,看得到 uploads 就表示金鑰和端點都對。

物件儲存由 SeaweedFS Operator 管理,Zeabur 只寫 operator 讀的物件,移除 Zeabur 後照樣運作。下面的 YAML 等於表單用名稱 files、容量 10Gi、儲存貯體 uploads 建立,存成 files.yaml 後用 kubectl -n shop apply -f files.yaml 套用:

apiVersion: seaweed.seaweedfs.com/v1
kind: Seaweed
metadata:
name: files
spec:
image: chrislusf/seaweedfs:4.48
volumeServerDiskCount: 1
master:
replicas: 1
persistence:
enabled: true
resources:
requests:
storage: 1Gi
podSecurityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containerSecurityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
volume:
replicas: 1
requests:
storage: 10Gi
podSecurityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containerSecurityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
filer:
replicas: 1
persistence:
enabled: true
resources:
requests:
storage: 1Gi
podSecurityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containerSecurityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
s3:
replicas: 1
port: 8333
podSecurityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containerSecurityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
---
apiVersion: seaweed.seaweedfs.com/v1
kind: S3Identity
metadata:
name: files-app
spec:
seaweedRef:
name: files
---
apiVersion: seaweed.seaweedfs.com/v1
kind: S3Credentials
metadata:
name: files-app
spec:
seaweedRef:
name: files
identityRef:
name: files-app
---
apiVersion: seaweed.seaweedfs.com/v1
kind: S3Policy
metadata:
name: files-app
spec:
seaweedRef:
name: files
statements:
- effect: Allow
actions: ["s3:*"]
resources: ["*"]
---
apiVersion: seaweed.seaweedfs.com/v1
kind: S3PolicyBinding
metadata:
name: files-app
spec:
seaweedRef:
name: files
policyRef:
name: files-app
subjects:
- kind: S3Identity
name: files-app
---
apiVersion: seaweed.seaweedfs.com/v1
kind: Bucket
metadata:
name: files-uploads
spec:
name: uploads
clusterRef:
name: files
reclaimPolicy: Delete
access:
- user: files-app
actions: [Read, Write, List, Tagging]
  • Seaweed 是儲存服務本身。S3 端點是 files-s3,連接埠 8333。
  • S3Identity、S3Credentials、S3Policy、S3PolicyBinding 建立應用程式用的帳號 files-app,並允許它存取所有儲存貯體。
  • 每個儲存貯體是一個 Bucket,名稱是 <物件儲存名稱>-<儲存貯體名稱>,spec.name 才是 S3 看到的名稱。新增儲存貯體就是再建一個 Bucket。
  • 要指定儲存類別,在 master.persistence、filer.persistence 加 storageClassName,在 volume 加 storageClassName。
  • 擴充容量:改 spec.volume.requests.storage,例如 kubectl -n shop patch seaweed files --type=merge -p '{"spec":{"volume":{"requests":{"storage":"20Gi"}}}}'。

接到服務 只是替服務加環境變數。存成 connect.yaml,用 kubectl -n shop patch deployment web --patch-file connect.yaml 套用:

spec:
template:
spec:
containers:
- name: web
env:
- name: S3_ENDPOINT
value: http://files-s3.shop.svc:8333
- name: S3_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: files-app
key: accessKey
- name: S3_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: files-app
key: secretKey
- name: S3_REGION
value: us-east-1
- name: S3_BUCKET
value: uploads

刪除儲存貯體或整個物件儲存,就是刪除這些物件:

kubectl -n shop delete buckets.seaweed.seaweedfs.com files-uploads
kubectl -n shop delete s3policybinding/files-app s3policy/files-app s3credentials/files-app s3identity/files-app
kubectl -n shop delete seaweed files

先刪儲存貯體,再刪帳號,最後刪 Seaweed,和介面的 刪除物件儲存 順序相同。Delete 回收政策的儲存貯體會連同檔案刪除。

情況接著做
新增 選單要求先安裝元件請管理員安裝 SeaweedFS Operator。
狀態一直 未知 或組成部分未就緒查看 事件、日誌 與 operator 回報,確認磁碟區和相關 Pod 能啟動。
存取金鑰 ID 空白等待 operator 建立認證資訊,再重新整理。檢查認證物件與 Pod 的事件。
私密存取金鑰無法顯示確認自己有讀取該專案機密的權限。
接到服務 找不到可選服務先建立同專案的應用程式,確認它可以修改,且不是其他工具管理的服務。
既有物件儲存無法 接到服務此動作需要能辨識的應用程式金鑰。先依實際端點和金鑰手動設定應用程式。
S3 用戶端連不到端點確認用戶端位於叢集內、使用頁面列出的端點與區域,並核對金鑰和貯體名稱。

先中斷應用程式對它的連線,或把服務改接到要保留的目的地。接著在物件儲存右上角的 更多 選 刪除物件儲存。

刪除清單包含儲存貯體、身分與金鑰相關物件、Seaweed,以及 Zeabur 找到的資料磁碟區。逐一確認後再套用。底層磁碟是否留下,取決於它的回收政策。