本文主要介绍如何用kubernentes挂载rbd目录。以及其中遇到的问题。有关ceph和rbd相关请自行百度。node
参照github上kubernetes/examples/rbd/ 目录下的范例,咱们能够建立一个挂载rbd存储的容器。前提是:git
当前网络中有一个ceph服务器github
slaver节点上要安装ceph client。json
从ceph服务器上获取client,monitor等关键信息。bash
具体步骤以下:服务器
参照github上的案例,先建立一个secret
secret中存储的是ceph client与server之间通讯须要的keyring。咱们能够在ceph server 机器上的/etc/ceph/目录中找到许多keyring,这里选用 /etc/ceph/ceph.client.admin.keyring
,其内容通常是:
key: AQADW11WlqGlMBAAYnKIIExLAlde8rG1SGAYQQ==
复制并替换ceph-secret,yaml中的相应字段(data字段下的‘key’)并保存。而后执行
kubectl create -f ceph-secret.yaml
并检查secret是否建立成功。网络
建立容器,挂载rbd volume
建立容器时,经过json文件咱们能够很清楚的看到,咱们引用了一个secret(secretRef)。直接执行
kubectl create -f *.json
便可。code
建立后咱们经过kubectl get pods
就能看到容器是否建立,执行kubectl exec -it {podname} /bin/bash
进入容器,能够找到相应的挂在目录。到这里,就能够肯定容器已经正常启动并挂载了一个rbd的存储块。server
咱们注意到建立容器的json文件中指定了"readOnly" :false
,这意味着咱们在容器里面能够随意的在挂载目录中建立/删除文件。ip
那么,多个节点,多个容器是否能够共享一个存储呢?
假设第一步咱们建立的容器ca是在节点a上运行的,而且k8s集群中只有三台slaver:a,b,c。
咱们再建立一个实例数为5的replication controller,他也会挂载这个rbd块,而且也是读写模式,建立后执行kubectl get pods
和 kubectl describe pod {podname}
,那么由于节点a上挂载了该rbd块,k8s会youxian将新的rc中的容器逐一调度到其余机器上(b和c)。被调度到新机器上的容器,会在启动过程当中提示:
FailedSync Error syncing pod, skipping: rbd: image testdevice is locked by other nodes
意思是这个rbd块已经被别的节点锁定了(就是说节点a已经锁定了该rbd块,其余节点不能再挂载它)。而rc中剩余的pod,会直接没法调度,并提示:
pod (rbdrc-cokvq) failed to fit in any node
fit failure on node (10.126.72.31): NoDiskConflict
fit failure on node (10.126.72.32): NoDiskConflict
fit failure on node (10.126.72.33): NoDiskConflict
意思是k8s找不到‘尚未分配这个rbd块’的节点。
若是咱们强制将该rc指定部署到以前的a节点上呢?经过"nodeName":{nodeIP}
能够指定将rc中的pod优先部署到指定的节点上,尝试以后,发现容器能够正常运行。
结论1:rbd挂载以节点为粒度,若是某节点上的某容器以读写模式挂载了rbd块,那么该rbd块就会被该节点锁定。
若是咱们新建的rc不是可读写的,而是只读的呢?
rbdrc-nu32o 1/1 Running 0 5m
rbdrc-olv14 0/1 Pending 0 5m
rbdrc-qyw2u 0/1 Pending 0 5m
rbdrc-rxmdr 1/1 Running 0 5m
rbdrc-snd3x 0/1 Pending 0 5m
咱们能够看到只有两个pod正常运行。咱们用kubectl describe pod {podname}
检查这几个pod,发现running状态的两个pod分别被调度到了b,c节点都处于NoDiskConflict
状态。
结论2:若是某节点上的某容器以读写模式挂载了rbd块,那么其余节点依然能够对这个块进行只读模式的挂载。
结论3:k8s会对挂载rbd的pod进行惟一调度,就是说若某个节点挂载了rbd块A1,k8s会将后续挂载A1的pod调度到别的节点部署。(除非强制指定)
另:ceph rbd块被挂载后,写入数据是能够很快同步的(具体多久须要调查),而读取数据只能在map后同步。这就是说,若是同时又一个读写的容器a和一个只读容器b在运行,在容器a中新写入的数据,只用把容器销毁并重启,才能同步并读到新的数据。