RustFS 作为新一代的分布式对象存储系统,提供了 Helm Chart 以便 Kubernetes 集群上安装 RustFS 实例。而 DirectPV 是一个符合 CSI 标准的 Kubernetes 存储项目,由 Minio 发布且开源。本文使用 DirectPV 为 Kubernetes 上的 RustFS 实例提供后端存储服务,实现两个对象存储服务的"结合"。
前提
-
运行良好的 Kubernetes 集群。
本文使用 K3S 作为测试环境,根据 K3S 安装指南完成安装:
# 安装 K3S curl -sfL https://get.k3s.io | sh - # 安装确认 kubectl get nodes NAME STATUS ROLES AGE VERSION vm-0-17-ubuntu Ready control-plane 63m v1.34.3+k3s1 -
一块空磁盘
本文在安装 K3S 的服务器上(OS 为 Ubuntu 24.04)挂载了一块容量为 20GB 的新磁盘:
df -h vdb 253:16 0 20G 0 disk /root/data/disk mount | grep vdb /dev/vdb on /root/data/disk type ext4 (rw,relatime)
安装 DirectPV
可以直接根据 minio/directpv 文档进行 DirectPV 的安装。这个过程中会使用到 krew plugin,根据不同的 OS 执行安装命令即可。
在 Ubuntu 上执行如下命令:
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)
安装完毕,将 PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH" 写到 ~/.bashrc 或 ~/.zshrc 即可。
开始安装 DirectPV。
-
安装 directpv krew 插件
kubectl krew install directpv
-
在 Kubernetes 集群中安装 DirectPV
kubectl directpv install
Installing on unsupported Kubernetes v1.34███████████████████████████████████████████████████████████████████████████ 100%
┌──────────────────────────────────────┬──────────────────────────┐
│ NAME │ KIND │
├──────────────────────────────────────┼──────────────────────────┤
│ directpv │ Namespace │
│ directpv-min-io │ ServiceAccount │
│ directpv-min-io │ ClusterRole │
│ directpv-min-io │ ClusterRoleBinding │
│ directpv-min-io │ Role │
│ directpv-min-io │ RoleBinding │
│ directpvdrives.directpv.min.io │ CustomResourceDefinition │
│ directpvvolumes.directpv.min.io │ CustomResourceDefinition │
│ directpvnodes.directpv.min.io │ CustomResourceDefinition │
│ directpvinitrequests.directpv.min.io │ CustomResourceDefinition │
│ directpv-min-io │ CSIDriver │
│ directpv-min-io │ StorageClass │
│ node-server │ Daemonset │
│ controller │ Deployment │
└──────────────────────────────────────┴──────────────────────────┘DirectPV installed successfully
-
安装确认并获取安装信息
kubectl -n directpv get pods
NAME READY STATUS RESTARTS AGE
controller-54d56fb9f8-92cz8 3/3 Running 0 90m
controller-54d56fb9f8-kfltl 3/3 Running 0 90m
controller-54d56fb9f8-ncxcn 3/3 Running 0 90m
node-server-vgpn2 4/4 Running 0 90mkubectl directpv info
┌──────────────────┬──────────┬───────────┬─────────┬────────┐
│ NODE │ CAPACITY │ ALLOCATED │ VOLUMES │ DRIVES │
├──────────────────┼──────────┼───────────┼─────────┼────────┤
│ • vm-0-17-ubuntu │ - │ - │ - │ - │
└──────────────────┴──────────┴───────────┴─────────┴────────┘0 B/0 B used, 0 volumes, 0 drives
-
添加磁盘(驱动)
首先检测磁盘信息并将其信息写到 drives.yaml 文件中:
kubectl directpv discover
Discovered node 'vm-0-17-ubuntu' ✔
┌─────────────────────┬────────────────┬───────┬────────┬────────────┬──────┬───────────┬─────────────┐
│ ID │ NODE │ DRIVE │ SIZE │ FILESYSTEM │ MAKE │ AVAILABLE │ DESCRIPTION │
├─────────────────────┼────────────────┼───────┼────────┼────────────┼──────┼───────────┼─────────────┤
│ 253:16$PXmUgO0FF... │ vm-0-17-ubuntu │ vdb │ 20 GiB │ ext4 │ - │ YES │ - │
└─────────────────────┴────────────────┴───────┴────────┴────────────┴──────┴───────────┴─────────────┘
Generated 'drives.yaml' successfully.
drives.yaml 文件内容如下:
version: v1
nodes:
- name: vm-0-17-ubuntu
drives:
- id: 253:16$PXmUgO0FF7sKtsaVihMadap1hCZil9Rksbz2SdQkMfA=
name: vdb
size: 21474836480
make: ""
fs: ext4
select: "yes"
接着使用 drives.yaml 文件进行 DirectPV 初始化:
kubectl directpv init drives.yaml --dangerous
███████████████████████████████████████████████████████████████████████████ 100%
Processed initialization request '3a70561d-3de0-4756-b256-159fc98593d1' for node 'vm-0-17-ubuntu' ✔
┌──────────────────────────────────────┬────────────────┬───────┬─────────┐
│ REQUEST_ID │ NODE │ DRIVE │ MESSAGE │
├──────────────────────────────────────┼────────────────┼───────┼─────────┤
│ 3a70561d-3de0-4756-b256-159fc98593d1 │ vm-0-17-ubuntu │ vdb │ Success │
└──────────────────────────────────────┴────────────────┴───────┴─────────┘
恭喜你,走到这一步,你已经成功安装了 DirectPV(之前的每一步出错都会导致失败,请认真查看命令以及输出结果),使用如下命令确认:
kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
directpv-min-io directpv-min-io Delete WaitForFirstConsumer true 90m
local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 115m
可以看到,名为 directpv-min-io 的 StorageClass 已经存在。接下来就使用这个 SC 进行 RustFS 的安装。
在 K3S 上安装 RustFS
RustFS 提供 Helm Chart来在 Kubernetes 上安装 RustFS。目前支持两种模式:单机单盘(SNSD)和多机多盘(MNMD)。
可以将 GitHub Repo 代码 clone 到本地,然后进入到 helm/rustfs 目录下进行安装,也可以直接使用 RustFS 的远端仓库(RustFS 已经将 Helm Chart 发布到了 Artifact Hub),比如:
# 添加仓库
helm repo add rustfs https://charts.rustfs.com
# 安装 RustFS
helm install rustfs -n rustfs rustfs/rustfs --create-namespace --version 0.0.80
由于 RustFS Helm Chart 默认使用 local-path StorageClass,而且默认的 PVC 大小为 256Mi,因此需要根据自身情况设置合适的大小,最简单的方式就是在本地创建一个 values.yml 文件,然后修改如下内容:
storageclass:
name: directpv-min-io
dataStorageSize: 256Mi
logStorageSize: 256Mi
当然,也可以用
--set来实现参数的覆盖,但是由于 RustFS 多种安装模式、多种 Ingress Controller,以及 pod 资源的自定义等,--set就需要指定多个参数,会显得繁琐。将需要变更的信息写到本地values.yml,然后用-f指定,可能更加便捷的自定义安装 RustFS。
本文采用本地安装模式(也就是 Helm Chart 代码在本地),执行如下命令进行安装:
helm install rustfs ./ -n rustfs --create-namespace -f values.yaml
查看 PVC
kubectl -n rustfs get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
data-rustfs-0-rustfs-0 Bound pvc-8e9b520f-3a96-4a64-afb3-70f13d3edcd3 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-0-rustfs-1 Bound pvc-8bef3219-469c-452c-969a-89c8470d3945 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-0-rustfs-2 Bound pvc-aee2c489-6f4c-47dc-b464-b09fc5ea112c 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-0-rustfs-3 Bound pvc-b59ec27c-9fb0-4ad1-a204-9858c1d405da 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-1-rustfs-0 Bound pvc-8d840468-f6be-4154-ae42-73f68f6e36e3 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-1-rustfs-1 Bound pvc-c5adc67b-f6ea-470a-861d-9b48b610bbee 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-1-rustfs-2 Bound pvc-8d7b98e0-ff0b-4d5f-869c-fe7c1b71ffc2 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-1-rustfs-3 Bound pvc-9268589f-7ca7-4480-a724-36bfcdc29cff 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-2-rustfs-0 Bound pvc-f31689f3-1aa8-42f7-8fcb-f309a6b390b5 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-2-rustfs-1 Bound pvc-28fecb41-9dd7-436d-9317-e8a3a588a87a 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-2-rustfs-2 Bound pvc-77d4c8e6-918a-4b28-a2bc-408195f807d3 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-2-rustfs-3 Bound pvc-6deab996-a8a3-4e02-ae6c-845f863526c0 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-3-rustfs-0 Bound pvc-46c7cc1a-1f25-4c3e-8168-3c288ee552d5 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-3-rustfs-1 Bound pvc-a0403935-2471-48d8-beac-fcf28fd85a7a 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-3-rustfs-2 Bound pvc-d0c88736-ee1a-47e5-a335-53d086e87913 256Mi RWO directpv-min-io <unset> 61s
data-rustfs-3-rustfs-3 Bound pvc-9fbac8a8-cb59-430b-abc1-4ad5105ed4ad 256Mi RWO directpv-min-io <unset> 61s
logs-rustfs-0 Bound pvc-bc673cea-6cf0-479f-a323-5c2102479796 256Mi RWO directpv-min-io <unset> 61s
logs-rustfs-1 Bound pvc-c823f3a4-2e07-4331-bdd3-f0c6172bb15b 256Mi RWO directpv-min-io <unset> 61s
logs-rustfs-2 Bound pvc-059eeaf9-b209-41ec-87f6-da87f0105c41 256Mi RWO directpv-min-io <unset> 61s
logs-rustfs-3 Bound pvc-348e4bfb-d272-4deb-ae8e-fc6ea70d4d74 256Mi RWO directpv-min-io <unset> 61s
可以看到生成了分布式安装所需的所有 PVC,状态是 Bound。接着查看 pods 状态:
kubectl -n rustfs get pods
NAME READY STATUS RESTARTS AGE
rustfs-0 1/1 Running 0 69s
rustfs-1 1/1 Running 0 69s
rustfs-2 1/1 Running 0 69s
rustfs-3 1/1 Running 0 69s
可以看到 pod 运行正常。接着就可以使用 ingress 来访问该 RustFS 实例了。
注意事项
安装 DirectPV 的过程中,会对该磁盘上的数据进行格式化,而且该磁盘不能被其他程序占用,否则会出现如下错误:
┌──────────────────────────────────────┬────────────────┬───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ REQUEST_ID │ NODE │ DRIVE │ MESSAGE │
├──────────────────────────────────────┼────────────────┼───────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ e9adb7af-8061-46b1-8112-d86e5fb653cd │ vm-0-17-ubuntu │ vdb │ Failed; unable to format device /dev/vdb; unable to execute command [mkfs.xfs -i maxpct=50 -m uuid=2be5b9cc-beeb-4d54-bbcb-a1cbc5f0ef97 -f -L DIRECTPV /dev/vdb]; output=mkfs.xfs: cannot open /dev/vdb: Device or resource busy │
│ │ │ │ ; error=exit status 1 │
└──────────────────────────────────────┴────────────────┴───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
可以通过将此磁盘 umount 来解决。