让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/):
de733fb7cac4bea6f70cffea20b5e26f310.jpg

  • 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的一些报错。

 

转载于:https://my.oschina.net/xueyi28/blog/3036078

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值