系統環境
- Centos8
- Kubernetes 1.19.3 集群( 3 master + 3 work)
- Rook安裝ceph集群(3 osd配置在master節點)
問題描述
通過指定Pod StorageClass關聯動態創建ceph block pv,當Pod實例調度到master節點后一直處於Pending狀態,檢查Pod日志發現:MountVolume.MountDevice failed for volume "pvc-caaaecd7-4068-4817-ac4e-f2f41bd82aee" : kubernetes.io/csi: attacher.MountDevice failed to create newCsiDriverClient: driver name rook-ceph.rbd.csi.ceph.com not found in the list of registered CSI drivers錯誤信息。
解決過程
問題分析
根據錯誤信息可以發現問題是出在pod掛載pv時,因無法找到rook-ceph.rbd.csi.ceph.com驅動。但是這個pod在work節點時是正常運行的,調度到master節點時卻產生錯誤。我們知道k8s master節點因為taints的原因一般情況下常規pod是不會調度到master節點的,我們的pod之所以可以調度在master節點是因為設置了tolerations,那么是不是因為master節點沒有運行相關ceph csi相關的pod?
初步解決
1、檢查csi相關的pod
kubectl get pod -n rook-ceph | grep csi
相關csi的pod共有四個csi-cephfsplugin、csi-cephfsplugin-provisioner、csi-rbdplugin、csi-rbdplugin-provisioner,並且這四個都是運行在work節點。我們使用的是block存儲,實際上我們只需要關注csi-rbdplugin和csi-rbdplugin-provisioner。
2、檢查csi-rbdplugin和csi-rbdplugin-provisioner的調度控制器
kubectl get deployment,daemonset,statefulset -n rook-ceph | grep csi-rbdplugin
檢查發現csi-rbdplugin-provisioner是deployment控制器,csi-rbdplugin是daemonset控制器,daemonset控制器可以保障每個可調度節點運行一份副本,做為節點csi驅動daemonset相比deployment更適合一些,那么csi-rbdplugin更有可能是csi驅動管理pod,那么我們就先將它調度到master節點試試。
3、編輯csi-rbdplugin deployment使可以調度到master節點
kubectl edit daemonset csi-rbdplugin -n rook-ceph
4、檢查csi-rbdplugin調度結果
kubectl get pod -n rook-ceph -o wide | grep csi-rbdplugin
csi-rbdplugin的pod實例已經由3個變成了6 ,所有master節點和node節點都運行 起來
5、檢查需要加載ceph pv是master節點pod狀態
kubectl get pod –o wide | grep csirbd-demo
Pod已經在master節點正常運行,pv看來是正常加載了,那么問題真的解決了嗎?
再起風波
哎呦,今天解決個小問題,美滋滋的。晚上下班檢查並關閉好服務器,回家了。。。第二天早上,到公司開啟服務器后習慣性的檢測下pod的狀態。喲,昨天那個pod又pending了?kubectl logs看下日志,咋還是昨天的錯誤?趕緊的看下csi-rbdplugin的pod發現主節點上又沒運行了,而daemonset配置項中昨天添加的tolerations也沒了。。
好吧,修改過的daemonset竟然恢復了,那么看來rook有一定的恢復機制,那么也只能從rook的配置信息入手了,翻看官方文檔當,這個東西只能從rook配置參數入手了。
最終方案
1、初步發現
在rook ceph群集配置文件中發現cluster.yaml文件中有placement用來控制pod的調度。但是經過測試這參數只能控制osd、mgr、mon等pod的調度。再之后發現driveGroups配置參數,但是它只是控制osd的加載及分組。翻看了無數rook ceph相關的文擋,都沒有發現有csi相關pod調度的配置信息。無奈只能在github的rook源碼中查詢所有相關csi的文件了
,最終在operator.yaml文件中找到了CSI_PLUGIN_TOLERATIONS配置項,看來它就是csi tolerations調度的關鍵了。最重要的是,官方搞了那么多使用方面的文擋而這么重要的配置信息卻沒有相關文擋?
2、修改operator.yaml,並執行變更
kubectl apply -f operator.yaml
csi-rbdplugin又在master節點上調度運行了,問題也終於解決了。
3、其它
operator.yaml實際上最終是要反應在k8s對象中去的,經過排查,我們在operator.yaml中修改的CSI_PLUGIN)TOLERATIONS最終是體現在rook-ceph-operator-config這個configmap配置中,也可以通過直接修改這個達到目地



