在Kubernetes中,容器化一個應用比較麻煩的地方莫過於對其"狀態"的管理,而最多見的"狀態",莫過於存儲狀態.
在[Kubernetes]深刻理解StatefulSet這篇文章中,稍微提了一下PV(Persistent Volume)和PVC(Persistent Volume Claim),這篇文章詳細說一說.node
大概瞭解 |
我先大致說一下整個過程,有一個小小的認識,而後我再詳細展開說.
用戶提交請求建立Pod時,Kubernetes發現這個Pod聲明使用了PVC,這時就須要PersistentVolumeController幫它找一個PV來進行配對.若是有的話呢,就直接進行綁定.可是若是沒有呢?就去找對應的StorageClass,幫它新建立一個PV,而後再和PVC進行綁定.可是請注意,此時新建立的PV,只是一個API對象,還須要通過"兩階段"處理變成宿主機上的"持久化Volume"纔算是真正有用.這個時候,Pod就能夠正常啓動,並將相關文檔掛載到容器內指定的路徑.
我知道你對上面的過程確定有些懵了,別急,我們慢慢把這個過程剖析一下.web
持久化Volume |
比較難理解的應該就是須要通過"兩階段"處理變成宿主機上的"持久化Volume"這部份內容了.
所謂"持久化Volume",指的就是這個宿主機上的目錄,具有"持久性",也就是說:這個目錄裏面的內容,既不會由於容器的刪除而被清理掉,也不會和當前的宿主機進行綁定.這樣,當容器被重啓或者在其餘節點上重建出來以後,仍然可以經過掛載這個Volume來訪問到目錄裏面的內容.
這裏面主要有兩個關鍵點:一,不會由於容器的刪除而清理掉裏面的內容,二,不會和當前的宿主機進行綁定.Kubernetes須要作的工做就是達到這兩個目的,從而使得目錄具有"持久性".服務器
Kubernetes在這個準備"持久化"宿主機目錄的過程當中,咱們能夠形象的稱爲"兩階段處理":
第一階段:爲虛擬機掛載磁盤,把這個階段稱爲"Attach".
第二階段:掛載磁盤以後,若是想要使用,還須要將掛載的磁盤進行格式化處理,並掛載到Volume宿主機目錄上,這個階段稱爲"Mount",而這個掛載點,正是Volume的宿主機目錄.因此,Mount階段的操做,能夠這樣來表示:運維
# 經過 lsblk 命令獲取磁盤設備 ID $ sudo lsblk # 格式化成 ext4 格式 $ sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/< 磁盤設備 ID> # 掛載到掛載點 $ sudo mkdir -p /var/lib/kubelet/pods/<Pod 的 ID>/volumes/kubernetes.io~<Volume 類型 >/<Volume 名字 > #若是kubelet須要做爲client,將遠端NFS服務器的目錄掛載到Volume的宿主機目錄上,則須要執行如下命令: $ mount -t nfs <NFS 服務器地址 >:/ /var/lib/kubelet/pods/<Pod 的 ID>/volumes/kubernetes.io~<Volume 類型 >/<Volume 名字 >
以上兩個階段完成以後,咱們在這個目錄裏寫入的全部文件,就都會被保存起來,從而實現了對這個Volume宿主機目錄的"持久化".(若是給虛擬機擴充過磁盤的話,對這一部份內容應該是比較容易理解的)
可是對於Kubernetes來講,它是如何定義和區分這兩個階段的呢?
其實很簡單,在具體的Volume插件的實現接口上,Kubernetes分別給這兩個階段提供了兩種不一樣的參數列表:svg
StorageClass |
PV這個對象的建立,是由運維人員來完成的,可是在大規模的生產環境中,這實際上是一個很是麻煩的操做.由於在一個大規模的Kubernetes集羣裏,可能有成千上萬個PVC,這就意味着運維人員必須實現建立出這個多個PV,此外,隨着項目的須要,會有新的PVC不斷被提交,那麼運維人員就須要不斷的添加新的,知足要求的PV,不然新的Pod就會由於PVC綁定不到PV而致使建立失敗.這在自動化中,確定是不能被容許的.
因此,Kubernetes提供了一套能夠自動建立PV的機制,即:Dynamic Provisioning.而這個機制的核心在於:StorageClass這個API對象.學習
有了這兩個信息以後,Kubernetes就可以根據用戶提交的PVC,找到一個對應的StorageClass,以後Kubernetes就會調用該StorageClass聲明的存儲插件,進而建立出須要的PV.
可是其實使用起來是一件很簡單的事情,你只須要根據本身的需求,編寫YAML文件便可,而後使用kubectl create命令執行便可..net
最後小結 |
到這裏,講的就差很少了.
綜上所述呢,PVC描述的是Pod想要使用的持久化存儲的屬性,好比存儲的大小,讀寫權限等.而PV則是一個具體的Volume屬性,好比Volume的類型,掛載目錄等.而StorageClass的做用,則是充當PV的模板,從而能夠動態建立須要的PV.
最後,放一張圖片,描述一下概念之間的關係:
插件
些許的碎碎念 |
最後的最後,寫點兒碎碎念.若是看的進去的話,就看看,看不進去,就算了.
今天早上打開手機,收到了一條消息:
在上面介紹StorageClass的時候,我說了,若是想要使用的話,實際上是一件很簡單的事情,只須要寫一下YAML文件便可.可是背後的原理若是不去深究,不去學習的話,遇到問題的時候,仍是無從下手的.
還記得當時倒騰k8s,一個月的時間就倒騰的差很少了,項目上線的時候,也是有驚無險的撐了下來.因此呢,若是隻是達到會用的層次的話,一個月的時間就差很少了.
可是若是想要有所提升,想要在遇到問題時,可以準肯定位,仍是須要再回來補充理論.
作技術,前期的實踐當然是不可少,可是後期的理論也要作.絕對不能僅僅停留在會用的層次上面,若是有時間,有精力,最好仍是可以再深刻理解一下背後的原理知識.
這也是我一直堅持的學習方法:基於實踐,補充理論.code
以上內容來自我學習<深刻剖析Kubernetes>專欄文章以後的一些看法,有偏頗之處,還望指出.
感謝您的閱讀~xml