
1.容器云平臺及容器云存儲
云平臺中IaaS/PaaS是目前云技術應用相對較廣的兩部分能力,其中PaaS在IaaS的基礎上,提供中間件、數據庫,以及容器云等便捷部署和運維能力,中間件和數據庫可以提供虛擬機部署形態,也可以提供容器資源部署。容器是私有云中一種常見的基礎環境,容器云作為常常是私有云中的PaaS中組件出現或者以單獨的容器云形態出現。從容器自身來說,其提供的是IaaS層基礎計算能力,且常用于無狀態應用,容器消亡后無法保存消亡時的狀態。現在大家常見的容器技術一般是指符合開放容器計劃OCI(OpenContainerInitiative)標準與規范的容器技術,除了最常見的Docker之外,還有Podman,Containerd,CRI-O。相對來說,目前Docker相對應用更為廣泛,是一種最為常見的容器引擎,金融行業通常使用K8S來進行容器的編排管理,實現容器調度,容器技術的應用為PaaS平臺的實現提供了一種新的資源形態。K8S是一個可移植的、可擴展的開源平臺,用于管理容器化的工作負載和服務,可促進聲明式配置和自動化。在金融私有云中,通常采用租戶進行IaaS資源的隔離以及容器集群資源的隔離,一個租戶可以配置一個或者多個K8S集群,用于運行不同的應用系統,容器加上云計算租戶功能,則可以實現容器云平臺功能。
目前在城商行使用了容器云的,更多是用于部署應用層的一些組件,在涉及一些需要進行彈性伸縮的業務場景,例如秒殺、活動優惠等敏態業務,則采用容器部署應用app層的一些純Java程序、中間件、無狀態的Redis集群等,此外也會逐步碰到一些場景,需要我們的容器平臺能保存狀態,我們部署MySQL、Redis等數據庫,需要對這些數據庫產生的數據做備份。
2.K8S存儲系統介紹:
說起容器的存儲,需要先了解CSI/PV/PVC/StorageClass的幾個基本概念。
2.1CSI
CSI英文全稱是ContainerStorageInterface,是容器編排系統(COS)上通用的容器存儲接口,第三方存儲廠商可以通過編寫CSI插件來將其文件存儲和塊存儲提供給K8S上容器化的工作負載,而無需修改K8S的核心代碼。K8S作為事實上的容器編排(CO)標準,對CSI持久化存儲接口的支持已經可以商用。K8S的V1.13版本已經支持了GA版本的CSI組件。目前K8S主要持久化存儲主要通過該標準接口進行對接。
在Pod創建過程中,通過指定創建外部卷存儲,PVC通過StorageClass的動態供給生成對應綁定的PV,PV的創建與綁定由CSI來進行。這時候CSI就可以自己定義如何加載一個卷,如何掛載一個卷。
2.2PV以及PVC
PV全稱叫做PersistentVolume,持久化存儲卷。它是用來描述或者說用來定義一個存儲卷的。PV一般由運維來創建。PV有2個重要的參數,分別是accessModes和PersistentVolumeReclaimPolicy。
accessModes:支持四種類型,第一種是ReadWriteMany多路讀寫,卷能被集群多個節點掛載并讀寫。第二種是ReadWriteOnce單路讀寫,卷只能被單一集群節點掛載讀寫。第三種是ReadOnlyMany多路只讀,卷能被多個集群節點掛載且只能讀。第四種是新增特性ReadWriteOncePod,該卷只能被被單一節點的單一Pod掛載為讀寫模式,當一個帶有pvc訪問模式為ReadWriteOncePod的PodA時,K8S確保整個集群內只有一個Pod可讀寫該PVC,如再創建PodB并引用了與PodA相同的PVC(ReadWriteOncePod)時,PodB則會由于該pvc被PodA引用而啟動失敗。
PersistentVolumeReclaimPolicy:也有三種策略,這個策略是當與之關聯的PVC被刪除以后,這個PV中的數據如何被處理。
(1)Retain手動重新使用,生產系統中,因通常存儲上都是需要保留的數據、日志等,最為常用。Retain當刪除與之綁定的PVC時候,這個PV被標記為released(PVC與PV解綁但還沒有執行回收策略)且之前的數據依然保存在該PV上,但是該PV不可用,需要手動來處理這些數據并刪除該PV。
(2)Recycle,回收策略Recycle會在卷上執行一些基本的擦除(rm-rf/thevolume/*)操作,之后允許該卷用于新的PVC申領。
(3)Delete對于支持Delete回收策略的卷插件,刪除動作會將PersistentVolume對象從K8S中移除,同時也會從外部基礎設施(如AWSEBS、GCEPD、AzureDisk或Cinder卷)中移除所關聯的存儲資產。動態制備的卷會繼承其StorageClass中設置的回收策略,該策略默認為Delete。
PVC是用來描述希望使用什么樣的或者說是滿足什么條件的存儲,它的全稱是PersistentVolumeClaim,也就是持久化存儲聲明。開發人員使用這個來描述該容器需要一個什么存儲。比如下面使用NFS的PVC:PV是已有存儲,PVC是需要的存儲,兩者要形成配對需要下面2個條件:
PV和PVC中的spec關鍵字段要匹配,比如存儲(storage)大小,PV里的存儲容量不能小于PVC里聲明的。
PV和PVC中的storageClassName字段必須一致。
2.3StorageClass
StorageClass提供了一種描述存儲類(class)的方法,不同的class可能會映射到不同的服務質量等級和備份策略或其他策略。PV是運維人員來創建的,用戶操作PVC,可是大規模集群中可能會有很多PV,如果這些PV都需要運維手動來處理這也是一件很繁瑣的事情,所以就有了動態供給(DynamicProvisioning)概念,而動態供給的關鍵就是StorageClass,它的作用就是創建PV模板。創建StorageClass里面需要定義PV屬性比如存儲類型、大小等;另外創建這種PV需要用到存儲插件。最終效果是,用戶提交PVC,里面指定存儲類型,如果符合我們定義的StorageClass,則會為其自動創建PV并進行綁定。
3.容器云存儲類型選型需求分析
在容器云中,我們對K8S中部署的應用都是以Pod容器的形式運行的,因為Pod是無狀態的,如果Pod不掛載數據卷,那Pod被刪除或重啟后這些數據會隨之消失,如果想要長久的保留這些數據就要用到Pod數據持久化存儲。針對業務場景不同進行分類,容器云對于存儲的需求可以分為非持久化存儲和持久化存儲兩種。
除了希望數據不在Pod重啟后丟失,有時候也需要在Pod間共享文件。因此,衍生了Pod存儲持久化的話題。在云平臺的容器云中,都提供了一些方案來解決容器掛載持久化存儲的問題,但是主要都是通過K8S提出的Volume對象方案進行封裝來解決該問題。
3.1容器云非持久化存儲需求
容器云容器運行在物理或者虛擬服務器上,需要使用到容器應用的有鏡像倉庫和運行態容器實例,以及一些容器產生的日志等。容器云需要使用存儲的場景有:
1、容器實例的創建和運行。容器創建實例時需要使用到一定的存儲空間,每個容器需求空間的大小根據容器個數以及容器中部署的基礎環境及容器應用確定。整體容器工作節點的存儲空間大小根據運行的容器類型以及容器個數決定。值得注意的是,單個工作節點的大小要能覆蓋可能運行在該節點上容器的空間的總和。用于存儲運行態容器的存儲空間,對性能要求要相對高,能支持容器的快速動態伸縮和文件的快速讀寫。
2、一些不需要持久化存儲的文件,例如容器應用運行過程中生成的一些臨時文件。
通常使用容器運行的是敏態業務,敏態業務的特點,總結起來通常是支持業務高并發、支持容器在多個工作節點上啟動或者停止的彈性伸縮;針對以上特點,容器對非持久性存儲的要求主要集中在性能層面,對于空間要求并不高,但是要求工作節點能便捷的識別并且具備較好的IOPS并發讀寫能力。非持久化存儲采用本地硬盤或者集中式存儲映射的塊存儲較多,只要工作節點能識別就可以滿足要求。
3.2容器云持久化存儲需求
銀行業中,過去主要運行一些內部管理或者業務量較少的邊緣應用,近年隨著容器技術成熟,銀行中越來越多重要交易業務也開始使用容器來支撐生產交易,因此容器使用持久化存儲的場景越來越多,主要使用場景有如下幾類:(1)應用文件,例如圖片、文檔等持久化存儲。此類存儲在銀行業務中,常見的是用于保存用戶申請、填單、業務發生時錄像等重要憑據的保存,在容器消亡后需要長期保存,并歸檔入庫的。(2)業務日志持久化存儲,容器中如果是重要業務,則業務產生的流水日志、操作日志等需要保存下來,便于進行一些后續系統故障分析、系統優化的依據。(3)kafka、Redis等組件數據持久化存儲,例如多個容器需要同時讀寫一個消息隊列,并且應用重啟后,隊列中的未消費消息需要處理完。或者redis數據庫中的數據,需要長期保存。(4)鏡像倉庫,鏡像倉庫是用來保存所有創建好的鏡像統一存儲的位置,主要保存測試及生產中常用的容器鏡像。容器鏡像是一個個靜態只讀文件,其中包含有關創建Docker容器的說明。容器鏡像倉庫存儲的要求主要是空間要求,對性能要求不高。
如果容器應用是需要使用持久化存儲,對于持久化存儲需求的主要特性如下:(1)持久化需求:生產系統業務日志,業務分析的基礎,永久保存。(2)Pod漂移后,通過另外節點掛載同一塊存儲實現狀態數據遷移。(3)共享存儲需求:業務文件、圖片分布式共享需求。(4)擴容需求:存儲靈活擴容需求,容器節點靈活擴容、遷移能力需求。(5)性能需求:應用文件,例如圖片、文檔等寫入性能直接關系到業務系統的并發支撐能力。(6)安全、高可用需求:須內網存儲,保證雙中心架構。
4.容器云支持的存儲類型
容器的存儲選型也包含持久化和非持久化兩類,容器云支持的存儲類型也比較豐富,包括ISCSI/FC等映射的塊存儲,NFS文件系統,對象存儲系統,AWS等公有云存儲服務,還有EmptyDir,HostPath等K8S內置存儲類型。其中目前常見的主要是NFS映射文件系統,以及Hostpath內置存儲。Cephfs等分布式對象存儲系統,因其靈活擴容能力和海量存儲特性,目前有部分用戶用于進行容器備份。
其中HostPathVolume是指Pod掛載宿主機上的目錄或文件。HostPathVolume使得容器可以使用宿主機的文件系統進行存儲,Hostpath(宿主機路徑)是節點級存儲卷,在Pod被刪除后存儲卷仍然存在Pod運行worknode上不會被刪除,只要同一個Pod被調度到該節點上,在Pod被刪除重新被調度到這個節點之后,對應的數據依然是存在的。Hostpath存儲卷缺點在于Pod刪除之后重新創建必須調度到同一個node節點,數據才不會丟失,對于多個node的場景,是不合適采用的。
EmptyDir類型的Volume是在Pod分配到Node上時被創建,K8S會在Node上自動分配一個目錄,因此無需指定宿主機Node上對應的目錄文件。這個目錄的初始內容為空,當Pod從Node上移除時,EmptyDir中的數據會被永久刪除。EmptyDirVolume主要用于某些應用程序無需永久保存的臨時目錄,多個容器的共享目錄等,但是如果是需要進行持久化存儲,則不合適采用。
4.1非持久化存儲選型經驗
如果采用非持久化存儲,應用場景包括高IO、低延時場景,主要采用本地存儲和塊存儲兩種類型,考慮性能和連接方式,可以本地硬盤構建HostPath或者集中式塊存儲,相對來說IOPS以及帶寬都較高,本地SAS接口硬盤組或者FC提供的LUN吞吐通常可以達到1GB以上,基本可以滿足單臺工作節點的容器集群io需求。如果采用工作節點的本地硬盤,則建議通過Raid卡配置Raid5以上保證存儲一定的容錯能力,雖然K8S集群本身具備單個容器實例的異常處理能力,但是因為工作節點單塊硬盤故障導致整個工作節點的文件系統異常從而導致該節點上容器服務批量中斷,在業務層面還是有所感知的,可能會帶來用戶的正常會話丟失,需要用戶重新登錄。建議配置Raid后,配置單硬盤的容錯能力,提高整體業務系統的可靠性。
塊存儲設備適用于對IO、延遲要求較高的應用場景,例如:數據庫、中間件等服務。在非共享場景中,塊存儲是獨享模式,同時只能給一個Pod使用,在非共享數據業務場景可以考慮使用塊存儲。適合有狀態應用,每個副本一個存儲卷。如果采用塊存儲,可以選擇集中式塊存儲,也可以選擇分布式塊存儲。如果是采用集中式塊存儲,則與傳統Iaas中的虛擬機或者裸機連接集中式存儲使用差別不大,通常采用FC網絡和ISCSI網絡進行連接,但是在云平臺中,更多的是采用分布式存儲,通過IPSAN映射至計算虛擬化服務器。分布式存儲可以提供塊存儲、對象存儲、nas存儲等多種存儲服務類型,可以采用SSD+HDD或全閃存配置硬盤組的方式提高分布式存儲的性能。
分布式塊存儲擴展能力較好,常見協議有:isCSI。還有本地存儲,塊存儲通常只支持RWO,比如AWSElasticBlockStore,AzureDisk,有些產品能做到支持ROX,比如GCEPersistentDisk,RBD,ScaleIO等。
4.2持久化存儲選型建議
在選擇持久化存儲時,在選型過程中建議考慮容器適應業務場景、存儲的性能、是否支持K8SCSI、是否支持擴容、是否支持克隆等角度進行選型。目前持久化存儲常用的有NAS和對象存儲兩種。
(1)對象存儲
容器選用對象存儲的場景和選用NAS存儲的場景有一定重合之處,例如對于容器實例需要進行文檔、圖片等小文件共享時,可以考慮NAS和對象存儲兩種。但是面臨選擇時有一定區別,例如應用如果是影像類系統、視頻庫管理類系統、圖片采集、分析等系統的話,存儲圖片數據量達到數PB級別,單個文件大小為MB級別以上,文件數量數萬或者更高,則更推薦采用對象存儲。媒體、圖片等媒體文件只讀場景可以通過對象存儲讀取上述文件類型。對象存儲使用的過程中,一般不需要配置CSI,對象存儲不需要PV/PVC來做資源抽象,應用可以直接訪問和使用只需要在應用中配置對象存儲的地址,秘鑰等進行讀寫。
(2)NAS存儲
NAS存儲支持多個容器讀取一個共享目錄并且長期保存,如日志保存,將不同Pod副本的日志存在同一個目錄中,如共享文件,多個Pod同時讀寫問題。目前在城商行已有的案例中,較為常見的方案是采用集中式NAS存儲或者分布式NAS存儲提供持久化存儲服務,劃分文件系統給容器云掛載PV卷。目前采用集中式或分布式NFS存儲提供持久化存儲服務,能較好的滿足在穩定性、高可用、靈活擴容能力、便捷管理幾個方面的要求。其優點有如下幾個:
a、使用NAS提供持久化存儲,相比Hostpath實現分布式應用在多節點容器日志集中管理,降低日志管理復雜度,提高排障效率。
b、使用NAS存儲平臺,可采用端口綁定的方式提升帶寬,保證高業務負載下的帶寬性能,支持業務的高并發。
c、使用NAS存儲平臺,提供了具備高穩定性、高容錯能力的存儲服務。
容器在進行彈性伸縮或者進行故障恢復時,同時將頻繁的發生存儲卷的掛載和卸載,為了保證整個生產環境的穩定性,在進行卷的掛載和卸載操作中需要保證足夠的穩定性,同時也需要PV卷服務端能保證較高的性能,避免應用延遲。采用專用的集中式存儲NFS可以提供較為穩定、高性能的存儲服務。集中式存儲設備通過Raid、冗余存儲機頭、分布式集群多節點等能力,保證了硬件故障情況下的高穩定性;當NFS表現出性能不足的情況下,集中式存儲可采用增加端口綁定的方式提升帶寬,分布式存儲也同樣可以采用增加綁定端口提升帶寬,擴容分布式節點提升整體集群存儲性能。
a、切實的容災方案:重要業務需進行多中心部署,通過使用NAS存儲,實現多中心架構的容器集群數據同步構建,提供一種切實可行的重要業務容器化部署的容災方案。通常銀行業會要求重要業務進行兩地三中心部署,通過集中式存儲和分布式存儲本身的雙中心雙活能力,也可以構建雙中心架構的容器集群。
b、簡易化運維管理:隨著容器有狀態應用的增長,對傳統存儲運維工作也會帶來挑戰,整體方案需要兼顧運維敏捷和安全。集中式和分布式NAS存儲產品,均具備界面化、便捷的管理手段。采用NAS存儲產品,具備直觀的圖形界面,能進行便捷的配置、切換管理,降低運維的復雜性。
c、客戶端可以啟用用戶認證機制,且數據是通過明文或者密文傳送,安全性相對較高(一般建議在局域網內使用)
雖然NAS存儲有明顯的優勢,但是與其他類型對比時,也有一定的缺點:
a、NAS存儲在高并發下iops效率/性能,相比塊存儲是處于劣勢,如果承載的容器數量過多,IOPS性能相比塊存儲要弱。
b、在K8S場景中,一個NAS目錄如果配置給K8S集群中,則無配額限制,所有用戶申請資源等于申請了所有NFS的存儲池。
4.3案例分享
在我們的環境中,目前有多個業務系統各采用獨立的K8S容器集群承載業務程序,其中較大業務系統一個K8S集群中部署有12個Pod,主要是運行業務系統的Java應用以及Web應用,該持久化存儲場景主要是為了保存業務運行日志,容器集群的持久化存儲通過OceanStor系列存儲配備雙中心復制的存儲集群提供,通過配置雙活NAS存儲發布服務至容器云集群,作為PV映射給Pod使用。另一套集群則是采用冷備方案配置,主中心K8S集群使用主中心的分布式存儲(可讀寫),SDS分布式集群將數據異步復制到備中心,災備中心的冷備K8S災備集群掛載備中心的分布式存儲(不可讀寫),當主中心故障導致主中心的K8S集群以及存儲集群失效時,手動拉起備中心的K8S集群并將備中心分布式存儲集群拉起為可讀寫,以提供業務連續性。也有使用到華為OceanStor存儲中的NAS功能進行承載此類業務,總結使用中,體現出以下一些優勢:
(1)其相比Hostpath實現分布式應用在多節點容器日志集中管理,降低日志管理復雜度,提高排障效率;
(2)使用該存儲平臺,可采用端口綁定的方式提升帶寬,保證高業務負載下的帶寬性能,支持業務的高并發;
(3)使用該存儲平臺,提供了具備高穩定性、高容錯能力的存儲服務,集中式存儲的Raid、冗余存儲機頭等硬件容錯能力,支持容器日志的安全存儲,保證了業務的持續穩定運行;
(4)使用該存儲平臺,切實的容災方案:重要業務需進行多中心部署,通過使用華為NAS存儲,實現多中心架構的容器集群數據同步構建,提供一種切實可行的重要業務容器化部署的容災方案;
(5)使用該存儲平臺,具備簡易化運維管理能力:采用NAS存儲產品,具備直觀的圖形界面,能進行便捷的配置、切換管理,降低運維的復雜性。?