跳到主要內容
節省工具箱Jason Tools
經驗分享

PVE 掛接外部 Ceph 與 CT 直接掛載 CephFS

Jason Cheng 發布 瀏覽 1 次
PVE 掛接外部 Ceph 與 CT 直接掛載 CephFS
本文目錄
  1. 架構與使用方式
  2. 來源 Ceph 叢集
  3. 另一套 PVE 叢集掛接外部 Ceph
  4. 非特權 CT 直接掛載 CephFS
  5. 備份、移轉與 HA
  6. 結論
  7. 參考資料

一套 Proxmox VE 超融合叢集上跑了 Ceph,另一套 PVE 叢集想直接用它的儲存空間;或是兩台跑 FTP 的 CT 要共用同一份檔案。這兩種需求,都可以讓 PVE 或 CT 當成 Ceph 的用戶端,直接連到來源的 Ceph 叢集,不用合併叢集,也不用另外架 NFS。

這篇分成三個部分:從來源 Ceph 取得連線資訊、在另一套 PVE 叢集掛接外部 RBD 與 CephFS、以及讓非特權 CT 在容器內直接掛載 CephFS。

架構與使用方式

部分在哪裡操作用途
一、來源 Ceph提供儲存的 PVE/Ceph 叢集取得 Monitor 位址、帳號與金鑰,建立專用帳號
二、外部 PVE另一套 PVE 叢集以 PVE 儲存的方式加入 RBD(VM/CT 磁碟)與 CephFS(ISO、範本)
三、CT 直接掛載非特權 LXC CT 內CT 用 ceph-fuse 直接掛載 CephFS 的某個目錄,多台 CT 共用

第二部分與第三部分是兩種不同的用戶端方式,彼此獨立。第三部分的 CT 不需要宿主機先掛載 CephFS,也不用 mp0、bind mount。

來源 Ceph 叢集

以下在提供儲存服務的來源叢集上執行。

查詢 Monitor 位址

grep mon_host /etc/pve/ceph.conf

記下所有 Monitor 的 IP,用戶端連線時都要用到。

確認儲存名稱與帳號

cat /etc/pve/storage.cfg
ceph fs ls
類型要確認的項目
RBDPVE 儲存 ID、pool、username
CephFSPVE 儲存 ID、fs-name、username

注意:PVE 儲存 ID、RBD Pool 名稱、CephFS 檔案系統名稱可能都不一樣。下面金鑰檔的檔名用的是 PVE 儲存 ID,不一定是 Pool 名稱,不要搞混。

取得 RBD 的 Keyring

給第二部分加入外部 RBD 使用:

cat /etc/pve/priv/ceph/<RBD儲存ID>.keyring

複製完整內容,包含 [client.xxx] 的標頭。檔案不存在的話,先確認儲存使用的 Ceph 帳號,再取得:

ceph auth get client.<帳號>

取得 CephFS 的 Secret

給第二部分加入外部 CephFS 使用:

cat /etc/pve/priv/ceph/<CephFS儲存ID>.secret

檔案不存在的話:

ceph auth get-key client.<帳號>

注意:PVE 的 RBD 設定要填完整的 Keyring;CephFS 的私鑰欄位只要單純的 Secret 字串。兩者格式不同,填錯就連不上。

為 CT 準備共享目錄與專用帳號

給第三部分使用。範例設定:

項目範例
CephFS 檔案系統名稱cephfs
來源 PVE 上的 CephFS 掛載路徑/mnt/pve/cephfs1
CephFS 裡的共享目錄/shared_data
CT 使用的 Ceph 帳號client.ftp

先確認 CephFS 真的有掛載,再建立目錄:

findmnt --mountpoint /mnt/pve/cephfs1 -o TARGET,SOURCE,FSTYPE,OPTIONS
mkdir -p /mnt/pve/cephfs1/shared_data

注意:不要只看到目錄存在就認定 CephFS 已經掛載。沒有掛載的話,mkdir 會在本機磁碟建立目錄,後面的資料也會寫錯地方。FSTYPE 要是 ceph。

建立只能存取這個目錄的專用帳號:

ceph fs authorize cephfs client.ftp /shared_data rw
ceph auth get client.ftp

輸出的完整 Keyring 保存起來,第三部分要放進 CT。用專用帳號的好處是權限只限這個目錄,CT 被入侵也碰不到其他資料;要撤銷時也只影響這個帳號。範例中兩台 CT 共用同一個帳號,需要分別撤銷的話,可以各建一個帳號授權同一個目錄。

另一套 PVE 叢集掛接外部 Ceph

以下在使用儲存的那一套 PVE 叢集上操作。這只是新增儲存連線,不會合併兩套叢集,也不會讓這套叢集變成來源 Ceph 的 MON 或 OSD。

前置條件

  • 各節點有安裝與來源相容的 Ceph 用戶端套件
  • 使用 RBD 的節點連得到來源的 MON 與 OSD
  • 使用 CephFS 的節點連得到來源的 MON、MDS 與 OSD

Ceph 的用戶端會直接連到每一台 OSD,不是只連 Monitor,防火牆要開放到整個 Ceph 的公用網路。

加入外部 RBD

「資料中心 → 儲存 → 增加 → RBD」:

欄位設定
ID這套叢集的儲存名稱,例如 ceph-ext
集區來源的 RBD Pool 名稱
Monitor來源 Monitor 的 IP,多個以空格分隔
帳號與 Keyring 對應的帳號,例如 admin,不加 client.
內容磁碟映像、容器
KRBD一般不勾
Keyring第一部分取得的完整 Keyring
節點允許使用的節點

CT 使用 RBD 時一律走核心的 krbd,不受 KRBD 勾選與否影響;KRBD 選項影響的是 VM。

加入後在各節點確認:

pvesm status

注意:不同的 PVE 叢集不會互相協調 VM/CT 的 ID。兩套叢集共用同一個 RBD Pool 的話,都有 vm-100-disk-0 時就會撞名,甚至可能刪到對方的磁碟。建議每套叢集用獨立的 Pool,或規劃好的 RBD namespace,絕對不能讓兩套叢集同時使用同一顆磁碟。

加入外部 CephFS

「資料中心 → 儲存 → 增加 → CephFS」:

欄位設定
ID例如 cephfs-ext
Monitor來源 Monitor 的 IP
帳號與 Secret 對應的帳號
檔案系統名稱ceph fs ls 查到的名稱
內容ISO 映像、容器範本等
私鑰第一部分取得的 Secret 字串
節點需要使用的節點
  • 檔案系統名稱不是 data pool 或 metadata pool 的名稱
  • 儲存 ID 是 cephfs-ext 時,會掛載在 /mnt/pve/cephfs-ext

確認:

pvesm status
findmnt --mountpoint /mnt/pve/cephfs-ext -o TARGET,SOURCE,FSTYPE,OPTIONS

FSTYPE 是 ceph 代表使用核心的 CephFS 用戶端掛載成功。

非特權 CT 直接掛載 CephFS

這個方式由 CT 裡的 ceph-fuse 直接連到 Ceph 叢集,宿主機不用掛載。範例是兩台跑 FTP 的 CT 共用 /shared_data。

注意:Proxmox VE 官方文件強烈不建議在 CT 裡使用 FUSE 掛載。原因是 suspend 與 snapshot 模式的備份需要凍結容器,而 Linux 核心的凍結機制遇到 FUSE 可能會卡住。採用這個做法,CT 的備份一律要用 stop 模式。

官方建議的替代做法是在宿主機掛載,再用 bind mount 給 CT。我這次選擇在 CT 內直接掛載,是因為:宿主機不需要另外保存 Ceph 帳號、每台 CT 可以用自己的專用帳號、CT 移轉到別的節點時不用每台宿主機都準備掛載。兩種做法各有取捨,請依環境評估。

範例參數

項目範例
CT ID100、101
Monitor IP10.10.10.11、10.10.10.12、10.10.10.13
CephFS 檔案系統名稱cephfs
Ceph 帳號client.ftp
CephFS 共享目錄/shared_data
CT 內的掛載路徑/mnt/shared

CT 的網路要能連到來源的 MON、MDS 與 OSD。兩台 CT 都要做以下設定。

啟用 CT 的 FUSE 功能

先把 CT 關機,「CT → 選項 → 功能 → 編輯」,勾選 FUSE,保留原本已勾的其他功能,再啟動 CT。

安裝套件

在 CT 內執行:

apt update
apt install ceph-fuse ceph-common
install -d -m 755 /etc/ceph
mkdir -p /mnt/shared

發行版內建的 Ceph 套件版本可能比來源叢集舊。一般來說較舊的用戶端可以連較新的叢集,但功能可能受限;遇到問題時,可以改用 Ceph 官方套件庫安裝相同版本的用戶端。

設定連線資訊

/etc/ceph/ceph.conf:

[global]
mon_host = 10.10.10.11,10.10.10.12,10.10.10.13

/etc/ceph/ceph.client.ftp.keyring:貼上第一部分 ceph auth get client.ftp 的完整內容。

chmod 600 /etc/ceph/ceph.client.ftp.keyring

這裡用的是完整的 Keyring,不是第二部分 CephFS 私鑰欄位的單純 Secret。

手動掛載測試

ceph-fuse -n client.ftp --client_fs cephfs -r /shared_data -o allow_other /mnt/shared
參數用途
-n client.ftpCeph 帳號
--client_fs cephfsCephFS 檔案系統名稱
-r /shared_data只掛載 CephFS 裡的這個目錄
-o allow_other允許 CT 內其他使用者存取(仍受檔案權限限制)
/mnt/shared掛載點
findmnt --mountpoint /mnt/shared
ls -ldn /mnt/shared

開機自動掛載

在 CT 的 /etc/fstab 加入:

none /mnt/shared fuse.ceph ceph.id=ftp,ceph.client_fs=cephfs,ceph.client_mountpoint=/shared_data,_netdev,allow_other 0 0

這行是透過 Ceph 的 mount.fuse.ceph 掛載輔助程式執行。在 FTP 還沒使用這個目錄時測試:

umount /mnt/shared
systemctl daemon-reload
mount /mnt/shared
findmnt --mountpoint /mnt/shared

再重新啟動 CT,確認開機後會自動掛載。

FTP 服務等掛載完成才啟動

以 vsftpd 為例:

systemctl edit vsftpd
[Unit]
RequiresMountsFor=/mnt/shared

[Service]
ExecStartPre=/usr/bin/mountpoint -q /mnt/shared
systemctl daemon-reload
systemctl restart vsftpd

這樣 CephFS 沒掛上時 FTP 不會啟動,避免使用者把檔案上傳到 CT 本機的空目錄。不過它只保證啟動時有掛載,執行中 CephFS 斷線還是要靠監控發現。

檔案權限

兩台 CT 的 FTP 帳號 UID、GID 必須一致:

id ftpuser

兩台都是 1000:1000 的話,在其中一台設定共享目錄:

chown 1000:1000 /mnt/shared
chmod 2770 /mnt/shared
  • 這是 CT 內直接掛載,不會有 bind mount 那種非特權 CT 的 UID 偏移(100000)
  • Ceph 帳號的授權和 Unix 檔案權限都要允許,才能存取
  • 用 FTP 虛擬帳號的話,要確認它實際對應到哪個本機帳號
  • 不要對整個目錄遞迴修改權限,多使用者的環境要分別規劃

雙台驗證

  1. 從 CT 100 的 FTP 上傳測試檔
  2. 從 CT 101 確認看得到、可以下載
  3. 依權限測試修改、改名、刪除
  4. 反過來由 CT 101 上傳、CT 100 驗證
  5. 重新啟動兩台 CT,確認掛載與 FTP 都正常啟動

共用 CephFS 只共用檔案,兩台 FTP 的帳號、密碼、設定與記錄不會自動同步。也要避免兩台同時寫入同一個檔案。

備份、移轉與 HA

CT 的備份

  • 一律用 stop 模式,不要用 snapshot 或 suspend 模式
  • stop 模式備份時,該 CT 的 FTP 服務會暫時中斷

CephFS 資料的備份

  • CT 的備份不包含 CephFS 裡的共享資料,要另外安排備份
  • 還原 CT 也不會還原 CephFS 的資料

移轉與 HA

  • CT 在其他節點啟動後會重新掛載 CephFS
  • 所有可能接手的節點,都要允許 CT 使用 FUSE,網路也要連得到 Ceph
  • 實際測試移轉、節點重新開機、HA 接手之後,掛載與 FTP 的啟動順序都正常

對外連線

兩台 FTP 前面放同一個 VIP 或負載平衡器時,要確保控制連線與被動模式的資料連線導向同一台,並設定好被動模式的通訊埠範圍與對外 IP,否則會出現登入成功、但列目錄或傳檔失敗的狀況。

結論

讓另一套 PVE 叢集或 CT 當成 Ceph 的用戶端,就能共用來源叢集的儲存空間,不用合併叢集。PVE 掛接外部 RBD/CephFS 是官方支援的標準做法;CT 內直接用 ceph-fuse 掛載則要接受備份只能用 stop 模式的限制,評估清楚再採用。

另外兩個重點:每套叢集用獨立的 Pool 避免磁碟撞名,CT 用的帳號只授權它需要的目錄。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀