
部署对象存储,docker run 一把梭确实能跑起来,但那只是本地试用的起点。真正要扛生产流量,你得先决定拓扑:单盘、多盘还是多节点,再把默认凭证改掉,想清楚控制台和 TLS,最后才决定用容器、二进制还是 Operator 去落地。
网上已经有一批"一条命令装进服务器"的极简教程,它们适合五分钟尝鲜,但通常停在 SNSD(单节点单磁盘)那一步,不谈冗余、不谈凭证、不谈多节点。这篇把官方支持的三种部署路径一次讲清,并给出选型建议,让你按自己的场景落到生产。
先决定拓扑,再选部署方式
官方文档把部署模式分成三档,复杂度递增、容错递增:
| 模式 | 节点 | 磁盘 | 容错能力 | 典型用途 |
|---|---|---|---|---|
| SNSD(单节点单磁盘) | 1 | 1 | 无,依赖备份 | 开发、测试、低密度非关键业务 |
| SNMD(单节点多磁盘) | 1 | 多块 | 节点内容忍 M 块校验盘故障 | 单台服务器上的中等规模业务 |
| MNMD(多节点多磁盘) | 4+ | 每节点多块 | 跨服务器纠删码,磁盘级 + 节点级容错 | 生产工作负载 |
一句话判断:快速安装脚本和单条 docker run 默认就是 SNSD,没有任何冗余,只能用于评估和开发。要上生产,至少走 SNMD(单台机器多盘),或者 MNMD(4 台以上机器做跨节点纠删码)。下面三种路径都会标注它默认落在哪一档、怎么往生产演进。
MNMD 还有一个容易忽略的硬约束:官方要求安全启动分布式集群至少 4 台服务器、每台至少 1 块磁盘;默认纠删码布局是 12 数据分片 + 4 校验分片(对应官方 4 节点 × 4 盘共 16 块的示例)。规划磁盘数量时,必须覆盖所选纠删码布局的分片数,盘数不够,布局本身就立不起来。具体分片规则以官方纠删码文档为准。
SNMD 的风险边界要认清:它只有磁盘级容错,整机挂掉,该节点的数据整体不可用;节点级容错只有 MNMD 才有。 单台服务器扛生产,等于把可用性押在这一台机器上,这是选 SNMD 前必须接受的取舍。

路径一 · Docker:最快上手,适合本地评估和容器化部署
Docker 是官方第一种推荐方式,单节点 evaluation 和托管式容器部署都适用。
拉镜像、建持久卷、起容器:
bash
docker pull rustfs/rustfs:latest
docker volume create rustfs-data
docker run -d \
--name rustfs \
--restart unless-stopped \
-p 9000:9000 \
-p 9001:9001 \
-v rustfs-data:/data \
-e RUSTFS_ACCESS_KEY="<your-access-key>" \
-e RUSTFS_SECRET_KEY="<your-secret-key>" \
-e RUSTFS_ADDRESS=":9000" \
-e RUSTFS_CONSOLE_ADDRESS=":9001" \
-e RUSTFS_CONSOLE_ENABLE=true \
-e RUSTFS_OBS_LOGGER_LEVEL=error \
-e RUSTFS_OBS_LOG_DIRECTORY="/var/log/rustfs/" \
rustfs/rustfs:latest \
/data
端口约定很固定:9000 是 S3 API,9001 是控制台(Console)。环境变量和命令行参数等价,同时存在时命令行参数优先。
两个实战要点:
- 凭证必须改。 把 RustFS 接入网络前,务必给
RUSTFS_ACCESS_KEY/RUSTFS_SECRET_KEY设唯一值,两个都不能用众所周知的rustfsadmin。如果容器启动时没设,停掉容器、带上这两个-e重新创建即可,数据卷rustfs-data不受影响。 - 挂主机目录的权限坑。命名卷不用额外处理;但如果你用
-v /path/on/host:/data挂主机目录,容器是以非 root 用户rustfs(uid10001)运行的,主机目录所有者的 UID 必须是10001,否则直接permission denied。正确做法是挂载前chown -R 10001:10001 /path/to/host_directory。
验证部署很简单:
bash
docker ps --filter name=rustfs
curl --fail http://localhost:9000/health
S3 API 在 http://localhost:9000,控制台在 http://localhost:9001,用上面设的密钥登录。
往多节点走的话,先搞清楚卡点在哪:默认桥接网络下,容器的 IP 只有单机内部可达,其他服务器上的节点根本访问不到它。最简单的方案是官方推荐的 --network host,让容器直接用主机网络;走自定义 overlay 等跨主机网络也可以,但要自己解决节点主机名解析和端口互通。无论哪种网络方案,都要显式声明存储卷拓扑:
bash
docker run -d \
--name rustfs \
--network host \
-v /mnt/rustfs/data:/data \
-e RUSTFS_ACCESS_KEY="<your-access-key>" \
-e RUSTFS_SECRET_KEY="<your-secret-key>" \
-e RUSTFS_ADDRESS=":9000" \
-e RUSTFS_CONSOLE_ADDRESS=":9001" \
-e RUSTFS_CONSOLE_ENABLE=true \
-e RUSTFS_VOLUMES="http://node{1...4}:9000/data/rustfs{0...3}" \
rustfs/rustfs:latest
每个节点的 /etc/hosts 里配上 node1~node4 的 IP。这就是 MNMD 的 Docker 形态。
顺带解释一下 RUSTFS_VOLUMES 的展开语法,不熟悉的人第一眼容易懵:node{1...4} 和 rustfs{0...3} 是官方的序列展开写法,等价于把 node1node4 和 rustfs0rustfs3 逐个组合,即 4 节点 × 每节点 4 个存储路径,共 16 份。改节点数或盘数时按这个规则同步改数字区间即可。
路径二 · 二进制一键脚本:最适合裸金属 Linux 单 / 多磁盘
如果你的目标是一台正经 Linux 服务器(而不是容器平台),官方的一键脚本最省事,会帮你装二进制、注册 systemd、直接起服务。
bash
curl -O https://rustfs.com/install_rustfs.sh && bash install_rustfs.sh
脚本把二进制装到 /usr/local/bin/rustfs,注册 rustfs systemd 服务并启动。默认数据目录 /data/rustfs0,同样监听 9000(S3 API)和 9001(控制台)。装完会提示你去改默认凭证,配置文件在 /etc/default/rustfs:
bash
RUSTFS_ACCESS_KEY=<your-access-key>
RUSTFS_SECRET_KEY=<your-secret-key> # 建议: openssl rand -base64 24
sudo systemctl restart rustfs
sudo systemctl status rustfs --no-pager # 应显示 active (running)
凭证有个细节值得记:访问密钥(ACCESS_KEY)只用大写字母和数字,不要直接把 Base64 原样塞进去,Base64 可能含 /,会和 AWS Signature V4 的凭证作用域分隔符冲突。密钥(SECRET_KEY)用 openssl rand -base64 24 生成没问题。
想用命令行验证链路,官方配套了 rc 这个 CLI(等价于 mc 的 RustFS 原生工具):
bash
rc alias set rustfs http://<server-ip>:9000 <your-access-key> <your-secret-key>
rc bucket create rustfs/my-bucket
rc object copy /path/to/hello.txt rustfs/my-bucket/hello.txt
rc object list rustfs/my-bucket
默认装出来的只是 SNSD,一键脚本只完成基础安装,不会自动生成多盘、多节点配置。要上 SNMD(单台多盘)或 MNMD(多节点),需要按官方 Linux 安装指南手动改 systemd 启动参数和 RUSTFS_VOLUMES,多节点还要保证各节点主机名连续、凭证配置完全一致。
上多节点前,官方 Linux 前提条件页还有几条硬性要求,漏了会直接翻车:
- 内存:测试环境至少 2 GB,生产环境至少 128 GB(官方给的数字)。
- 防火墙:放行 9000(S3 API)和 9001(控制台)两个端口,集群内部互通同样走这两个端口;同一部署中所有节点必须使用相同的监听端口。
- 时钟同步:所有节点必须保持时钟同步,签名验证、版本控制、分布式锁都依赖时间戳,漂移超过安全阈值 RustFS 会拒绝启动。官方建议用 chrony,生产环境把节点间漂移控制在 1 秒以内。
磁盘侧官方的建议也很明确:用 JBOD 直通 + XFS 文件系统(NFS 明确禁用,硬件 RAID 会成为性能瓶颈);如果预期是小对象密集场景,格式化 XFS 时加 -i size=512 增大 inode 密度,官方特别提到这对大量小对象的元数据场景有利。
路径三 · Kubernetes Operator:云原生、多租户、声明式
容器编排场景下,Operator 是官方主推方式,它把"租户、存储池、生命周期、STS 集成"统一用 CRD 管起来,从开发到生产是同一套 S3 底座。
前提:Kubernetes v1.30+、Helm v3.0+、集群有动态 PVC 的 StorageClass。
bash
git clone https://github.com/rustfs/operator.git
cd operator
helm upgrade --install rustfs-operator deploy/rustfs-operator/ \
--namespace rustfs-system \
--create-namespace
验证装好没:
bash
kubectl -n rustfs-system get pods,services
kubectl get crd tenants.rustfs.com
kubectl -n rustfs-system rollout status deployment/rustfs-operator
kubectl -n rustfs-system rollout status deployment/rustfs-operator-console
Operator 控制台监听 9090(注意和单机版的 9001 不是一回事)。本地看控制台:
bash
kubectl -n rustfs-system create token rustfs-operator-console --duration=24h
kubectl -n rustfs-system port-forward svc/rustfs-operator-console 19090:9090
真正创建存储集群是声明式 Tenant 对象。下面这份 CR 会拉起一个 4 节点、每节点 4 盘的 MNMD 租户(共 16 块盘):
yaml
apiVersion: rustfs.com/v1alpha1
kind: Tenant
metadata:
name: svt-minimal
namespace: tenant-svt
spec:
image: rustfs/rustfs:1.0.0 # 生产固定明确版本,勿用 latest
pools:
- name: dev-pool
servers: 4
persistence:
volumesPerServer: 4
bash
kubectl apply -f tenant.yaml
kubectl -n tenant-svt get tenant
kubectl -n tenant-svt get pods
Operator 比手敲 StatefulSet 强的地方在于:租户就绪后才开始建策略/用户/桶,进度写在 status.provisioning;STS 端点走显式的 POST /sts/{tenantNamespace}/{tenantName} 租户路由,配合 Kubernetes TokenReview 做凭证发放。对多租户或要接 CI/CD 的团队,这套声明式管理比脚本省心很多。
两个生产注意事项:一是镜像引用要固定明确版本,官方文档明确要求生产 Tenant 使用"不可变镜像引用",用 latest 意味着 Pod 重建时可能拉到非预期的新版本;二是 Tenant CRD 目前是 v1alpha1 API 版本,还处于 alpha 阶段,升级 Operator 版本时要留意官方的 CRD 变更与升级说明。再补两句实战提醒:Operator 管的是租户生命周期,不管数据保护,租户数据的备份策略要自己建,不能因为用了 Operator 就默认有兜底;另外 Operator 的存储前提是集群有动态预配 PVC 的 StorageClass,裸金属 / 本地盘环境需要先自建 local PV 类型的 StorageClass,这是 K8s 侧的前置工作,不是 Operator 替你做的。

三条路径怎么选
| 路径 | 适用场景 | 复杂度 | 默认拓扑 | 上生产怎么走 |
|---|---|---|---|---|
| Docker | 本地评估、容器化托管部署 | 低 | SNSD | 多节点需 --network host + 手动声明 RUSTFS_VOLUMES |
| 二进制脚本 | 裸金属 Linux 单 / 多磁盘 | 低 | SNSD | 按 SNMD / MNMD 指南配数据路径与启动参数 |
| K8s Operator | 云原生、多租户、CI/CD | 中 | 声明式 Tenant | 直接改 Tenant CR 的 servers / volumesPerServer |
我的经验法则:个人尝鲜或 CI 里起个临时实例,Docker 最顺手;一台独立 Linux 服务器要长期跑,二进制脚本 + systemd 最稳;要是环境本身就是 K8s,且未来可能多业务共用存储,Operator 是唯一值得投入的路径,因为租户生命周期是它原生管的。
装完必做三件事
不管走哪条路,这三步别省:
- 改默认凭证。 任何路径都别把
rustfsadmin/rustfsadmin留着。Docker 用-e传,二进制改/etc/default/rustfs,Operator 在 Tenant 的credsSecret里配。 - 开 TLS。 对外暴露的端口生产必须加密。证书文件必须命名为
rustfs_cert.pem和rustfs_key.pem,一起放进RUSTFS_TLS_PATH指向的目录;Docker 场景下这两个文件还要归rustfs用户所有,否则实例读不了证书、TLS 直接配失败(典型现象是实例日志报权限错误、9001 控制台打不开 HTTPS)。证书过期则是另一类现象:客户端 TLS 握手直接失败,服务端日志反而可能没动静,先查证书有效期。Operator 场景用 cert-manager 或 TLS Secret 给控制台签证书。完整步骤见官方 TLS 配置页。 - 接客户端验证链路。用
rc(rc bucket create+rc object copy)或任意 AWS SDK /mc建个桶、传个对象,确认控制台 9001(或 Operator 9090)能看见、S3 API 9000 能读写。链路通了,部署才算真正完成。
出问题先看哪
部署完成后如果 health 检查或控制台不对劲,按部署模式查这几处:
- health 端点 :
curl http://localhost:9000/health不通,先确认进程本身在跑,systemctl status rustfs(二进制)或docker ps --filter name=rustfs(容器)。 - 二进制 / systemd 部署:日志固定在
/var/log/rustfs/rustfs.log和rustfs-err.log(systemd 单元的 StandardOutput / StandardError 指向的路径),tail -f /var/log/rustfs/rustfs*.log直接跟踪。 - Docker 部署:
docker logs rustfs看标准输出,或查挂载出来的RUSTFS_OBS_LOG_DIRECTORY目录。 - 多节点集群起不来 :先查三件事:时钟是否同步(漂移超阈值会拒绝启动)、各节点凭证与
RUSTFS_VOLUMES是否完全一致、主机名解析是否连续。
部署只是第一步。监控与指标告警、磁盘/节点故障后的替换运维、元数据与租户备份、二进制/Docker/Operator 三种模式的安全升级、内存与 CPU 资源规划(海量小对象场景尤其要提前估),都是上生产前要补齐的课题,后面单独展开。命令和拓扑细节以官方文档为准:
- 容器部署:
docs.rustfs.com/zh/installation/container/docker - Linux 安装:
docs.rustfs.com/zh/installation/linux - 云原生 Operator:
docs.rustfs.com/zh/installation/cloud-native/operator/installation