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

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

Jason Cheng 發布 瀏覽 36 次
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 不需要PVE 主機先掛接 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 檔案系統名稱可能都不一樣。後面的指令要填的是 Pool 名稱與檔案系統名稱,不是 PVE 儲存 ID,不要搞混。username 若是 admin,代表那是管理員帳號,不要拿給外部叢集使用。

建立外部 PVE 用的 RBD 帳號

給第二部分加入外部 RBD 使用。不要把來源叢集的 client.admin 複製出去:超融合 PVE 自動建立的 RBD 儲存用的就是 admin 帳號,/etc/pve/priv/ceph/ 底下的金鑰檔通常就是管理員金鑰。Proxmox 官方文件也建議另建只具備儲存所需權限的帳號:

ceph auth get-or-create client.pve-ext-rbd \
  mon 'profile rbd' \
  osd 'profile rbd pool=pve-ext' \
  mgr 'profile rbd pool=pve-ext'

pve-ext 換成給這套叢集專用的 Pool,要先在來源叢集建立(原因見第二部分的撞名提醒)。輸出就是完整的 Keyring,包含 [client.pve-ext-rbd] 標頭;之後要再取得用 ceph auth get client.pve-ext-rbd。每套外部 PVE 各建一個帳號,撤銷時互不影響。

建立外部 PVE 用的 CephFS 帳號

給第二部分加入外部 CephFS 使用,同樣另建帳號:

ceph fs authorize cephfs client.pve-ext-fs / rw
ceph auth get-key client.pve-ext-fs

範例授權整個 CephFS。只想讓它使用某個目錄的話,把 / 換成該目錄(目錄要先建立),加入儲存後再以 pvesm set <儲存ID> --subdir <目錄> 指定掛接的子目錄。get-key 輸出的是單純的 Secret 字串。

注意: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
findmnt -rn -t ceph --mountpoint /mnt/pve/cephfs1 >/dev/null && \
  mkdir -p /mnt/pve/cephfs1/shared_data

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

建立限定這個目錄的專用帳號:

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

輸出的完整 Keyring 保存起來,第三部分要放進 CT。用專用帳號,權限比 client.admin 小得多,要撤銷時也只影響這個帳號。範例中兩台 CT 共用同一個帳號,需要分別撤銷的話,可以各建一個帳號授權同一個目錄。

注意:Ceph Reef 起,對已存在的帳號執行 fs authorize 是追加授權,不會移除原有的其他路徑。請用新的帳號名稱,並以 ceph auth get 確認 caps 只有預期的路徑。

不過這個路徑限制不等於資料隔離,CT 被入侵、Keyring 外洩時,仍要考慮下面幾點:

  • 路徑限制只管 MDS 的目錄樹
    ceph fs authorize 產生的 OSD 權限涵蓋整個 CephFS 資料集區。Ceph 官方文件說明,用戶端仍可直接透過 RADOS 存取底層的檔案資料,其他目錄的檔案內容有被讀取或覆寫的風險
  • 要完整隔離得用 RADOS namespace
    以檔案配置(file layout)把這個目錄的資料放進獨立的 namespace,再把帳號的 OSD 權限限制在該 namespace。不信任的用戶端,Ceph 官方建議用這種方式
  • 共享目錄本身沒有保護
    帳號有讀寫權限,入侵者可以讀取、修改、刪除 /shared_data 的全部內容,兩台 CT 共用時另一台的檔案也一樣。這個目錄要另外備份
  • CT 要連得到 Ceph 的公用網路
    CT 會直接連到 MON、MDS 與每一台 OSD,等於把儲存網路開放給這台 CT;帳號對 Monitor 雖然只有讀取權限,仍能看到叢集的節點位址等資訊

另一套 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,多個以空格分隔
帳號第一部分建立的帳號,例如 pve-ext-rbd,不加 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
帳號第一部分建立的帳號,例如 pve-ext-fs
檔案系統名稱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 叢集,PVE 主機不用掛接。範例是兩台跑 FTP 的 CT 共用 /shared_data。

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

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

範例參數

項目範例
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 套件版本可能比來源叢集舊。一般來說較舊的用戶端可以連較新的叢集,但功能可能受限;CephFS 若用 ceph fs required_client_features 設了用戶端不支援的功能,舊用戶端會直接無法連線(已連線的會被踢掉)。遇到問題時,可以改用 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 虛擬帳號的話,要確認它實際對應到哪個本機帳號
  • 不要對整個目錄遞迴修改權限,多使用者的環境要分別規劃
  • 不同帳號、同一群組協作時,2770 的 setgid 只讓新檔案繼承群組,不保證群組可寫,還要搭配 vsftpd 的 local_umask、file_open_mode 或預設 ACL

雙台驗證

  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 能被接手:CT 的根磁碟也要在接手節點存取得到。放在外部 RBD 這類共享儲存才符合 HA 條件;放在故障節點的 local-lvm 無法接手;本機 ZFS 搭配儲存複寫可以配合 HA,但會遺失最後一次複寫之後的變更
  • CT 沒有線上移轉,移轉是先關機再搬(restart migration),進行中的 FTP 連線會中斷
  • 所有可能接手的節點,都要允許 CT 使用 FUSE,網路也要連得到 Ceph
  • 實際測試移轉、節點重新開機、HA 接手之後,掛接與 FTP 的啟動順序都正常

對外連線

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

結論

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

另外兩個重點:每套叢集用獨立的 Pool 避免磁碟撞名,CT 用的帳號只授權它需要的目錄。路徑限制只管目錄樹、不隔離底層資料,CT 對外提供服務、有被入侵的風險時,要搭配 RADOS namespace 或改用 PVE 主機掛接再 bind mount 的做法。

參考資料

Jason Cheng

Jason Cheng

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

關於作者 →

延伸閱讀