容器應(yīng)用輕盈靈活,怎樣的存儲才能與其匹配呢?
本文總結(jié)了容器存儲的通用架構(gòu),節(jié)選自筆者參與編寫的《軟件定義存儲:原理、實踐與生態(tài)》一書,感興趣的小伙伴們可以通過最下方“閱讀原文”查看本書購買方式。
容器應(yīng)用的存儲需求
容器是近年興起的應(yīng)用開發(fā)、交付和運維的方式。隨著應(yīng)用模式的深入,已經(jīng)從原先無狀態(tài)為主的應(yīng)用,逐漸發(fā)展到有狀態(tài)的容器應(yīng)用。有狀態(tài)的容器應(yīng)用必需要有持久化數(shù)據(jù)的能力,存儲模型如下圖所示。
在容器中運行的應(yīng)用,應(yīng)用真正需要保存的數(shù)據(jù),可以寫入持久化的Volume數(shù)據(jù)卷。由于以微服務(wù)架構(gòu)為主的容器應(yīng)用多為分布式系統(tǒng),容器可能在多個節(jié)點中動態(tài)地啟動、停止、伸縮或遷移,因此,當容器應(yīng)用具有持久化的數(shù)據(jù)時,必須確保數(shù)據(jù)能被不同的節(jié)點所訪問。另一方面,容器是面向應(yīng)用的運行環(huán)境,數(shù)據(jù)通常要保存到文件系統(tǒng)中,即存儲接口以文件形式更適合應(yīng)用訪問。綜合上述需求,容器平臺較適宜的應(yīng)是具有共享文件接口的存儲系統(tǒng)。
容器存儲的架構(gòu)
為了滿足容器的存儲需求,架構(gòu)上可分為容器存儲控制平面和存儲數(shù)據(jù)平面兩部分,如下圖所示。
容器存儲控制平面(Container Storage Control Plane)
控制平面通常由軟件實現(xiàn),主要是接收北向API收到的存儲請求,如創(chuàng)建、刪除、加載、卸載和遷移數(shù)據(jù)卷(volume)等,并傳遞給底層數(shù)據(jù)平面去完成實際的存儲操作?刂破矫嬉话阈枰獫M足調(diào)用層規(guī)范的API,既可以是Docker容器引擎卷插件(Volume Plugin) 的API,也可以是Kubernetes等編排調(diào)度平臺的Volume API。
存儲數(shù)據(jù)平面(Storage Data Plane)
提供數(shù)據(jù)實際的持久化能力,不僅需要實現(xiàn)容器數(shù)據(jù)卷的讀寫、快照、數(shù)據(jù)保護和復(fù)制等存儲操作,而且通常還需具備多節(jié)點共享數(shù)據(jù)的能力。數(shù)據(jù)平面可以基于文件系統(tǒng)如NFS,CephFS等來做數(shù)據(jù)實際存儲,也可以基于塊設(shè)備如iSCSI等加上文件接口的來實現(xiàn)數(shù)據(jù)存儲功能。從部署架構(gòu)上看,容器存儲可以分為集中式和分布式兩種。集中式存儲包括傳統(tǒng)SAN為代表的塊存儲和NAS為代表的文件存儲。分布式存儲主要包括GlusterFS等共享文件系統(tǒng)和Ceph RBD等塊設(shè)備,在云環(huán)境中的還包括各種云存儲,如AWS的EBS塊存儲或S3對象存儲。
容器存儲的volume管理
由于容器技術(shù)應(yīng)用的時間不長,成熟的容器存儲方案還在發(fā)展過程中。目前,容器的存儲大多支持Docker或Kubernetes的Volume,因此我們下文介紹這兩種Volume的原理。
Docker的容器卷插件
Docker V1.8正式發(fā)布了容器卷插件(Volume Plugin) 的規(guī)范,允許第三方廠商的數(shù)據(jù)卷在Docker引擎中提供數(shù)據(jù)服務(wù),使得外置存儲可以超過容器的生命周期而獨立存在。這意味著各種存儲設(shè)備只要滿足接口API的標準,就可以接入Docker容器的運行平臺中。
現(xiàn)有的各種存儲可以通過簡單的驅(qū)動程序封裝,從而實現(xiàn)和Docker容器的對接?梢哉f,驅(qū)動程序?qū)崿F(xiàn)了和容器引擎的北向接口,底層則調(diào)用后端存儲的功能完成數(shù)據(jù)存取等任務(wù)。目前已經(jīng)實現(xiàn)的Docker Volume Plugin中,后端存儲包括常見的NFS, CIFS, GlusterFS和塊設(shè)備等。
Kubernetes的數(shù)據(jù)卷
Kubernetes是開源的容器集群管理平臺,可以自動化部署、擴展和運維容器應(yīng)用。Kubernetes的調(diào)度單位稱作“Pod”(豆莢),每個Pod包含一個或多個容器。Pod可部署在集群的任意節(jié)點中,存儲設(shè)備可以通過數(shù)據(jù)卷(Volume)提供給Pod的容器使用。為了不綁定特定的容器技術(shù),Kubernetes沒有使用Docker的Volume機制,而是制定了自己的通用數(shù)據(jù)卷插件規(guī)范,以配合不同的容器運行時來使用(如Docker和rkt)。數(shù)據(jù)卷分為共享和非共享兩種類型,其中非共享型只能被某個節(jié)點掛載使用(如iSCSI,AWS EBS等網(wǎng)絡(luò)塊設(shè)備),共享型則可以讓不同節(jié)點上的多個Pod同時使用(如NFS,GlusterFS等網(wǎng)絡(luò)文件系統(tǒng),以及可支持多方讀寫的塊設(shè)備)。對有狀態(tài)的應(yīng)用來說,共享型的卷存儲能夠很方便地支持容器在集群各節(jié)點之間的遷移。
為了給容器提供更細粒度的卷管理,Kubernetes增加了持久化卷PV(Persistent Volume)的功能,把外置存儲作為資源池,由平臺管理并提供給整個集群使用。Kubernetes的卷管理架構(gòu)使得存儲可用標準的接入方式,并且通過接口暴露存儲設(shè)備所支持的能力,從而在容器任務(wù)調(diào)度等方面實現(xiàn)了自動化管理。
容器的存儲項目和產(chǎn)品
已經(jīng)有越來越多的容器存儲項目和產(chǎn)品涌現(xiàn),包括Flocker(控制平面),Portworx(控制平面和數(shù)據(jù)平面),以及VMware的Virtual SAN + Photon Platform的超融合方案(下圖)。限于篇幅,這里僅介紹一下VMware的化方案。VMware推出的光子平臺(Photon Platform),幫助用戶在ESX集群上快速、規(guī)模化地部署多種云原生應(yīng)用集群:包括Docker Swarm,Mesos,Kubernetes,以及Pivotal Cloud Foundry,是容器化應(yīng)用集群管理和調(diào)度的一大利器。在ESX提供計算能力的同時,底層的分布式存儲Virtual SAN把本地磁盤池化,提供Docker Volume的接口,供容器應(yīng)用使用。這種包含計算和存儲能力的超融合集群,具有很強的擴展能力,適合云原生應(yīng)用運行
總體而言,面向容器的存儲系統(tǒng)還有待發(fā)展和成熟,這也是各存儲廠商新的機遇。