kubernetes掛載存儲

本文主要介紹如何用kubernentes掛載rbd目錄。以及其中遇到的問題。有關ceph和rbd相關請自行百度。node

如何建立

參照github上kubernetes/examples/rbd/ 目錄下的範例,咱們能夠建立一個掛載rbd存儲的容器。前提是:git

  1. 當前網絡中有一個ceph服務器github

  2. slaver節點上要安裝ceph client。json

  3. 從ceph服務器上獲取client,monitor等關鍵信息。bash

具體步驟以下:服務器

  1. 參照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是否建立成功。網絡

  2. 建立容器,掛載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 podskubectl 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中新寫入的數據,只用把容器銷燬並重啓,才能同步並讀到新的數據

相關文章
相關標籤/搜索