存儲基礎知識
云容器引擎使用Kubernetes編排系統作為集群、應用、存儲、網絡等模塊的管理平臺。本文為您介紹容器存儲相關的基礎知識,以便在使用容器服務的存儲能力時,了解相應模塊的基礎知識和使用原則。
數據卷(Volume)
因為容器中的文件在磁盤上是臨時存放的,所以Kubernetes定義了數據卷(Volume)以解決容器中的文件因容器重啟而丟失的問題。數據卷(Volume)是Pod與外部存儲設備進行數據傳遞的通道,也是Pod內部容器間、Pod與Pod間、Pod與外部環境進行數據共享的方式。數據卷(Volume)定義了外置存儲的細節,并內嵌到Pod中作為Pod的一部分。實質是外置存儲在Kubernetes系統的一個資源映射,當負載需要使用外置存儲的時候,可以從數據卷(Volume)中查到相關信息并進行存儲掛載操作。
| 數據卷(Volume)分類 | 描述 |
|---|---|
| 本地存儲 | 適用于本地存儲的數據卷,例如HostPath、emptyDir等。本地存儲卷的特點是數據保存在集群的特定節點上,并且不能隨著應用漂移,節點停機時數據即不再可用。 |
| 網絡存儲 | 適用于網絡存儲的數據卷,例如Ceph、GlusterFS、NFS、iSCSI等。網絡存儲卷的特點是數據不在集群的某個節點上,而是在遠端的存儲服務上,使用存儲卷時需要將存儲服務掛載到本地使用。 |
| Secret和ConfigMap | Secret和ConfigMap是特殊的數據卷,其數據是集群的一些對象信息,該對象數據以卷的形式被掛載到節點上供應用使用。 |
| PVC | 一種數據卷定義方式,將數據卷抽象成一個獨立于Pod的對象,這個對象定義(關聯)的存儲信息即存儲卷對應的真正存儲信息,供Kubernetes負載掛載使用。 |
數據卷(Volume)使用原則:一個Pod可以掛載多個數據卷(Volume)。一個Pod可以掛載多種類型的數據卷(Volume)。每個被Pod掛載的Volume卷,可以在不同的容器間共享。Kubernetes環境推薦使用PVC和PV方式掛載數據卷(Volume)。雖然單Pod可以掛載多個數據卷(Volume),但是并不建議給一個Pod掛載過多數據卷。
PV和 PVC
并非所有的Kubernetes數據卷(Volume)具有持久化特征,為了實現持久化的實現,容器存儲需依賴于一個遠程存儲服務。為此Kubernetes引入了PV和PVC兩個資源對象,將存儲實現的細節從其如何被使用中抽象出來,并解耦存儲使用者和系統管理員的職責。PV和PVC的概念如下:
PV,PV是PersistentVolume的縮寫,譯為持久化存儲卷。PV在Kubernetes中代表一個具體存儲類型的卷,其對象中定義了具體存儲類型和卷參數。即目標存儲服務所有相關的信息都保存在PV中,Kubernetes引用PV中的存儲信息執行掛載操作。PVC,PVC是PersistentVolumeClaim的縮寫,譯為存儲聲明。PVC是在Kubernetes中一種抽象的存儲卷類型,代表了某個具體類型存儲的數據卷表達。其設計意圖是分離存儲與應用編排,將存儲細節抽象出來并實現存儲的編排。這樣Kubernetes中存儲卷對象獨立于應用編排而單獨存在,在編排層面使應用和存儲解耦。
PVC和PV的綁定:PVC與PV是一一對應關系,不能一個PVC掛載多個PV,也不能一個PV掛載多個PVC。為應用配置存儲時,需要聲明一個存儲需求聲明(PVC),而Kubernetes會通過最佳匹配的方式選擇一個滿足PVC需求的PV,并與之綁定。所以從職責上PVC是應用所需要的存儲對象,屬于應用作用域。PV是存儲平面的存儲對象,屬于整個存儲域。
PVC只有綁定了PV之后才能被Pod使用,而PVC綁定PV的過程即是消費PV的過程,這個過程是有一定規則的,以下規則都滿足的PV才能被PVC綁定。
VolumeMode:被消費PV的VolumeMode需要和PVC一致。
AccessMode:被消費PV的AccessMode需要和PVC一致。
StorageClassName:如果PVC定義了此參數,PV必須有相關的參數定義才能進行綁定。
LabelSelector:通過標簽(labels)匹配的方式從PV列表中選擇合適的PV綁定。
Size:被消費PV的capacity必須大于或者等于PVC的存儲容量需求才能被綁定。
PVC和PV里面的size字段作用如下:
PVC、PV綁定時,會根據各自的size進行篩選。
通過PVC、StorageClass動態創建PV時,有些存儲類型會參考PVC的size創建相應大小的PV和后端存儲。
對于支持Resize操作的存儲類型,PVC的size作為擴容后PV、后端存儲的容量值。
一個PVC、PV的size值只是在執行一些PVC和PV管控操作的時候,作為配置參數來使用。
真正的存儲卷數據流寫數據的時候,不會參考PVC和PV的size字段,而是依賴底層存儲介質的實際容量。
數據卷(Volume)使用方式
常見的容器存儲數據卷使用方式如下:
靜態存儲卷:靜態存儲卷一般是指由管理員創建的PV。所有的數據卷(Volume)都支持創建靜態存儲卷。靜態存儲卷先由集群管理員分析集群中存儲需求,并預先分配一些存儲介質(例如云盤、NAS盤等),同時創建對應的PV對象。創建好的PV對象等待PVC來消費。如果負載中定義了PVC需求,Kubernetes會通過相關規則實現PVC和匹配的PV進行綁定,這樣就實現了應用對存儲服務的訪問能力。
動態存儲卷:動態存儲卷一般是指通過存儲插件自動創建的PV。動態卷一般由集群管理員配置好后端的存儲池,并創建相應的模板(StorageClass),當有PVC需要消費PV的時候,根據PVC定義的需求,并參考StorageClass的存儲細節,由存儲插件動態創建一個PV。StorageClass的定義如下:
StorageClass:當您聲明一個PVC時,如果在PVC中添加了StorageClassName字段,意味著當PVC在集群中找不到匹配的PV時,會根據StorageClassName的定義觸發相應的Provisioner插件創建合適的PV供綁定,即創建動態數據卷。動態數據卷由Provisioner插件創建,并通過StorageClassName與PVC進行關聯。StorageClass可譯為存儲類,表示為一個創建PV存儲卷的模板。在PVC觸發自動創建PV的過程中,即使用StorageClass對象中的內容進行創建。其內容如下:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name:alicloud-disk-topology parameters: type:cloud_ssd provisioner:diskplugin.csi.ctyun.com reclaimPolicy:Delete allowVolumeExpansion:true volumeBindingMode:WaitForFirstConsumer
| 參數 | 描述 |
|---|---|
| reclaimPolicy | 用來指定創建PV的persistentVolumeReclaimPolicy字段值,支持Delete和Retain。 l Delete表示動態創建的PV,在銷毀的時候也會自動銷毀。 l Retain表示動態創建的PV,不會自動銷毀,而是由管理員處理。 |
| allowVolumeExpansion | 定義由此存儲類創建的PV是否運行動態擴容,默認為false。是否能動態擴容是由底層存儲插件來實現的,這里只是一個開關。 |
| volumeBindingMode | 表示動態創建PV的時間,支持Immediate和WaitForFirstConsumer,分別表示立即創建和延遲創建。 |
延遲綁定:針對某類存儲(例如天翼云云盤)在掛載屬性上有所限制,只能掛載相同可用區的數據卷和節點,不在同一個可用區不可以掛載。這種類型的存儲卷通常遇到如下問題:
1、創建了A可用區的數據卷,但是A可用區的節點資源已經耗光,導致Pod啟動無法完成掛載。
2、集群管理員在規劃PVC、PV的時候不能確定在哪些可用區創建多個PV來備用。
3、StorageClass中的volumeBindingMode字段正是用來解決此問題,如果將volumeBindingMode配置為WaitForFirstConsumer值,則表示存儲插件在收到PVC Pending的時候不會立即進行數據卷創建,而是等待這個PVC被Pod消費的時候才執行創建流程。
動態存儲卷的優勢:
1、動態存儲卷讓Kubernetes實現了PV的自動化生命周期管理,PV的創建、刪除都通過Provisioner完成。
2、自動化創建PV對象,減少了配置復雜度和系統管理員的工作量。
3、動態卷可以實現PVC對存儲的需求容量和Provisioner出來的PV容量一致,實現存儲容量規劃最優。
4、掛在SubPath卷:Kubernetes提供了volumeMounts.subPath屬性配置,可用于指定所引用的卷內的子路徑,而不是其根路徑。
存儲卷配額說明
部分存儲類型在每個節點的掛載數量是有限制的。