文章目录
-
- RustFS介绍
- RustFS部署
-
- 部署规划
- 磁盘准备
- local-path部署
- [获取rustfs chart包](#获取rustfs chart包)
- 添加rustfs节点标签
- 证书准备
- 自定义rustfs配置
- 正式部署rustfs
- 确认验证
RustFS介绍
Rustfs概述
RustFS是使用目前全球最流行的、内存安全的Rust语言开发的 高性能 , 分布式对象存储软件。RustFS 同时具备简单、高效的特点,也是一种高效、开源、自由、可以进行本地私有云部署的对象存储解决方案。RustFS 100% 兼容 S3 协议,使用 Apache2 许可证发行的开源软件。RustFS 使用目前全世界最受欢迎的、内存安全的语言 Rust 语言编写。 它是由全世界优秀的工程师参与并贡献的一款对于商用友好的分布式对象存储产品,RustFS 可以平替非常多非友好开源协议的对象存储产品。
提示 :更多Rustfs参考: RustFS 简介 。
Rustfs部署模式
RustFS 支持多种部署模式以及部署类型,主要如下:
- 在 Linux快速安装
- 在 Linux 上安装 RustFS
- 在 Docker 容器中安装 RustFS
- 在 Windows 上安装 RustFS
- 在 macOS 上安装 RustFS
- 在 Kubernetes 上安装 RustFS
本文以在 Kubernetes 中部署 RustFS 。
RustFS部署
部署规划
Kubernetes版本:Kubernetes 1.34.3
节点:worker01/02/03的每个sdc充当存储设备提供。
RustFS helm 图表支持独立模式和分布式模式。对于独立模式,只有一个 pod 和一个 pvc;对于分布式模式,有两种样式:4 个 pod 和 16 个 pvc(每个 pod 有 4 个 pvc),16 个 pod 和 16 个 pvc(每个 pod 有 1 个 pvc)。
根据实际情况选择 分布式模式,4 个 Pod 16 个 pvc。
可以通过指定参数 mode 和 replicaCount 来安装不同的模式和样式。
本实验基于4 个 Pod ,每 Pod 4个 pvc 模式,因此将master03也规划为存储节点。
磁盘准备
给master03和每个worker节点专门提供数据盘的设备格式化及挂载,对于如下需要创建的local-path默认使用本地卷位置为:/opt/local-path-provisioner,直接使用该挂载点。
使用如下脚本在所有worker节点挂载。
- 准备环境变量
shell
[root@master01 ~]# mkdir rustfs
[root@master01 ~]# cd rustfs/
[root@master01 rustfs]# cat > rustfsnode.sh <<'EOF'
#!/bin/bash
#***************************************************************#
# ScriptName: rustfsnode.sh
# Author: xhy
# Create Date: 2025-12-27 01:44
# Modify Author: xhy
# Modify Date: 2025-12-27 12:43
# Version: v1
#***************************************************************#
# 集群 RUSTFSNODE 机器 IP 数组
export RUSTFSNODE_IPS=(172.24.8.13 172.24.8.14 172.24.8.15 172.24.8.16)
# 集群 NODE IP 对应的主机名数组
export RUSTFSNODE_NAMES=(master03 worker01 worker02 worker03)
EOF
- 准备挂载脚本
shell
[root@master01 rustfs]# cat > automountdev.sh <<'EOF'
#!/bin/bash
#***************************************************************#
# ScriptName: automountdev.sh
# Author: xhy
# Create Date: 2025-12-18 23:15
# Modify Author: xhy
# Modify Date: 2025-12-27 01:36
# Version: v1
#***************************************************************#
# 定义设备路径和挂载点
DEVICE="/dev/sdc"
MOUNT_POINT="/opt/local-path-provisioner"
# 检查设备是否存在
if [ ! -e "$DEVICE" ]; then
echo "错误:设备 $DEVICE 不存在!"
exit 1
fi
# 检查是否已格式化
if ! blkid "$DEVICE" | grep -q 'TYPE="xfs"'; then
echo "格式化 $DEVICE 为 XFS 文件系统..."
mkfs.xfs -f "$DEVICE"
if [ $? -ne 0 ]; then
echo "格式化失败!"
exit 1
fi
echo "格式化完成"
fi
# 获取 UUID
UUID=$(blkid -s UUID -o value "$DEVICE")
if [ -z "$UUID" ]; then
echo "无法获取设备 UUID!"
exit 1
fi
# 创建挂载点目录
mkdir -p "$MOUNT_POINT"
# 检查是否已挂载
if grep -q "$MOUNT_POINT" /etc/fstab; then
echo "挂载点 $MOUNT_POINT 已在 fstab 中存在"
else
# 备份原始 fstab
cp /etc/fstab /etc/fstab.bak
# 添加挂载配置
echo "UUID=$UUID $MOUNT_POINT xfs defaults 0 0" | tee -a /etc/fstab
echo "已添加持久化挂载配置"
fi
# 挂载设备
mount -a
if [ $? -eq 0 ]; then
echo "挂载成功!"
echo "设备信息:"
df -hT "$MOUNT_POINT"
else
echo "挂载失败,请检查!"
exit 1
fi
EOF
- 批量挂载
shell
[root@master01 rustfs]# source rustfsnode.sh
[root@master01 rustfs]# for node_ip in "${RUSTFSNODE_IPS[@]}"
do
echo ">>> ${node_ip}"
scp -rp ./automountdev.sh root@${node_ip}:/root/
ssh root@${node_ip} "bash /root/automountdev.sh"
done
local-path部署
为了给rustfs的pod提供pvc,需要提前部署local-path,从而创建出pvc。
Local Path Provisioner 为 Kubernetes 用户提供了使用每个节点的本地存储的方式。根据用户配置,Local Path Provisioner 将自动在节点上创建 hostPath 或 local 的持久卷。
它利用了 Kubernetes 本地持久卷功能引入的特性,但比 Kubernetes 内置的 local 卷功能提供了一个更简单的解决方案。
- 获取资源
shell
[root@master01 rustfs]# wget https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.33/deploy/local-path-storage.yaml
- 修改配置
为了将数据落盘在worker01/02/03节点,需要修改configmap部分,其他部分保持默认。
shell
[root@master01 rustfs]# vim local-path-storage.yaml
#......
---
kind: ConfigMap
apiVersion: v1
metadata:
name: local-path-config
namespace: local-path-storage
data:
config.json: |-
{
"nodePathMap":[
{
"node":"master03", #追加存储节点清单
"paths":["/opt/local-path-provisioner"]
},
{
"node":"worker01",
"paths":["/opt/local-path-provisioner"]
},
{
"node":"worker02",
"paths":["/opt/local-path-provisioner"]
},
{
"node":"worker03",
"paths":["/opt/local-path-provisioner"]
}
]
}
#......
helperPod.yaml: |-
apiVersion: v1
kind: Pod
metadata:
name: helper-pod
spec:
priorityClassName: system-node-critical
tolerations:
- key: node.kubernetes.io/disk-pressure
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/control-plane #追加容忍
operator: Exists
effect: NoSchedule
- 正式部署
shell
[root@master01 rustfs]# kubectl apply -f local-path-storage.yaml
- 确认验证
shell
[root@master01 rustfs]# kubectl -n local-path-storage get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
local-path-provisioner-7968965699-plc5f 1/1 Running 0 51s 10.10.5.44 worker01 <none> <none>
[root@master01 rustfs]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-path rancher.io/local-path Delete WaitForFirstConsumer false 57s
获取rustfs chart包
如下获取chart包。
shell
[root@master01 rustfs]# helm repo add rustfs https://charts.rustfs.com
[root@master01 rustfs]# helm search repo rustfs
NAME CHART VERSION APP VERSION DESCRIPTION
rustfs/rustfs 0.0.77 1.0.0-alpha.77 RustFS helm chart to deploy RustFS on kubernete...
[root@master01 rustfs]# helm show values rustfs --repo https://charts.rustfs.com > defaults-values.yaml
添加rustfs节点标签
shell
[root@master01 rustfs]# kubectl label node master03 storage=rustfs-local
[root@master01 rustfs]# kubectl label node worker0{1,2,3} storage=rustfs-local
证书准备
为了便于管理,本实验采用域名ingress将控制台暴露,同时结合TLS,提供https服务。
对于证书可申请免费证书,也可如下生成自签名证书。
shell
[root@master01 rustfs]# wget https://down.linuxsb.com/myshell/signcert.sh
[root@master01 rustfs]# vim signcert.sh
#!/bin/sh
#***************************************************************#
# ScriptName: signcert.sh
# Author: xhy
# Create Date: 2025-02-25 21:49
# Modify Author: xhy
# Modify Date: 2025-12-27 02:02
# Version: v1
#***************************************************************#
# 配置参数
#PARENT_DOMAIN="linuxsb.com" # 父级域名
#SUB_DOMAINS=("aaa" "bbb" "ccc") # 子域名列表,可选配置
PARENT_DOMAIN="k8sy.com"
SUB_DOMAINS=("rustfs")
CERT_DIR="./certs" # 证书存储目录
CA_NAME="myCA" # CA证书名称
#......
[root@master01 rustfs]# bash signcert.sh
[root@master01 rustfs]# ll certs/
total 24K
-rw-r--r-- 1 root root 2.4K Dec 27 02:02 fullchain.crt
-rw-r--r-- 1 root root 1.3K Dec 27 02:02 k8sy.com.crt
-rw------- 1 root root 1.7K Dec 27 02:02 k8sy.com.key
-rw-r--r-- 1 root root 1.2K Dec 27 02:02 myCA.crt
-rw------- 1 root root 1.7K Dec 27 02:02 myCA.key
-rw-r--r-- 1 root root 41 Dec 27 02:02 myCA.srl
[root@master01 rustfs]# kubectl create namespace rustfs
[root@master01 rustfs]# kubectl -n rustfs create secret tls rustfs-k8sy-com-tls \
--cert=/root/rustfs/certs/k8sy.com.crt \
--key=/root/rustfs/certs/k8sy.com.key
自定义rustfs配置
根据相应的规划配置主要配置项,如ingress,node节点等。
shell
[root@master01 rustfs]# cat > myvalues.yaml <<'EOF'
replicaCount: 4
ingress:
enabled: true
className: "nginx"
hosts:
- host: rustfs.k8sy.com
paths:
- path: /
pathType: Prefix
tls:
enabled: true
secretName: rustfs-k8sy-com-tls
nodeSelector:
storage: rustfs-local
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
storageclass:
name: local-path
dataStorageSize: 2Gi
logStorageSize: 256Mi
EOF
正式部署rustfs
shell
[root@master01 rustfs]# helm upgrade --install rustfs rustfs/rustfs --create-namespace --namespace rustfs -f myvalues.yaml
[root@master01 rustfs]# helm -n rustfs list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
rustfs rustfs 1 2025-12-27 02:12:05.414849827 +0800 CST deployed rustfs-0.0.77 1.0.0-alpha.77
提示 :更多helm配置参考:About RustFS
确认验证
- 查看部署结果
shell
[root@master01 rustfs]# kubectl -n rustfs get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rustfs-0 1/1 Running 0 3m40s 10.10.30.74 worker02 <none> <none>
rustfs-1 1/1 Running 0 3m40s 10.10.5.7 worker01 <none> <none>
rustfs-2 1/1 Running 0 3m40s 10.10.19.74 worker03 <none> <none>
rustfs-3 1/1 Running 0 3m40s 10.10.235.23 master03 <none> <none>
[root@master01 rustfs]# kubectl -n rustfs get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
rustfs-headless ClusterIP None <none> 9000/TCP,9001/TCP 4m2s app.kubernetes.io/instance=rustfs,app.kubernetes.io/name=rustfs
rustfs-svc ClusterIP 10.20.177.157 <none> 9000/TCP,9001/TCP 4m2s app.kubernetes.io/instance=rustfs,app.kubernetes.io/name=rustfs
[root@master01 rustfs]# kubectl -n rustfs get ingress -o wide
NAME CLASS HOSTS ADDRESS PORTS AGE
rustfs nginx rustfs.k8sy.com 10.20.173.226 80, 443 4m6s
- 访问验证
浏览器访问 https://rustfs.k8sy.com ,使用 rustfsadmin / rustfsadmin 登录。

