把 RustFS 跑在 Kubernetes 上:官方 Helm Chart 从单机到分布式

一套对象存储要进 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:9001S3 API 默认端口 9000、控制台 9001 ,这是 chart 的 service.endpoint.port / service.console.port 默认值。

这里有几个真人操作一定要记牢的边界:

  • Chart 拒绝默认凭证 。除非你显式设了非空的 secret.rustfs.access_keysecret.rustfs.secret_key,或者用了 secret.existingSecret,否则渲染直接失败。只设其中一个 key 也会被拒------chart 不会悄悄拿 rustfsadmin/rustfsadmin 兜底。本地开发想偷懒可以开 secret.allowInsecureDefaults: true,但生产千万别碰。
  • Chart 默认 PVC 只有 256MidataStorageSize / 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

相关推荐
SimonKing1 小时前
将cURL 命令直接变成 Java 代码?用JQuick-Curl搞起来
java·后端·程序员
大牧师1 小时前
Nest.js 微服务入门教程
开发语言·javascript·后端·微服务·node.js·nest.js·nest
凤山老林2 小时前
企业级文件服务中台:Spring Boot 集成 MinIO 实现分片存储、生命周期管理与多租户隔离
java·spring boot·后端·minio·文件服务
IT_陈寒2 小时前
Redis的订阅丢失消息?你可能忘了这个配置
前端·人工智能·后端
摩尔线程2 小时前
摩尔线程开源高性能MATE算子库 释放全功能GPU算力潜能
开源·gpu算力·摩尔线程
好好沉淀2 小时前
巧用 Set 去重与复合键:高效统计分组内不重复元素的数量
java·spring boot·后端
FfHUCisI2 小时前
Golang 函数调用的瞬间:栈帧、拷贝栈与逃逸分析
开发语言·后端·golang
Csvn2 小时前
🐍 Day 12: 编码与字符集 — 告别乱码噩梦
后端·python