1. 程式人生 > >讓k8s使用nbd掛載ceph的塊儲存

讓k8s使用nbd掛載ceph的塊儲存

細節決定一切
網上很多文件預設都是隻安裝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的一些報