目前的架構,K8s Cluster B 是負責對外服務,因為有一個 web service 讓使用者可以提供資料,並且存進 volume 中,但負責處理資料的 pod 是跑在內部的 K8s Cluster A 中,為了自動地將資料 sync 過去,想要採用 Minio 的解決方案
下圖是最後實現的作法,接下來跟大家說一下心路歷程
MinIO Server
介紹
下面是官網和介紹,通常是用來做 local S3 server 的,但是也有提供 data replica 的功能
MinIO | High Performance, Kubernetes Native Object Storage
Multi-cloud object storage allows enterprises to build AWS S3 compatible data infrastructure on any cloud. The result…
min.io
MinIO offers high-performance, S3 compatible object storage.
Native to Kubernetes, MinIO is the only object storage suite available on
every public cloud, every Kubernetes distribution, the private cloud and the
edge. MinIO is software-defined and is 100% open source under GNU AGPL v3.
安裝
參考官網的安裝說明,為了之後可以順利接軌 k8s ,採用 Container Installation
,--console-address
的 port 是 web UI 的 port ,可以直接進入 http://127.0.0.1:9001 或是使用 http://127.0.0.1:9000 ,後者會自動跳轉到 9001
$ docker run -p 9000:9000 -p 9001:9001 --rm --name minio-server \
-v /[path-to-local-folder]:/data minio/minio server \
/data --console-address ':9001'Formatting 1st pool, 1 set(s), 1 drives per set.
Automatically configured API requests per node based on available memory on the system: 183
Finished loading IAM sub-system (took 0.0s of 0.1s to load data).
Status: 1 Online, 0 Offline.
API: http://172.17.0.3:9000 http://127.0.0.1:9000Console: http://172.17.0.3:9001 http://127.0.0.1:9001Documentation: https://docs.min.io
- 如果不設定
--console-address
會出現警告,並且 Console 的 port 會被隨意分配,會因為沒有 docker port-foward 而無法連上
Console: http://172.17.0.3:35765 http://127.0.0.1:35765Documentation: https://docs.min.ioWARNING: Console endpoint is listening on a dynamic port (35765), please use --console-address ":PORT" to choose a static port.
這邊有掛載一個 volume 到 /data
下做資料保留
測試
跑起來後,就可以開啟 http://127.0.0.1:9000 ,預設的帳號密碼是 minioadmin/minioadmin
,請記得,目前這樣跑起來的 minio server 是 Standalone Mode
,之後會介紹到 Distributed Mode
*如果要修改預設帳密( Default Root Credentials) ,請新增以下的環境變數
- name: MINIO_ROOT_USERvalue: minioadmin- name: MINIO_ROOT_PASSWORDvalue: minioadmin
MinIO Client (mc)
安裝
安裝非常方便,為了測試方便,我是直接透過 brew 安裝在 mac 上
MinIO | The complete guide to the MinIO client
MinIO Client (mc) provides a modern alternative to UNIX commands like ls, cat, cp, mirror, diff etc. It supports…
docs.min.io
安裝完成,可以呼叫 mc --help
可以看到 —- config-dir
的預設路徑
$ mc --help
NAME:
mc - MinIO Client for cloud storage and filesystems.USAGE:
mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]COMMANDS:
alias manage server credentials in configuration file
...
update update mc to latest release
GLOBAL FLAGS:
--autocompletion install auto-completion for your shell
--config-dir value, -C value path to configuration folder (default: "/Users/[UserName]/.mc")
--quiet, -q disable progress bar display
--no-color disable color theme
--json enable JSON lines formatted output
--debug enable debug output
--insecure disable SSL certificate verification
--help, -h show help
--version, -v print the version
TIP:
Use 'mc --autocompletion' to enable shell autocompletionVERSION:
RELEASE.2022-05-09T04-08-26Z
進到資料夾,打開 /User/ydkai/.mc/config.json 可以看到
{
"version": "10",
"aliases": {
"gcs": {
"url": "https://storage.googleapis.com",
"accessKey": "YOUR-ACCESS-KEY-HERE",
"secretKey": "YOUR-SECRET-KEY-HERE",
"api": "S3v2",
"path": "dns"
},
"local": {
"url": "http://localhost:9000",
"accessKey": "",
"secretKey": "",
"api": "S3v4",
"path": "auto"
},
"play": {
"url": "https://play.min.io",
"accessKey": "Q3AM3UQ867SPQQA43P2F",
"secretKey": "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG",
"api": "S3v4",
"path": "auto"
},
"s3": {
"url": "https://s3.amazonaws.com",
"accessKey": "YOUR-ACCESS-KEY-HERE",
"secretKey": "YOUR-SECRET-KEY-HERE",
"api": "S3v4",
"path": "dns"
}
}
}%
替 local 補上 accessKey, secretKey 就好,預設是 minioadmin/minioadmin
,接著在 mc
指令最後都指定 alias ,就會使用 configuration 內的參數呼叫指定的 server
$ mc ls local
[2022-05-12 14:12:46 CST] 0B test1/
[2022-05-12 14:18:21 CST] 0B test2/
辦正事了
Bucket Replication
我們想要做的功能,在 minio Bucket Replication
,又分成兩種
- server-side
要同步的兩邊都跑起 minio server ,並且在 source 端的 web UI 內設定好 destination 的資料,就可以自動的同步,這邊也可以額外設定一些參數,例如 source 砍掉檔案後,destination 要不要也砍掉,也就是要不要 sync DELETE
這個會需要用 distributed mode 跑起 minio server 才行
- client-side
手動跑起 mc mirror
將某個 foler 同步到遠端的 minio server bucket 內,這個 process 會 hold 著,等著同步資料,如果有刪除也會一起同步
事前研究
由於 web service 和 cluster A 中負責處理資料的 pod 都不是透過 s3 存取資料,都是在 pod 內掛載 volume 後直接讀取,因此,一開始先做了一個實驗,想要驗證
如果手動在 minio server 內新增檔案,會不會同步到 minio server 內,以及同步到 bueckt 後,檔案是不是可以正常讀取
使用前面的 standalone minio server ,建立一個 bucket ,可以發現會在volume 內產生一個資料夾,恩,不意外,因為這就是 s3
從 web UI 上傳檔案,發現檔案卻被切分成很多 chuncks .並被放進一個與檔案同名的資料夾中,這跟我在 2022 年05 月測試的時候不一樣,應該只有一個檔案才對,這樣我要怎麼寫這篇文章啊 QAQ
鬼打牆
找了很久,終於查到原因,因為在六月時,minio server 有改版…
在 RELEASE.2022–06–02T02–11–04Z 之後,Standalone Mode 已經不支援 POSIX-style access to managed files ,而且也不向後相容了… 基本上,行為就已經像是 Distributed Mode 了
- 這邊指的
POSIX-style access to managed files
代表的是,沒辦法直接到 folder 中操作檔案,因為檔案會被切分成好幾個 chunks ,放進跟檔案名稱同名的資料夾
Deployment and Management
Single-Node Single-Drive (SNSD)
A single MinIO server with a single storage volume or folder. SNSD deployments are best suited for evaluation and initial development of applications using MinIO for object storage. This topology was previously referred to as Standalone Mode.
Starting with RELEASE.2022–06–02T02–11–04Z, SNSD deployments implement a zero-parity erasure coding backend and include support for the following erasure-coding dependent features:
- Versioning
- Object Locking / Retention
This topology is incompatible with the older filesystem-style behavior where MinIO acted as a simple S3 API layer while allowing POSIX-style access to managed files.
這個改動代表,要滿足我們操作檔案的需求的話,只能使用 RELEASE.2022–06–02T02–11–04Z 之前的版本
請將 image tag 固定成 RELEASE.2022–05–26T05–48–41Z.hotfix.204b42b6b
$ docker run -p 9000:9000 -p 9001:9001 --rm --name minio-server \
-v /[path-to-local-folder]:/data minio/minio:RELEASE.2022-05-26T05-48-41Z.hotfix.204b42b6b server /data --console-address ':9001'API: http://172.17.0.3:9000 http://127.0.0.1:9000Console: http://172.17.0.3:9090 http://127.0.0.1:9090Documentation: https://docs.min.ioYou are running an older version of MinIO released 1 month ago
Update: Run `mc admin update`
- 如果遇到
docker: invalid reference format.
的錯誤,請將 image tag 的-
重打一次,因為它變成全形的了
從 web UI 上可以看到要改成 distributed mode 才能啟用某些功能,這樣才對啊,從資料夾直接新增檔案 local-file
,也可以同步到 minio server 中,並且都會是以一個完整的檔案存在 volume 中
從 mino server 和 local 新增的檔案,差別在於 Object Info 不同而已,但我們並不在乎這個
結論
使用 distributed mode 跑起 minio server ,會出現檔案被切成很多個 chunks ,並且無法直接從 volume 內新增檔案,因此最後決定採用 client-side solution mc mirror
- 這邊並不是說 distributed mode 不好,只是他的 data protection 機制剛好不符合我們的使用情境
mc mirror
用 mc alias ls
看可以使用的 aliases ,並且在手動加入要複製過去的 minio server 資料
$ mc alias ls
{
"version": "10",
"aliases": {
"clusterA": {
"url": "https://[API host]",
"accessKey": "minioadmin",
"secretKey": "minioadmin",
"api": "S3v4",
"path": "auto"
}
}
}
如果想要同步 /path-to-folder/for_mc/
內的資料到 clusterA 的 bucket sync-bucket
下,步驟如下
- 到 clusterA 的 minio server 內,建立名為
sync-bucket
的 bucket ,要不然 mirror 會出現找不到 bucket 的錯誤 - 指令
$ mc mirror --overwrite --watch /path-to-folder/for_mc/ clusterA/sync-bucket
檔案就會自動 sync 到 sync-bucket
內,例如有一個 /path-to-folder/sample.txt
檔案,在 minio 中就會是 sync-bucket/sample.txt
,資料夾位置 /data/sync-bucket/sample.txt
- 如果在
mc mirror
的--watch
後寫上相對路徑
# in /path-to-folder
mc mirror --overwrite --watch for_mc/ clusterA/sync-bucket
同樣的檔案,在 minio server 的路徑會變成 sync-bucket/path-to-folder/for_mac/sample.txt
,這是有趣的差異
收工
最後做的事情是
- 在 clusterA 跑起 standalone 的 minio server ,把
/data
mount 在其他工程師要用的 volume 下,先進 web UI 新增名為sync-bucket
的 bucket - 在 clusterB 起一個 pod ,並且 mount web service 使用的 volume,再把上面的 configuration 放進 configmap 中,並且放進
/root/.mc/config.json
# config.json
template:
spec:
containers:
- name: mc
volumeMounts:
- mountPath: /root/.mc/config.json
readOnly: true
name: mc-config
subPath: config.json
volumes:
- name: mc-config
configMap:
name: minio-configmap# deployment
template:
spec:
containers:
- name: mc
image: mc_image
args: ["mirror", "--overwrite", "--watch", "/data/", "clusterA/sync-bucket"]
後記
因為 minio server api 預設不支援 subpath ,所以在設定 ingress 的時候遇到很大的挫折,錯誤訊息如下
mc: <ERROR> Invalid URL. URL `https://[ingress-host]/[subpath]/` for MinIO Client should be of the form scheme://host[:port]/ without resource component
最後是直接取得一個 domain name 才解決,原本以為這樣就沒事了,想說登入 web UI 看看結果,才發現 minio server console 也不支援,礙於不方便短時間內要求兩個 domain ,想說應該有辦法解決吧
做了很多嘗試,最後選擇設定 redirect 參數
MinIO Console
The MinIO Console is a rich graphical user interface that provides similar functionality to the mc command line tool…
docs.min.io
- name: MINIO_BROWSER_REDIRECT_URL value: https://[ingress-host]/[subpath]/
支援 subpath 的 commit
Pass Console Subpath envrionment variable by dvaldivia · Pull Request #14761 · minio/minio
Right now console supports being served on a subpath via CONSOLE_SUBPATH but the MinIO server is not setting this…
github.com
當然也是有人用 nginx 做 proxy-pass 啦
Minio console cannot be exposed trough k8s ingress and NGINX gateway · Issue #1908 · minio/console
I am using the latest minio release (RELEASE.2022-04-26T01-20-24Z) that introduces MINIO_BROWSER_REDIRECT_URL env…
github.com
最後可以成功使用 subpath 登入,但會遇到下面的問題
Minio console cannot be exposed trough k8s ingress and NGINX gateway · Issue #1908 · minio/console
I am using the latest minio release (RELEASE.2022-04-26T01-20-24Z) that introduces MINIO_BROWSER_REDIRECT_URL env…
github.com
If you go to
http://localhost/console/login
👉 everything works fineIf you click on
logout
after having logged-in 👉 you're redirected tohttp://localhost/console/console/login
If you go to
http://localhost/console
(without the login full path) 👉 you're redirected tohttp://localhost/console/console/login
目前就先手動修改網址,直接進入 http://lcoalhost/console/login
,要不然沒招,但雖然可以瀏覽,但下載還是會錯,要自己補上 subpath 才行
https://[ingress host]/api/v1/buckets/sync-bucket/objects/download?prefix=YXVkaW8tY2xpcH…
還是要個 Domain 比較實際 …
所有评论(0)