以前爲k8s準備了ceph rbd塊存儲,可是最近再使用過程當中發現了一個因爲deployment更新致使rdb不能被正常掛載的問題。node
咱們經過deployment生成一個pod,而且這個pod掛載一個rbd塊存儲用來提供持久化存儲功能。有一次deployment更新,發現deployment先啓動了一個被調度到其它node新的pod一直處於pending狀態,而對於的老pod一直處於Terminating狀態。致使了這次更新失敗。git
Warning FailedAttachVolume 15m attachdetach-controller Multi-Attach error for volume "pvc-c78521e4-196e-4d7a-9858-23cf0b021d43" Volume is already used by pod(s) atd-dashboard-66958b6996-xggl4 Warning FailedMount 118s (x2 over 11m) kubelet, work4 Unable to attach or mount volumes: unmounted volumes=[data], unattached volumes=[default-token-66blg yunlian-configmap data atdrtapi-configmap dashboard-configmap]: timed out waiting for the condition
結合ceph rb共享掛載的特性和deployment更新的特性,咱們發現緣由以下:
因爲deployment觸發更新,爲了保證服務的可用性,deployment要先建立一個pod並運行正常以後,再去刪除老pod。而若是新建立的pod和老pod不在一個node,就會致使此故障。github
1,使用能支持跨node和pod之間掛載的共享存儲,例如cephfs,GlusterFS等
2,給node添加label,只容許deployment所管理的pod調度到一個固定的node上。(不建議,這個node掛掉的話,服務就故障了)api
https://kubernetes.io/zh/docs/tutorials/stateful-application/basic-stateful-set/
https://github.com/rook/rook/issues/1507app