本文主要介紹如何用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中新寫入的數據,只用把容器銷燬並重啓,才能同步並讀到新的數據。