k8s環境中ceph rbd已經被掛載問題分析解決

背景

以前爲k8s準備了ceph rbd塊存儲,可是最近再使用過程當中發現了一個因爲deployment更新致使rdb不能被正常掛載的問題。node

問題描述

咱們經過deployment生成一個pod,而且這個pod掛載一個rbd塊存儲用來提供持久化存儲功能。有一次deployment更新,發現deployment先啓動了一個被調度到其它node新的pod一直處於pending狀態,而對於的老pod一直處於Terminating狀態。致使了這次更新失敗。git

問題排查

  1. 經過describe新pod發現以下報錯:
    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
  2. 經過google和官方文檔發現ceph rbd共享掛載的一些特性:
    • ceph rbd塊存儲能在同一個node上跨pod以ReadWriteOnce共享掛載
    • ceph rbd塊存儲能在同一個node上同一個pod多個容器中以ReadWriteOnce共享掛載
    • ceph rbd塊存儲不能跨node以ReadWriteOnce共享掛載
    • 若是一個使用ceph rdb的pod所在的node掛掉,這個pod雖然會被調度到其它node,可是因爲rbd不能跨node屢次掛載和掛掉的pod不能自動解綁pv的問題,這個新pod不會正常運行
  3. 咱們知道了ceph rbd共享掛載的特性,咱們再結合deployment更新的特性:
    • deployment觸發更新的時候,它確保至少所需 Pods 75% 處於運行狀態(最大不可用比例爲 25%)。故像一個pod的狀況,確定是新建立一個新的pod,新pod運行正常以後,再關閉老的pod。
    • 默認狀況下,它可確保啓動的 Pod 個數比指望個數最多多出 25%

緣由

結合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

相關文章
相關標籤/搜索