细节决定一切
网上很多文档默认都是只安装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的一些报错。
所有评论(0)