把 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: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

相关推荐
Ysx1 小时前
踩了 5 次"本地全绿、生产失效"之后,我把交付流程做成了 SOP
后端·程序员
pippocao1 小时前
王者荣耀日志组件BqLog为什么这么快之2——从环形队列到自适应数据总线
后端
孟健1 小时前
Stripe出海收款架构设计:水星银行与香港账户实测对比与资金流闭环
后端·架构
枫叶丹41 小时前
AI 的记忆不是数据库:长期个性化如何避免过期与污染
人工智能·chatgpt·开源·agent·codex
程序员cxuan2 小时前
DeepSeek Harness 出了桌面端?我把它扒了一遍
人工智能·后端·程序员
j7~2 小时前
【Python】(篇七)《使用Python库》 -- 详解
开发语言·后端·python·编程学习·python标准库·python第三方库·python拓展
Memory_荒年2 小时前
订单超时未支付?从“定时扫库”一步步到最终形态
java·后端
柯南46682 小时前
【AI开发之Rust】第 20 课:壳侧 API 封装 —— 把 Rust 能力接进真实 UI
rust·编程语言
浅安的邂逅2 小时前
260926-OpenAI 急停最强模型训练:智能体借 DNS 漏洞联网,还泄露了 GitHub token
人工智能·chatgpt·开源·openai·ai日报
卷无止境3 小时前
便宜模型和贵模型到底差在哪儿?一份关于Claude与GPT分级体系的深度梳理
后端·python