讓k8s使用nbd掛載ceph的塊儲存
阿新 • • 發佈:2019-04-12
細節決定一切
網上很多文件預設都是隻安裝ceph-common然後直接rbd來跑ceph的rbd。
其實ceph的rbd塊裝置本地對映有兩種方式:
盜個圖(http://www.zphj1987.com/2016/05/19/ceph%E7%9A%84jewel%E6%96%B0%E6%94%AF%E6%8C%81%E7%9A%84rbd-nbd/):
- rbd核心掛載
- nbd掛載的方式
優缺點:rbd核心更新速度跟不上nbd和librbd的更新速度,imageFormat=2的很多特性rbd核心都不支援,另外從穩定性上來說,nbd模組+librbd的方式比較老牌了,rbd.ko就有點落後了,除非有很強大的核心團隊,速度上來說,概念上nbd速度多了使用者態到核心態的資料傳輸,理論上速度差一些,但是要看具體的測試結果,為啥呢:本地快取和科學利用。
k8s在處理rbd store的執行器上,rbd和rbd-nbd都是同時支援的,但是程式碼上沒有這個開關,只有在裡面做了一個是否安裝rbd-nbd的依賴判斷,look this:
// Check if rbd-nbd tools are installed. func checkRbdNbdTools(e mount.Exec) bool { _, err := e.Run("modprobe", "nbd") if err != nil { klog.V(5).Infof("rbd-nbd: nbd modprobe failed with error %v", err) return false } if _, err := e.Run("rbd-nbd", "--version"); err != nil { klog.V(5).Infof("rbd-nbd: getting rbd-nbd version failed with error %v", err) return false } klog.V(3).Infof("rbd-nbd tools were found.") return true } ...... // Evalute whether this device was mapped with rbd. devicePath, mapped := waitForPath(b.Pool, b.Image, 1 /*maxRetries*/, false /*useNbdDriver*/) // If rbd-nbd tools are found, we will fallback to it should the default krbd driver fail. nbdToolsFound := false if !mapped { nbdToolsFound = checkRbdNbdTools(b.exec) if nbdToolsFound { devicePath, mapped = waitForPath(b.Pool, b.Image, 1 /*maxRetries*/, true /*useNbdDriver*/) } }
其實我覺得rbd的方式依賴反而比nbd更多,rbd.ko需要同時依賴ceph.ko libceph.ko,nbd的方式nbd.ko是大多數核心預設支援的,librbd僅僅是個本地庫而已。
另外rbd-nbd儘可能使用L版的,J版的rbd-nbd好像程式碼只實現了基本功能,很多引數不支援,這會導致k8s對nbd的一些報