附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
相关推荐
无泪无花月隐星沉2 小时前
续写云计算的前世今生
kubernetes·云计算·openstack
HarrySunCn3 小时前
Linux系统Docker安装
云原生·eureka
福大大架构师每日一题3 小时前
go-zero v1.9.4 版本发布详解:云原生适配升级与稳定性性能全面提升
开发语言·云原生·golang
yuxb7317 小时前
Kubernetes核心组件详解与实践:Service
笔记·kubernetes
汪碧康17 小时前
【k8s-1.34.2安装部署】五.worker端containerd2.2.1、kubelet-1.34.2安装
docker·云原生·容器·kubernetes·jenkins·kubelet·xkube
忍冬行者1 天前
kubernetes安装traefik Gateway API,应对Ingress NGINX停止维护
云原生·kubernetes·云计算
没有bug.的程序员1 天前
微服务网关:从“必选项”到“思考题”的深度剖析
java·开发语言·网络·jvm·微服务·云原生·架构
没有bug.的程序员1 天前
Sentinel 流控原理深度解析:构建高可用微服务的底层架构
java·算法·微服务·云原生·架构·sentinel·负载均衡
ydswin1 天前
Sidecar不就是在Pod里多跑一个容器吗!
linux·kubernetes