1)概述
1)ceph版本:nautilus版
2)kuberntes集群环境:v1.14.2
3)集成方式:pod中的Volumes字段直接输入ceph rbd块相关的信息。相关yaml资源是来自kubernetes github的example。
2)现象
kubectl describe pod pod-rbd命令,发现rbd块已attach到目标节点,但是kubelet执行挂载动作的时候失败并输出报错: failed to mount unformatted volume as read only。
3)pod的yaml资源
将kubernetes github example中的yaml文件进行修改:将monitors字段修改成我ceph集群的monitor实例。
4)疑惑
远程ceph集群中的rbd块已经attach到目标节点,kubelet在执行只读mount动作的时候失败(目标rbd块是没有文件系统的),为何mount之前不会对rbd块进行文件系统格式化,这一步为何被漏掉?我想象中的流程是:kubelet调用rbd命令将rbd块映射到目标节点,执行mkfs命令对rbd块进行指定一种文件系统进行格式化,最后一步是以只读方式mount这个rbd块。
5)kubelet执行挂载操作的源码
6)解决方式
将volume中的readOnly字段设置为false,此时kubelet在第一次挂载目标卷的时候会失败,于是尝试对没有文件系统的卷进行一次格式化,而后再执行一次挂载操作。