Volume(存儲卷)
容器中的文件在磁盤上是臨時存放的,當容器重建時,容器中的文件將會丟失,另外當在一個Pod中同時運行多個容器時,常常需要在這些容器之間共享文件,這也是容器不好解決的問題。Kubernetes抽象出了Volume來解決這兩個問題,也就是存儲卷,Kubernetes的Volume是Pod的一部分,Volume不是單獨的對象,不能獨立創建,只能在Pod中定義。
Pod中的所有容器都可以訪問Volume,但必須要掛載,且可以掛載到容器中任何目錄。
實際中使用容器存儲如下圖所示,將容器的內容掛載到Volume中,通過Volume兩個容器間實現了存儲共享。

Volume的生命周期與掛載它的Pod相同,但是Volume里面的文件可能在Volume消失后仍然存在,這取決于Volume的類型。
存儲卷類型說明
Volume可分為本地磁盤存儲和云存儲兩大類。
- 本地磁盤存儲
本地磁盤存儲可以使用如下幾種類型,具體使用請參見本地磁盤存儲。- emptyDir:一種簡單的空目錄,主要用于臨時存儲。
- hostPath:將主機(節點)某個目錄掛載到容器中,適用于讀取主機上的數據。
- ConfigMap:特殊類型,將Kubernetes特定的對象類型掛載到容器。
- Secret:特殊類型,將Kubernetes特定的對象類型掛載到容器。
- LocalPV:本地持久卷,直接使用節點的本地磁盤,持久化存儲容器數據。
- 云存儲:
CCE支持使用云存儲有如下幾種。- 云硬盤EVS
- 極速文件存儲SFS Turbo
- 對象存儲OBS
- 彈性文件存儲SFS
CSI
Kubernetes提供了CSI接口(Container Storage Interface,容器存儲接口),基于CSI這套接口,可以開發定制出CSI插件,從而支持特定的存儲,達到解耦的目的。
CCE開發了存儲插件Everest,在創建集群時必須安裝,安裝了插件就可以使用的EVS、OBS等云存儲。
PV與PVC
Kubernetes抽象了PV(PersistentVolume)和PVC(PersistentVolumeClaim)來定義和使用存儲,從而讓使用者不用關心具體的基礎設施,當需要存儲資源的時候,只要像CPU和內存一樣,聲明要多少即可。
- PV:PV描述的是一個集群里的持久化存儲卷,和節點一樣,屬于集群級別資源。在新版控制臺(需要將集群升級到1.19.10并且everest存儲插件升級到1.2.10)PV資源已經正式開放給用戶管理;舊版控制臺仍保持導入使用或者是通過動態創建方式進行創建,用戶無法通過控制臺對PV資源進行生命周期管理。
- PVC:PVC描述的是負載對存儲的申領,PVC的申領會消耗集群中存量的PV資源,若集群中無存量PV資源,會動態創建底層存儲及PV資源;創建PVC時,需描述請求的持久化存儲的屬性,比如,Volume存儲的大小、可讀寫權限等等。
在Pod中可以使用Volume關聯PVC,即可讓Pod使用到存儲資源,它們之間的關系如下圖所示。
圖 PVC綁定PV

通常在使用時,可以使用PV描述已有的存儲資源,然后創建PVC使用存儲。具體使用可參見后續各章節中使用kubectl對接存儲資源的內容。
而新創建存儲資源時,可以使用一種更為方便的方法,可以跳過PV直接使用PVC,這就是StorageClass。
StorageClass
StorageClass描述了集群中的存儲類型“分類”,在創建PVC/PV均需要指定StorageClass。目前CCE默認提供csi-disk、csi-nas、csi-obs等StorageClass,在聲明PVC時使用對應StorageClassName,就可以創建對應類型PV,并自動創建底層的存儲資源。
執行如下命令即可查詢CCE提供的默認StorageClass。您可以使用CCE提供的CSI插件自定義創建StorageClass,但從功能角度與CCE提供的默認StorageClass并無區別,這里不做過多描述。
# kubectl get sc
NAME PROVISIONER AGE
csi-disk everest-csi-provisioner 17d # 云硬盤 StorageClass
csi-disk-topology everest-csi-provisioner 17d # 延遲綁定的云硬盤 StorageClass
csi-nas everest-csi-provisioner 17d # 文件存儲 StorageClass
csi-obs everest-csi-provisioner 17d # 對象存儲 StorageClass
csi-sfsturbo everest-csi-provisioner 17d # 極速文件存儲 StorageClass
csi-local-topology everest-csi-provisioner 17d # 本地持久卷
定義了StorageClass后,就可以減少創建并維護PV的工作,PV變成了自動創建,作為使用者,只需要在聲明PVC時指定StorageClassName即可,這就大大減少工作量。
CCE容器存儲概覽
CCE支持工作負載Pod綁定存儲卷類型說明中的多種本地磁盤存儲和云存儲,每種存儲卷的主要特點及應用場景如下表:
圖 CCE支持的存儲類型

表 網絡存儲對比
| 對比維度 | 云硬盤EVS | 彈性文件服務SFS | 對象存儲OBS | 極速文件存儲SFS Turbo |
|---|---|---|---|---|
| 概念 | 云硬盤(Elastic Volume Service)可以為云主機提供高可靠、高性能、規格豐富并且可彈性擴展的塊存儲服務,可滿足不同場景的業務需求,適用于分布式文件系統、開發測試、數據倉庫以及高性能計算等場景。 | SFS為用戶提供一個完全托管的共享文件存儲,能夠彈性伸縮至PB規模,具備高可用性和持久性,為海量數據、高帶寬型應用提供有力支持。適用于多種應用場景,包括HPC、媒體處理、文件共享、內容管理和Web服務等。 | 對象存儲服務(Object Storage Service,OBS)提供海量、安全、高可靠、低成本的數據存儲能力,可供用戶存儲任意類型和大小的數據。適合企業備份/歸檔、視頻點播、視頻監控等多種數據存儲場景。 | SFS Turbo為用戶提供一個完全托管的共享文件存儲,能夠彈性伸縮至320TB規模,具備高可用性和持久性,為海量的小文件、低延遲高IOPS型應用提供有力支持。適用于多種應用場景,包括高性能網站、日志存儲、壓縮解壓、DevOps、企業辦公、容器應用等。 |
| 存儲數據的邏輯 | 存放的是二進制數據,無法直接存放文件,如果需要存放文件,需要先格式化文件系統后使用。 | 存放的是文件,會以文件和文件夾的層次結構來整理和呈現數據。 | 存放的是對象,可以直接存放文件,文件會自動產生對應的系統元數據,用戶也可以自定義文件的元數據。 | 存放的是文件,會以文件和文件夾的層次結構來整理和呈現數據。 |
| 訪問方式 | 只能在ECS/BMS中掛載使用,不能被操作系統應用直接訪問,需要格式化成文件系統進行訪問。 | 在ECS/BMS中通過網絡協議掛載使用。需要指定網絡地址進行訪問,也可以將網絡地址映射為本地目錄后進行訪問。 | 可以通過互聯網或專線訪問。需要指定桶地址進行訪問,使用的是HTTP和HTTPS等傳輸協議。 | 提供標準的文件訪問協議NFS(僅支持NFSv3),用戶可以將現有應用和工具與SFS Turbo無縫集成。 |
| 靜態數據卷 | 支持 | 支持 | 支持 | 支持 |
| 動態數據卷 | 支持 | 支持 | 支持 | 不支持 |
| 主要特點 | 非共享存儲,每個云盤只能在單個節點掛載。 | 共享存儲,可提供高性能、高吞吐存儲服務。 | 共享存儲,用戶態文件系統。 | 高性能、高帶寬、共享存儲。 |
| 應用場景 | HPC高性能計算、企業核心集群應用、企業應用系統和開發測試等。說明高性能計算:主要是高速率、高IOPS的需求,用于作為高性能存儲,比如工業設計、能源勘探等。 | HPC高性能計算、媒體處理、內容管理和Web服務、大數據和分析應用程序等。說明高性能計算:主要是高帶寬的需求,用于共享文件存儲,比如基因測序、圖片渲染等。 | 大數據分析、靜態網站托管、在線視頻點播、基因測序、智能視頻監控、備份歸檔、企業云盤(網盤)等。 | 高性能網站、日志存儲、DevOps、企業辦公等。 |
| 容量 | TB級別 | PB級別 | EB級別 | TB級別 |
| 時延 | 1~2ms | 3~20ms | 10ms | 1~2ms |
| IOPS/TPS | 單盤33K | 2K | 千萬級 | 100K |
| 帶寬 | MB/s級別 | GB/s級別 | TB/s級別 | GB/s級別 |
約束與限制
安全容器不支持使用對象存儲卷。
- OBS限制單用戶創建100個桶,但是CCE使用OBS桶為單個工作負載掛載一個桶,當工作負載數量較多時,容易導致桶數量超過限制,OBS桶無法創建。建議此種場景下直接通過OBS的API或SDK使用OBS,不在工作負載中掛載OBS桶。
- 1.19.10以下版本的集群中,如果使用HPA策略對掛載了EVS卷的負載進行擴容,當新Pod被調度到另一個節點時,會導致之前Pod不能正常讀寫。
1.19.10及以上版本集群中,如果使用HPA策略對掛載了EVS卷的負載進行擴容,新Pod會因為無法掛載云硬盤導致無法成功啟動。
- 1.19及以下版本的集群在卸載subpath時會遍歷subpath下所有文件夾,若文件夾數量較多的情況下,遍歷時間較長,卸卷時間對應較長。建議在subpath下不要建立太多文件夾,否則可能會出現Pod刪除卸卷時間較長的情況。
- CCE集群下掛載的OBS中單個文件大小限制遠小于obsfs限制。
插件使用推薦
- 使用CSI插件(Everest)要求Kubernetes版本需為 1.15及以上 ,v1.15及以上版本的集群在創建時將默認安裝本插件,v1.13及以下版本集群創建時默認安裝Flexvolume插件(storage-driver)。
- 集群版本由v1.13升級到v1.15后,v1.13版本集群中的Flexvolume容器存儲插件(storage-driver)能力將由v1.15的CSI插件(Everest,插件版本v1.1.6及以上)接管,接管后原有功能保持不變。
- 插件版本為1.2.0的Everest優化了使用OBS存儲時的 密鑰認證功能 ,低于該版本的Everest插件在升級完成后,需要重啟集群中使用OBS存儲的全部工作負載,否則工作負載使用存儲的能力將受影響。
CSI和Flexvolume存儲插件的區別
表 CSI與Flexvolume
| Kubernetes插件方案 | CCE插件名稱 | 插件特性 | 使用推薦 |
|---|---|---|---|
| CSI | Everest | CSI插件是kubernetes社區推薦的存儲插件機制。CCE發布的kubernetes1.15版本及以上版本默認安裝CSI插件Everest,并用于對接塊存儲、文件存儲、對象存儲、極速文件存儲等Iaas存儲服務。 Everest插件包含兩部分: Everest-csi-controller:提供存儲卷的創建、刪除、擴容、云盤快照等功能; Everest-csi-driver:提供存儲卷在node上的掛載、卸載、格式化等功能。 |
針對1.15及以上版本的集群,在創建時將默認安裝CSI插件(Everest)。CCE會跟隨社區持續更新CSI插件的各種能力。 |
| Flexvolume | storage-driver | Flexvolume插件是kubernetes社區早期實現的存儲卷插件機制。自CCE上線伊始,提供的就是Flexvolume數據卷服務。 CCE發布的kubernetes 1.13及以下版本安裝的插件是“storage-driver”,并用于對接塊存儲、文件存儲、對象存儲、極速文件存儲等Iaas存儲服務。 |
針對已經創建的1.13及以下版本的集群,仍然使用已經安裝的Flexvolume存儲插件(storage-driver),CCE已停止更新該插件。 |
說明
不支持CSI和Flexvolume插件在同一個集群中使用。
不支持將v1.13及以下版本集群的Flexvolume插件轉變到CSI插件,v1.13版本的集群可以通過升級集群版本切換為CSI插件。
如何判斷集群的存儲插件模式
步驟 1 登錄CCE控制臺。
步驟 2 在控制臺左側欄目樹中,單擊“插件管理”。
步驟 3 在右側的插件管理列表中,單擊“插件實例”頁簽。
步驟 4 在插件實例頁面下,選擇右上方的集群后,可以看到創建該集群時默認安裝的存儲插件。