附057.RustFS云原生Kubernetes部署指南

文章目录

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
相关推荐
阿里云云原生1 天前
阿里云获评 Agentic AI 开发平台领导者,函数计算 AgentRun 赢下关键分!
云原生
蝎子莱莱爱打怪1 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
阿里云云原生1 天前
MSE Nacos Prompt 管理:让 AI Agent 的核心配置真正可治理
微服务·云原生
阿里云云原生2 天前
当 AI Agent 接管手机:移动端如何进行观测
云原生·agent
阿里云云原生2 天前
AI 原生应用开源开发者沙龙·深圳站精彩回顾 & PPT下载
云原生
阿里云云原生2 天前
灵感启发:日产文章 100 篇,打造“实时热点洞察”引擎
云原生
~莫子2 天前
Haproxy七层负载详解+实验详细代码
云原生
阿里云云原生2 天前
OpenTelemetry + 云监控 2.0:打造你的云原生全栈可观测
云原生
阿里云云原生2 天前
Kubernetes 官方再出公告,强调立即迁移 Ingress NGINX
kubernetes
阿狸猿2 天前
云原生数据库
云原生·软考