博客 / 詳情

返回

K3s x RustFS,邊緣場景下的雲原生存儲解決之道

本文分享使用 Helm Chart 在 K3s 上安裝 RustFS。使用 K3s local-path-provisioner 來將本地磁盤轉換誒 PVC,再將 PVC 當作 RustFS VOLUME,從而搭建 RustFS 多機多盤集羣。

關於 RustFS

RustFS 是一個用 Rust 編寫的開源分佈式對象存儲系統,完全兼容 S3,可作為 minio 的平替。支持多種安裝方式:源碼編譯、二進制、Docker 以及 Helm Chart。K3s 和 RustFS 相結合,能夠作為邊緣場景的雲原生存儲解決方案。

k3s 的安裝

k3s 是經 CNCF 一致性認證的 Kubernetes 發行版,專為物聯網及邊緣計算而設計。簡言之,k3s 是一個輕量級的 Kubernetes 發行版。

k3s 的安裝非常簡單,對於國內用户來講,執行如下命令可以加速 k3s 的安裝:

$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
[INFO]  Finding release for channel stable
[INFO]  Using v1.28.5+k3s1 as release
[INFO]  Downloading hash rancher-mirror.rancher.cn/k3s/v1.28.5-k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary rancher-mirror.rancher.cn/k3s/v1.28.5-k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
sh: 1014: restorecon: not found
sh: 1015: restorecon: not found
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

接着可以查看 k3s 是否安裝成功:

#查看 k3s 版本
$ k3s --version
k3s version v1.33.4+k3s1 (148243c4)
go version go1.24.5

# 查看 k3s 集羣

$ kubectl get nodes
NAME             STATUS   ROLES                  AGE    VERSION
vm-0-12-ubuntu   Ready    control-plane,master   135m   v1.33.4+k3s1

安裝 RustFS

使用 RustFS Helm Chart來在 K3s 上進行安裝。克隆此倉庫到本地:

$ git clone git@github.com:rustfs/rustfs.git

整個目錄結構如下:

├── Chart.yaml
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── configmap.yaml
│   ├── ingress.yaml
│   ├── secret-tls.yaml
│   ├── secret.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   ├── statefulset.yaml
│   └── tests
│       └── test-connection.yaml
├── tls
│   ├── tls.crt
│   └── tls.key
└── values.yaml

當前 RustFS helm chart 是多機多盤(MNMD)模式,支持 4 個 pod,每個 pod 4 個 volume 以及 16 個 pod,每個 pod 一個 volume 的安裝方式。默認為 4 個 pod 模式(也是推薦模式)。

根據自身需要對 values.yaml 中的參數進行修改,比如 CPU、Memory 的請求限制、PVC 的大小、StorageClass 的名稱、Ingress 信息等。

由於在 K3s 上是通過 PVC 來當作 RustFS 實例所用到的 VOLUME,所以使用了 Rancher 自研的 local-path-provisioner來將本地磁盤轉換為 StorageClass,執行官方推薦的安裝命令安裝即可:

kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.32/deploy/local-path-storage.yaml

然後查看 storageclass:

kubectl  get sc
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  149m

因此,在 values.yaml 文件中增加 PVC 內容:

storageclass:
name: local-path
size: 256Mi

然後執行 helm install 進行安裝即可。

對於 traefki ingressclass,執行如下命令:

helm install rustfs -n rustfs --create-namespace ./ --set ingress.className="traefik"
K3s 默認安裝了 traefik,因此 traefik 默認為 ingressclass。

對於 nginx ingressclass,執行如下命令:

helm install rustfs -n rustfs --create-namespace ./ --set ingress.className="nginx"

返回如下:

NAME: rustfs
LAST DEPLOYED: Tue Sep 16 07:20:59 2025
NAMESPACE: rustfs
STATUS: deployed
REVISION: 1
NOTES:

1. Get the application URL by running these commands:
   http://your.rustfs.com/

查看 pod,pvc,ingres,svc 等資源:

kubectl -n rustfs get pods,pvc,ingress,svc
NAME           READY   STATUS    RESTARTS   AGE
pod/rustfs-0   1/1     Running   0          88m
pod/rustfs-1   1/1     Running   0          92m
pod/rustfs-2   1/1     Running   0          96m
pod/rustfs-3   1/1     Running   0          101m

NAME                                           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/data-rustfs-0-rustfs-0   Bound    pvc-5ff16d6f-217e-4e05-b553-0c9245aa8dfb   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-0-rustfs-1   Bound    pvc-665927f9-5bbb-4866-87ac-c4254e32cf11   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-0-rustfs-2   Bound    pvc-595df1fe-2196-4174-9e52-eeed6a705284   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-0-rustfs-3   Bound    pvc-480b6848-4cb0-416f-8e88-137ebec4e035   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-1-rustfs-0   Bound    pvc-0a7cc385-0378-486a-83f7-db883fe1e29d   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-1-rustfs-1   Bound    pvc-f304ed03-0967-4e62-b8cd-fdb2525b1018   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-1-rustfs-2   Bound    pvc-cf9d3539-b5a1-4e7e-95c0-a2cf99e57bc5   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-1-rustfs-3   Bound    pvc-9caaf98c-faee-444d-9e2c-a377aafb9fb9   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-2-rustfs-0   Bound    pvc-8ea082b2-ba9f-4cd6-9866-866ed541697f   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-2-rustfs-1   Bound    pvc-e7c69318-2648-4722-964e-cc89b798c191   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-2-rustfs-2   Bound    pvc-883e9eba-1038-4789-b7fc-731f6becf794   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-2-rustfs-3   Bound    pvc-ac8be1b7-ed72-4994-b5a5-87ef2fefcfd2   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-3-rustfs-0   Bound    pvc-1d80e06a-91a7-4e64-8f3f-aaadaf576bb9   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-3-rustfs-1   Bound    pvc-f3bca979-bec3-49fa-92d7-44c45560c94b   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-3-rustfs-2   Bound    pvc-ad3a9d90-db72-49d1-b372-0f321869f7a5   256Mi      RWO            local-path     <unset>                 145m
persistentvolumeclaim/data-rustfs-3-rustfs-3   Bound    pvc-fbf06576-873b-46d7-b084-c0a71ed324fe   256Mi      RWO            local-path     <unset>                 145m

NAME                               CLASS     HOSTS              ADDRESS    PORTS     AGE
ingress.networking.k8s.io/rustfs   traefik   your.rustfs.com    10.0.0.4   80, 443   30m

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE
service/rustfs-headless   ClusterIP   None            <none>        80/TCP,9001/TCP   108m
service/rustfs-svc        ClusterIP   10.43.240.116   <none>        80/TCP,9001/TCP   108m

等待所有資源都處於 Ready 狀態就可以登錄 RustFS 了。

登錄 RustFS

可以使用默認用户名和密碼來登錄 RustFS 實例。默認用户名和密碼都寫在了 values.yaml 中,並通過 secret 的方式以環境變量的形式注入到了 Pod 中。本次安裝指定的默認用户名和密碼均為 rustfsadmin。因此使用該用户名和密碼,在瀏覽器中輸入 Ingress 的地址 https://your.rustfs.com 即可看到 RustFS 的登錄頁面:

rustfs-console-login.png

接着就可以來創建存儲桶、對象等使用 RustFS。詳細使用,可以查看 RustFS 官方文檔。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.