到分布式)
一套對象存儲要進(jìn) Kubernetes最省心的辦法不是手寫一堆 Deployment 和 PVC而是直接用官方維護(hù)的 Helm Chart。我去年接過一個項(xiàng)目團(tuán)隊(duì)想在已有 K8s 集群里給 AI 訓(xùn)練流水線提供 S3 兼容存儲又不想為每個節(jié)點(diǎn)手工配 systemd 服務(wù)。RustFS 官方把部署邏輯打包成了 Helm Chart源碼在倉庫helm/rustfs也發(fā)布在charts.rustfs.com一條helm install就能拉起單機(jī)或分布式實(shí)例。這篇文章把兩種模式的差異、真實(shí)的 values 寫法和幾個容易踩的邊界講清楚。1. 問題背景為什么在 K8s 里跑對象存儲很多團(tuán)隊(duì)一開始用 Docker 單機(jī)把 RustFS 跑起來驗(yàn)證功能等到要接生產(chǎn)負(fù)載第一反應(yīng)是「再開幾臺機(jī)器手動組分布式」。但 K8s 集群本來就有動態(tài) PVC、健康檢查、滾動重啟這些能力手寫靜態(tài)部署等于把這些現(xiàn)成的東西重做一遍。用 Helm Chart 的核心收益是存儲規(guī)劃、探針、生產(chǎn)加固選項(xiàng)都由 chart 的參數(shù)接管你只填憑證和容量。Chart 對鏡像版本有硬性要求——RustFS 鏡像版本需 1.0.0-alpha.69Helm 3 是前置依賴集群里還要有一個能動態(tài)供給 PVC 的 StorageClasschart 默認(rèn)用local-path對應(yīng) K3s 的常見配置。先把環(huán)境對賬好后面才不會卡在 provisioner 上。2. 兩種形態(tài)standalone 與 distributedChart 通過mode這組開關(guān)決定工作負(fù)載形態(tài)不是靠「開集群的變量」standalone一個 Pod 一個數(shù)據(jù) PVC等價于單節(jié)點(diǎn)單盤。沒有跨節(jié)點(diǎn)的糾刪碼冗余底層存儲自己保證持久性時用它最合適——開發(fā)、測試、小規(guī)模驗(yàn)證。distributed一個 StatefulSet多個 Pod 和 PVC對象在 Pod 與 PVC 之間做糾刪碼。這是「多節(jié)點(diǎn)多磁盤」形態(tài)容錯來自 EC 本身。選擇純粹是部署前的決定。文檔明確寫著一個關(guān)鍵邊界Kubernetes 不允許在線修改 StatefulSet 的volumeClaimTemplates所以drivesPerNode后面想改就得重建 StatefulSet 或者重裝。這條在規(guī)劃容量時就得想清楚別等上線兩周才發(fā)現(xiàn)盤不夠。3. 單機(jī)模式一份 values 起開發(fā)實(shí)例單機(jī)模式的 values 非常干凈。下面這份能直接helm upgrade --installmode:standalone:enabled:truedistributed:enabled:falsesecret:rustfs:access_key:你的 access keysecret_key:你的 secret keystorageclass:name:standarddataStorageSize:10GilogStorageSize:1Giingress:enabled:false把standard換成你集群里真實(shí)的 StorageClass然后安裝helm upgrade--installrustfs$RUSTFS_CHART\--namespacerustfs --create-namespace\-fstandalone-values.yaml$RUSTFS_CHART有兩種取法要么git clone https://github.com/rustfs/rustfs.git后指向./helm/rustfs要么helm repo add rustfs https://charts.rustfs.com后用rustfs/rustfs。我習(xí)慣用源碼里的 chart因?yàn)槟茼樖謌it diff看版本間改了什么。4. 分布式模式StatefulSet 糾刪碼分布式模式的 values 把 Pod 數(shù)和每 Pod 盤數(shù)顯式寫出來??倲?shù)據(jù)盤數(shù) replicaCount * drivesPerNodemode:standalone:enabled:falsedistributed:enabled:truereplicaCount:4drivesPerNode:2secret:rustfs:access_key:你的 access keysecret_key:你的 secret keystorageclass:name:standarddataStorageSize:100GilogStorageSize:1Giingress:enabled:false上面這份會創(chuàng)建 4 個 Pod、8 個數(shù)據(jù) PVC4×2。裝之前確認(rèn)集群能調(diào)度下所有 Pod 并供給所有 PVC再執(zhí)行和單機(jī)相同的helm upgrade --install命令。分布式模式默認(rèn)replicaCount: 4每個 Pod 拿 4 個 PVC16 盤總計或者replicaCount: 16讓每個 Pod 只拿 1 個 PVC——兩種風(fēng)格都在 chart 支持范圍內(nèi)按你節(jié)點(diǎn)的盤位來選。5. 驗(yàn)證、訪問與安全邊界裝完先看狀態(tài)。分布式是 StatefulSet單機(jī)是 Deployment命令略有差別kubectl-nrustfs get pods,pvc,services kubectl-nrustfs rollout status statefulset/rustfs# 分布式kubectl-nrustfs rollout status deployment/rustfs# 單機(jī)kubectl-nrustfs port-forward svc/rustfs9000:90009001:9001轉(zhuǎn)發(fā)后 S3 端點(diǎn)就是http://localhost:9000控制臺在http://localhost:9001。S3 API 默認(rèn)端口 9000、控制臺 9001這是 chart 的service.endpoint.port/service.console.port默認(rèn)值。這里有幾個真人操作一定要記牢的邊界Chart 拒絕默認(rèn)憑證。除非你顯式設(shè)了非空的secret.rustfs.access_key和secret.rustfs.secret_key或者用了secret.existingSecret否則渲染直接失敗。只設(shè)其中一個 key 也會被拒——chart 不會悄悄拿rustfsadmin/rustfsadmin兜底。本地開發(fā)想偷懶可以開secret.allowInsecureDefaults: true但生產(chǎn)千萬別碰。Chart 默認(rèn) PVC 只有 256MidataStorageSize/logStorageSize默認(rèn)都是 256Mi文檔原話是「僅供基本評估」。生產(chǎn)必須顯式把dataStorageSize設(shè)成真實(shí)容量比如上面的 100Gi。鏡像版本別低于1.0.0-alpha.69否則 chart 根本不讓裝。6. 總結(jié)與下一步把 RustFS 跑進(jìn) K8s本質(zhì)是填對三樣?xùn)|西憑證拒絕默認(rèn)、容量顯式設(shè)大、模式standalone 還是 distributed且想清楚再定因?yàn)?StatefulSet 模板不能在線改。剩下的交給 chart 的探針和滾動重啟。下一步可以直接kubectl port-forward后用mc或 AWS SDK 連localhost:9000做功能驗(yàn)證要對外暴露就把ingress.enabled打開并設(shè)ingress.classNamenginx 或 traefik。等分布式實(shí)例跑穩(wěn)再考慮用官方文檔里的「服務(wù)器池擴(kuò)容」把容量做上去。以下是深入學(xué)習(xí) RustFS 的推薦資源RustFS官方文檔 RustFS 官方文檔- 提供架構(gòu)、安裝指南和 API 參考。GitHub 倉庫 GitHub 倉庫 - 獲取源代碼、提交問題或貢獻(xiàn)代碼。社區(qū)支持 GitHub Discussions- 與開發(fā)者交流經(jīng)驗(yàn)和解決方案。意見反饋GitHub Issues