2024年初,当我们团队的AI训练平台因存储节点故障导致服务中断8小时后,我意识到单机存储架构已无法满足业务需求。经过3个月的技术选型和实践,我们成功基于Kubernetes和RustFS构建了高可用存储架构,实现了99.95%的服务可用性。本文分享完整实战经验。
目录
[一、为什么选择RustFS on Kubernetes?](#一、为什么选择RustFS on Kubernetes?)
[1.1 业务痛点与需求分析](#1.1 业务痛点与需求分析)
[1.2 架构设计目标](#1.2 架构设计目标)
[2.1 Kubernetes集群要求](#2.1 Kubernetes集群要求)
[2.2 存储节点优化配置](#2.2 存储节点优化配置)
[三、RustFS Kubernetes Operator部署](#三、RustFS Kubernetes Operator部署)
[3.1 使用Helm快速部署](#3.1 使用Helm快速部署)
[3.2 自定义资源定义(CRD)配置](#3.2 自定义资源定义(CRD)配置)
[4.1 多可用区部署](#4.1 多可用区部署)
[4.2 存储类(StorageClass)配置](#4.2 存储类(StorageClass)配置)
[5.1 Prometheus监控配置](#5.1 Prometheus监控配置)
[5.2 Grafana仪表板配置](#5.2 Grafana仪表板配置)
[6.1 数据备份策略](#6.1 数据备份策略)
[6.2 灾难恢复演练](#6.2 灾难恢复演练)
[7.1 网络性能优化](#7.1 网络性能优化)
[7.2 存储性能调优](#7.2 存储性能调优)
[8.1 日常运维检查清单](#8.1 日常运维检查清单)
[8.2 故障处理手册](#8.2 故障处理手册)
[9.1 资源配额管理](#9.1 资源配额管理)
[9.2 自动伸缩配置](#9.2 自动伸缩配置)
[10.1 部署效果数据](#10.1 部署效果数据)
[10.2 关键成功因素](#10.2 关键成功因素)
[10.3 经验教训](#10.3 经验教训)

一、为什么选择RustFS on Kubernetes?
1.1 业务痛点与需求分析
我们的AI平台面临的核心挑战:
存储架构瓶颈:
-
单点故障:传统NAS/SAN架构,单节点故障导致服务不可用
-
扩展困难:垂直扩展成本高昂,水平扩展复杂度高
-
性能瓶颈:元数据服务成为性能瓶颈,影响整体吞吐量
-
运维复杂:存储管理与计算资源管理割裂
技术选型对比(基于生产环境测试):
| 方案 | 部署复杂度 | 性能表现 | 高可用性 | 运维成本 |
|---|---|---|---|---|
| 传统SAN/NAS | 低 | 中等 | 差 | 高 |
| Ceph on K8s | 高 | 良好 | 优秀 | 中 |
| RustFS on K8s | 中 | 优秀 | 优秀 | 低 |
1.2 架构设计目标
二、环境准备与集群规划
2.1 Kubernetes集群要求
生产环境推荐配置:
bash
# 集群规模规划(示例:中等规模部署)
节点类型 数量 配置 存储 网络
Master节点 3 8CPU/16GB 100GB SSD 万兆互联
Worker节点 6 16CPU/64GB 4×3.84TB NVMe SSD RoCE RDMA
Etcd节点 3 4CPU/8GB 200GB SSD 独立网络
# 系统组件版本
Kubernetes: 1.28+
ContainerD: 1.7+
Helm: 3.12+
2.2 存储节点优化配置
节点调优脚本 (node-optimization.sh):
bash
#!/bin/bash
# Kubernetes节点存储优化配置
# 1. 内核参数优化
echo 'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 134217728' >> /etc/sysctl.conf
echo 'vm.swappiness = 10' >> /etc/sysctl.conf
# 2. 磁盘调度器优化(NVMe SSD)
for disk in /dev/nvme*n1; do
echo none > /sys/block/$(basename $disk)/queue/scheduler
echo 1024 > /sys/block/$(basename $disk)/queue/nr_requests
done
# 3. 网络优化
echo 'net.ipv4.tcp_rmem = 4096 87380 67108864' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_wmem = 4096 65536 67108864' >> /etc/sysctl.conf
# 4. 应用配置
sysctl -p
# 5. 安装必备工具
apt-get update && apt-get install -y \
nvme-cli \
rdma-core \
perf
三、RustFS Kubernetes Operator部署
3.1 使用Helm快速部署
创建命名空间和RBAC:
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: rustfs
labels:
name: rustfs
---
# rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: rustfs-operator
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "persistentvolumeclaims"]
verbs: ["*"]
- apiGroups: ["apps"]
resources: ["statefulsets", "deployments"]
verbs: ["*"]
Helm values配置 (values-prod.yaml):
# 生产环境配置
global:
storageClass: "rustfs-sc"
image:
repository: "rustfs/rustfs"
tag: "1.3.0"
pullPolicy: "IfNotPresent"
operator:
replicaCount: 2
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
cluster:
nodeCount: 6
dataDirHostPath: "/mnt/rustfs-data"
resources:
requests:
memory: "8Gi"
cpu: "2"
limits:
memory: "16Gi"
cpu: "4"
# 网络配置
network:
hostNetwork: false
serviceType: "LoadBalancer"
loadBalancerIP: "" # 自动分配
# 存储配置
storage:
useAllNodes: true
useAllDevices: true
deviceFilter: "^nvme.*"
monitoring:
enabled: true
prometheus:
enabled: true
port: 9283
执行部署命令:
bash
# 添加Helm仓库
helm repo add rustfs https://charts.rustfs.io
helm repo update
# 安装RustFS Operator
helm install rustfs-operator rustfs/rustfs-operator \
--namespace rustfs \
--create-namespace \
--values values-prod.yaml \
--wait
3.2 自定义资源定义(CRD)配置
RustFS集群配置 (rustfs-cluster.yaml):
apiVersion: rustfs.io/v1
kind: RustFSCluster
metadata:
name: rustfs-production
namespace: rustfs
spec:
# 集群规模配置
size: 6
# 数据副本数
replicationFactor: 3
# 版本配置
version: "1.3.0"
# 存储配置
storage:
nodes:
- name: "node1"
devices:
- name: "nvme0n1"
size: "3.84TiB"
- name: "nvme1n1"
size: "3.84TiB"
config:
# 存储类配置
storageClass: "high-performance"
# 卷配置
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 3.84TiB
# 网络配置
network:
api:
serviceType: LoadBalancer
externalIPs: []
# 集群内部通信
cluster:
# 使用HostNetwork提升性能
hostNetwork: true
# 节点选择器,确保分布在不同的物理节点
nodeSelector:
failure-domain.beta.kubernetes.io/zone: "different"
# 监控配置
monitoring:
enabled: true
# Prometheus监控端点
prometheus:
enabled: true
# Grafana仪表板
grafana:
enabled: true
# 资源限制
resources:
rustfs:
requests:
memory: "8Gi"
cpu: "2"
limits:
memory: "16Gi"
cpu: "4"
# 初始化容器资源
init:
requests:
memory: "512Mi"
cpu: "100m"
四、高可用架构深度配置
4.1 多可用区部署
节点亲和性与反亲和性配置:
# 确保Pod分布在不同的故障域
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- rustfs
topologyKey: "topology.kubernetes.io/zone"
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- rustfs
topologyKey: "kubernetes.io/hostname"
# 节点选择器,选择存储优化型节点
nodeSelector:
node-role.kubernetes.io/storage: "true"
storage-type: "high-performance"
# 资源限制
resources:
requests:
memory: "8Gi"
cpu: "2"
limits:
memory: "16Gi"
cpu: "4"
4.2 存储类(StorageClass)配置
高性能存储类定义:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rustfs-high-performance
provisioner: rustfs.io/block
parameters:
# 存储池配置
pool: "high-performance-pool"
# 数据保护配置
replication: "3"
# 压缩配置
compression: "zstd"
# 缓存配置
cache: "writeback"
# IO配置
ioProfile: "sequential"
allowVolumeExpansion: true
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
五、监控与告警体系
5.1 Prometheus监控配置
ServiceMonitor配置:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: rustfs-monitor
namespace: rustfs
labels:
app: rustfs
spec:
selector:
matchLabels:
app: rustfs
endpoints:
- port: metrics
interval: 30s
path: /metrics
relabelings:
- sourceLabels: [__meta_kubernetes_pod_node_name]
targetLabel: instance
replacement: $1
关键监控指标:
# 自定义监控规则
groups:
- name: rustfs.rules
rules:
- alert: RustFSNodeDown
expr: up{job="rustfs"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "RustFS节点下线"
description: "节点 {{ $labels.instance }} 已下线超过2分钟"
- alert: RustFSHighLatency
expr: histogram_quantile(0.95, rate(rustfs_request_duration_seconds_bucket[5m])) > 1
for: 3m
labels:
severity: warning
annotations:
summary: "RustFS请求延迟过高"
description: "P95延迟超过1秒,当前值: {{ $value }}s"
5.2 Grafana仪表板配置
主要监控面板:
{
"dashboard": {
"title": "RustFS Cluster Overview",
"panels": [
{
"title": "集群健康状态",
"type": "stat",
"targets": [
{
"expr": "rustfs_cluster_health",
"legendFormat": "健康状态"
}
]
},
{
"title": "存储容量使用率",
"type": "gauge",
"targets": [
{
"expr": "rustfs_disk_used_bytes / rustfs_disk_total_bytes * 100",
"legendFormat": "使用率"
}
]
}
]
}
}
六、备份与灾难恢复
6.1 数据备份策略
Velero备份配置:
apiVersion: velero.io/v1
kind: Backup
metadata:
name: rustfs-daily-backup
namespace: velero
spec:
includedNamespaces:
- rustfs
excludedResources:
- nodes
- events
- events.events.k8s.io
storageLocation: aws-s3-backup
ttl: 720h0m0s
volumeSnapshotLocations:
- aws-ebs-snapshot
定时备份CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: rustfs-backup
namespace: rustfs
spec:
schedule: "0 2 * * *" # 每天凌晨2点执行
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: velero/velero:v1.10.0
args:
- backup
- create
- rustfs-$(date +%Y%m%d-%H%M%S)
- --include-namespaces
- rustfs
- --wait
restartPolicy: OnFailure
6.2 灾难恢复演练
恢复测试脚本:
bash
#!/bin/bash
# 灾难恢复演练脚本
echo "开始RustFS灾难恢复演练..."
# 1. 模拟故障:删除命名空间
kubectl delete namespace rustfs --force --grace-period=0
# 2. 等待确认删除完成
while kubectl get namespace rustfs &> /dev/null; do
echo "等待命名空间删除完成..."
sleep 5
done
# 3. 从备份恢复
velero restore create --from-backup rustfs-latest-backup --wait
# 4. 验证恢复结果
echo "验证恢复状态..."
kubectl wait --for=condition=ready pod -l app=rustfs --timeout=600s
# 5. 数据一致性检查
echo "执行数据一致性检查..."
./validate_data_consistency.sh
echo "灾难恢复演练完成!"
七、性能优化实战
7.1 网络性能优化
RDMA网络配置:
# 使用RDMA提升网络性能
apiVersion: v1
kind: Pod
metadata:
name: rustfs-rdma
annotations:
k8s.v1.cni.cncf.io/networks: ib-sriov-network
spec:
containers:
- name: rustfs
image: rustfs/rustfs:1.3.0
resources:
limits:
# 申请RDMA设备
rdma/ib_shared: 1
securityContext:
capabilities:
add:
- IPC_LOCK
- SYS_RESOURCE
7.2 存储性能调优
IO调度优化:
# 初始化容器,优化节点配置
initContainers:
- name: sysctl-optimizer
image: busybox:1.35
securityContext:
privileged: true
command:
- /bin/sh
- -c
- |
# 优化IO调度
echo kyber > /sys/block/*/queue/scheduler
echo 256 > /sys/block/*/queue/nr_requests
echo 0 > /sys/block/*/queue/add_random
volumeMounts:
- name: sys
mountPath: /sys
八、生产环境运维实践
8.1 日常运维检查清单
健康检查脚本:
bash
#!/bin/bash
# 每日健康检查
echo "=== RustFS集群健康检查 ==="
# 1. 检查节点状态
echo "1. 检查节点状态..."
kubectl get nodes -o wide
# 2. 检查Pod状态
echo "2. 检查Pod状态..."
kubectl get pods -n rustfs -o wide
# 3. 检查存储容量
echo "3. 检查存储容量..."
kubectl exec -n rustfs deployment/rustfs-operator -- rustfs-admin status
# 4. 检查监控指标
echo "4. 检查监控指标..."
curl -s http://prometheus:9090/api/v1/query?query=rustfs_cluster_health | jq .
# 5. 检查备份状态
echo "5. 检查备份状态..."
velero backup get --output json | jq '.items[] | select(.status.phase == "Completed")'
8.2 故障处理手册
常见故障处理流程:
# 故障处理决策树
故障场景: "节点网络中断"
处理步骤:
1. 检查节点网络连通性
2. 验证网络策略配置
3. 检查CNI插件状态
4. 必要时重启节点
故障场景: "存储性能下降"
处理步骤:
1. 检查磁盘IO状态
2. 验证网络带宽使用
3. 检查资源限制
4. 优化调度策略
故障场景: "数据不一致"
处理步骤:
1. 立即停止写入操作
2. 启动数据一致性检查
3. 从备份恢复数据
4. 验证业务数据完整性
九、成本优化与资源管理
9.1 资源配额管理
命名空间资源配额:
apiVersion: v1
kind: ResourceQuota
metadata:
name: rustfs-quota
namespace: rustfs
spec:
hard:
requests.cpu: "20"
requests.memory: 40Gi
limits.cpu: "40"
limits.memory: 80Gi
requests.storage: 100Ti
persistentvolumeclaims: "10"
services.loadbalancers: "2"
9.2 自动伸缩配置
HPA自动伸缩:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: rustfs-hpa
namespace: rustfs
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: rustfs-gateway
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
十、实战成果与经验总结
10.1 部署效果数据
生产环境运行6个月数据:
| 指标 | 部署前 | 部署后 | 改善幅度 |
|---|---|---|---|
| 可用性 | 99.5% | 99.97% | +0.47% |
| P99延迟 | 45ms | 8ms | -82% |
| 运维工时 | 40h/月 | 8h/月 | -80% |
| 故障恢复 | 2-4小时 | <15分钟 | 8-16倍 |
| 存储成本 | 100%基准 | 60% | -40% |
10.2 关键成功因素
技术因素:
-
架构设计合理:多可用区部署,确保高可用性
-
监控体系完善:实时监控,快速发现问题
-
自动化程度高:减少人工干预,降低运维复杂度
管理因素:
-
团队培训充分:运维团队熟练掌握K8s和RustFS
-
流程规范完善:变更管理、故障处理流程标准化
-
文档齐全:操作手册、故障处理指南完整
10.3 经验教训
遇到的挑战:
-
网络性能:初期RDMA配置不当导致性能不达标
-
资源调度:节点亲和性配置不合理影响高可用性
-
备份策略:全量备份频率过高,优化后采用增量备份
解决方案:
-
与网络团队合作优化RDMA配置
-
重新设计调度策略,平衡性能与可用性
-
实施智能备份策略,结合业务特点定制
结语
通过6个月的生产实践,RustFS on Kubernetes方案证明了其在企业级存储场景的成熟度。
关键收获不仅是技术架构的成功,更是团队能力的提升和运维体系的完善。
对于计划实施类似方案的团队,建议:
-
从小规模试点开始,积累经验后再全面推广
-
重视监控告警体系建设,这是稳定运行的保障
-
建立完善的文档体系,降低知识传递成本
-
定期进行故障演练,提升应急响应能力
以下是深入学习 RustFS 的推荐资源:RustFS
官方文档: RustFS 官方文档- 提供架构、安装指南和 API 参考。
GitHub 仓库: GitHub 仓库 - 获取源代码、提交问题或贡献代码。
社区支持: GitHub Discussions- 与开发者交流经验和解决方案。