

一套对象存储要进 Kubernetes,最省心的办法不是手写一堆 Deployment 和 PVC,而是直接用官方维护的 Helm Chart。我去年接过一个项目,团队想在已有 K8s 集群里给 AI 训练流水线提供 S3 兼容存储,又不想为每个节点手工配 systemd 服务。RustFS 官方把部署逻辑打包成了 Helm Chart(源码在仓库 helm/rustfs,也发布在 charts.rustfs.com),一条 helm install 就能拉起单机或分布式实例。这篇文章把两种模式的差异、真实的 values 写法和几个容易踩的边界讲清楚。
1. 问题背景:为什么在 K8s 里跑对象存储
很多团队一开始用 Docker 单机把 RustFS 跑起来验证功能,等到要接生产负载,第一反应是「再开几台机器手动组分布式」。但 K8s 集群本来就有动态 PVC、健康检查、滚动重启这些能力,手写静态部署等于把这些现成的东西重做一遍。
用 Helm Chart 的核心收益是:存储规划、探针、生产加固选项都由 chart 的参数接管,你只填凭证和容量。Chart 对镜像版本有硬性要求------RustFS 镜像版本需 >= 1.0.0-alpha.69 ,Helm 3 是前置依赖,集群里还要有一个能动态供给 PVC 的 StorageClass(chart 默认用 local-path,对应 K3s 的常见配置)。先把环境对账好,后面才不会卡在 provisioner 上。
2. 两种形态:standalone 与 distributed
Chart 通过 mode 这组开关决定工作负载形态,不是靠「开集群的变量」:
- standalone:一个 Pod + 一个数据 PVC,等价于单节点单盘。没有跨节点的纠删码冗余,底层存储自己保证持久性时用它最合适------开发、测试、小规模验证。
- distributed:一个 StatefulSet,多个 Pod 和 PVC,对象在 Pod 与 PVC 之间做纠删码。这是「多节点多磁盘」形态,容错来自 EC 本身。
选择纯粹是部署前的决定。文档明确写着一个关键边界:Kubernetes 不允许在线修改 StatefulSet 的 volumeClaimTemplates ,所以 drivesPerNode 后面想改,就得重建 StatefulSet 或者重装。这条在规划容量时就得想清楚,别等上线两周才发现盘不够。

3. 单机模式:一份 values 起开发实例
单机模式的 values 非常干净。下面这份能直接 helm upgrade --install:
yaml
mode:
standalone:
enabled: true
distributed:
enabled: false
secret:
rustfs:
access_key: "<你的 access key>"
secret_key: "<你的 secret key>"
storageclass:
name: standard
dataStorageSize: 10Gi
logStorageSize: 1Gi
ingress:
enabled: false
把 standard 换成你集群里真实的 StorageClass,然后安装:
bash
helm upgrade --install rustfs "$RUSTFS_CHART" \
--namespace rustfs --create-namespace \
-f standalone-values.yaml
$RUSTFS_CHART 有两种取法:要么 git clone https://github.com/rustfs/rustfs.git 后指向 ./helm/rustfs,要么 helm repo add rustfs https://charts.rustfs.com 后用 rustfs/rustfs。我习惯用源码里的 chart,因为能顺手 git diff 看版本间改了什么。
4. 分布式模式:StatefulSet + 纠删码
分布式模式的 values 把 Pod 数和每 Pod 盘数显式写出来。总数据盘数 = replicaCount * drivesPerNode:
yaml
mode:
standalone:
enabled: false
distributed:
enabled: true
replicaCount: 4
drivesPerNode: 2
secret:
rustfs:
access_key: "<你的 access key>"
secret_key: "<你的 secret key>"
storageclass:
name: standard
dataStorageSize: 100Gi
logStorageSize: 1Gi
ingress:
enabled: false
上面这份会创建 4 个 Pod、8 个数据 PVC(4×2)。装之前确认集群能调度下所有 Pod 并供给所有 PVC,再执行和单机相同的 helm upgrade --install 命令。分布式模式默认 replicaCount: 4,每个 Pod 拿 4 个 PVC(16 盘总计),或者 replicaCount: 16 让每个 Pod 只拿 1 个 PVC------两种风格都在 chart 支持范围内,按你节点的盘位来选。
5. 验证、访问与安全边界
装完先看状态。分布式是 StatefulSet,单机是 Deployment,命令略有差别:
bash
kubectl -n rustfs get pods,pvc,services
kubectl -n rustfs rollout status statefulset/rustfs # 分布式
kubectl -n rustfs rollout status deployment/rustfs # 单机
kubectl -n rustfs port-forward svc/rustfs 9000:9000 9001:9001
转发后 S3 端点就是 http://localhost:9000,控制台在 http://localhost:9001。S3 API 默认端口 9000、控制台 9001 ,这是 chart 的 service.endpoint.port / service.console.port 默认值。
这里有几个真人操作一定要记牢的边界:
- Chart 拒绝默认凭证 。除非你显式设了非空的
secret.rustfs.access_key和secret.rustfs.secret_key,或者用了secret.existingSecret,否则渲染直接失败。只设其中一个 key 也会被拒------chart 不会悄悄拿rustfsadmin/rustfsadmin兜底。本地开发想偷懒可以开secret.allowInsecureDefaults: true,但生产千万别碰。 - Chart 默认 PVC 只有 256Mi (
dataStorageSize/logStorageSize默认都是 256Mi),文档原话是「仅供基本评估」。生产必须显式把dataStorageSize设成真实容量,比如上面的 100Gi。 - 镜像版本别低于
1.0.0-alpha.69,否则 chart 根本不让装。

6. 总结与下一步
把 RustFS 跑进 K8s,本质是填对三样东西:凭证(拒绝默认)、容量(显式设大)、模式(standalone 还是 distributed,且想清楚再定,因为 StatefulSet 模板不能在线改)。剩下的交给 chart 的探针和滚动重启。
下一步可以直接 kubectl port-forward 后用 mc 或 AWS SDK 连 localhost:9000 做功能验证;要对外暴露就把 ingress.enabled 打开并设 ingress.className(nginx 或 traefik)。等分布式实例跑稳,再考虑用官方文档里的「服务器池扩容」把容量做上去。
以下是深入学习 RustFS 的推荐资源:RustFS
官方文档: RustFS 官方文档- 提供架构、安装指南和 API 参考。
GitHub 仓库: GitHub 仓库 - 获取源代码、提交问题或贡献代码。
社区支持: GitHub Discussions- 与开发者交流经验和解决方案。
意见反馈:GitHub Issues