容器云如何對(duì)接持久化存儲(chǔ)并投入使用?

twt社區(qū)
容器云持久化存儲(chǔ)最佳實(shí)踐沒有一個(gè)統(tǒng)一使用某種存儲(chǔ)的完美方案,而是需要根據(jù)業(yè)務(wù)類型、系統(tǒng)重要等級(jí)、集群規(guī)模、擴(kuò)展性等多方面進(jìn)行綜合考量,再結(jié)合本行的一個(gè)長(zhǎng)遠(yuǎn)規(guī)劃進(jìn)行存儲(chǔ)架構(gòu)設(shè)計(jì),以匹配科技戰(zhàn)略,助力業(yè)務(wù)發(fā)展。

本文來自IT168網(wǎng)站,作者/IT168網(wǎng)站。

隨著容器為互聯(lián)網(wǎng)應(yīng)用提供的敏捷開發(fā)、快速交付,對(duì)傳統(tǒng)金融IT帶來了技術(shù)革新的挑戰(zhàn)。針對(duì)數(shù)據(jù)爆炸式增長(zhǎng)、應(yīng)用復(fù)雜性提高、業(yè)務(wù)品種快速更新、應(yīng)用系統(tǒng)軟件快速迭代等一系列挑戰(zhàn),容器技術(shù)在金融行業(yè)數(shù)字化轉(zhuǎn)型浪潮中越來越受到青睞。

2345截圖20220818151609.png

本文主要從容器云對(duì)存儲(chǔ)的使用方面做建議介紹。Kubernetes支持很多類型的卷,Pod可以同時(shí)使用任意數(shù)目的卷類型。臨時(shí)卷類型的生命周期與Pod相同,但持久卷可以比Pod的存活期長(zhǎng)。當(dāng)Pod不再存在時(shí),Kubernetes也會(huì)銷毀臨時(shí)卷;不過Kubernetes不會(huì)銷毀持久卷。對(duì)于給定Pod中任何類型的卷,在容器重啟期間數(shù)據(jù)都不會(huì)丟失,卷掛載在鏡像中的指定路徑下。容器對(duì)接存儲(chǔ),都會(huì)使用一個(gè)存儲(chǔ)CSI插件進(jìn)行連接和管理。

容器云中存儲(chǔ)的分類

Kubernetes能使用的存儲(chǔ)可以分為如下幾類:

1)臨時(shí)存儲(chǔ)

常見的臨時(shí)存儲(chǔ)主要是emptyDir卷,當(dāng)Pod分派到某個(gè)Node上時(shí),emptyDir卷會(huì)被創(chuàng)建,并且Pod在該節(jié)點(diǎn)上運(yùn)行期間,卷一直存在。當(dāng)Pod因?yàn)槟承┰虮粡墓?jié)點(diǎn)上刪除時(shí),emptyDir卷中的數(shù)據(jù)也會(huì)被永久刪除。一般情況下emptyDir存儲(chǔ)都是用來充當(dāng)臨時(shí)存儲(chǔ)空間。emptyDir常見的一些用途如:(1)緩存空間,例如基于磁盤的歸并排序。(2)為耗時(shí)較長(zhǎng)的計(jì)算任務(wù)提供檢查點(diǎn),以便任務(wù)能方便地從崩潰前狀態(tài)恢復(fù)執(zhí)行。(3)在Web服務(wù)器容器服務(wù)數(shù)據(jù)時(shí),保存內(nèi)容管理器容器獲取的文件。

2)半持久存儲(chǔ)

半持久化存儲(chǔ)主要是HostPath。當(dāng)使用HostPath卷時(shí),它的范圍應(yīng)盡量限于所需的文件或目錄,并以只讀方式掛載。HostPath常見的一些用途如:(1)運(yùn)行一個(gè)需要訪問Docker內(nèi)部機(jī)制的容器;可使用hostPath掛載/var/lib/docker路徑。(2)在容器中運(yùn)行cAdvisor時(shí),以hostPath方式掛載/sys。(3)允許Pod指定給定的hostPath在運(yùn)行Pod之前是否應(yīng)該存在,是否應(yīng)該創(chuàng)建以及應(yīng)該以什么方式存在。

3)持久化存儲(chǔ)

對(duì)于持久化存儲(chǔ),Kubernetest引入了StorageClass,Volume,PVC,PV的概念。Kubernetes支持的持久化存儲(chǔ)包括主流的塊存儲(chǔ)、對(duì)象存儲(chǔ)和網(wǎng)絡(luò)文件存儲(chǔ)等等。Kubernetes引入了兩個(gè)新的API資源:PersistentVolume和PersistentVolumeClaim。持久卷(PersistentVolume,PV)是集群中的一塊存儲(chǔ),可以由管理員事先制備,或者使用存儲(chǔ)類(Storage Class)來動(dòng)態(tài)制備。持久卷是集群資源,就像節(jié)點(diǎn)也是集群資源一樣。

4)特殊存儲(chǔ)

特殊存儲(chǔ)類主要包括secret,configMap等。(1)secret卷用來給Pod傳遞敏感信息,例如密碼。secret卷由tmpfs(基于RAM的文件系統(tǒng))提供存儲(chǔ),因此它們永遠(yuǎn)不會(huì)被寫入非易失性(持久化的)存儲(chǔ)器。(2)ConfigMap提供了向Pod注入配置數(shù)據(jù)的方法,用來將非機(jī)密性的數(shù)據(jù)保存到鍵值對(duì)中,比如存儲(chǔ)卷中的配置文件,以key-value的形式調(diào)用。

容器云中存儲(chǔ)的使用

Kubernetes中,PV卷是集群中的資源。PVC申領(lǐng)是對(duì)這些資源的請(qǐng)求,也被用來執(zhí)行對(duì)資源的申領(lǐng)檢查。PV卷和PVC的使用過程一般如下:

1)制備:PV卷的制備有兩種方式:靜態(tài)制備或動(dòng)態(tài)制備。(1)靜態(tài)制備。集群管理員創(chuàng)建若干PV卷。這些卷對(duì)象帶有真實(shí)存儲(chǔ)的細(xì)節(jié)信息,并且對(duì)集群用戶可用。(2)動(dòng)態(tài)制備。動(dòng)態(tài)制備操作是基于StorageClass來實(shí)現(xiàn)的:PVC申領(lǐng)必須請(qǐng)求某個(gè)存儲(chǔ)類,同時(shí)集群管理員必須已經(jīng)創(chuàng)建并配置了該類,這樣動(dòng)態(tài)制備卷的動(dòng)作才會(huì)發(fā)生。如果PVC申領(lǐng)指定存儲(chǔ)類為“”(空),則相當(dāng)于為自身禁止使用動(dòng)態(tài)制備的卷。

2)綁定:用戶創(chuàng)建一個(gè)帶有特定存儲(chǔ)容量和特定訪問模式需求的PersistentVolumeClaim對(duì)象;在動(dòng)態(tài)制備場(chǎng)景下,這個(gè)PVC對(duì)象可能已經(jīng)創(chuàng)建完畢。一旦PV與PVC的綁定關(guān)系建立,則PersistentVolumeClaim綁定就是排他性的,PVC申領(lǐng)與PV卷之間的綁定是一種一對(duì)一的映射。

如果找不到匹配的PV卷,PVC申領(lǐng)會(huì)無限期地處于未綁定狀態(tài)。當(dāng)與之匹配的PV卷可用時(shí),PVC申領(lǐng)會(huì)被綁定。例如,即使某集群上制備了很多10 Gi大小的PV卷,也無法與請(qǐng)求20 Gi大小的存儲(chǔ)的PVC匹配。當(dāng)新的20 Gi PV卷被加入到集群時(shí),該P(yáng)VC才有可能被綁定。

3)使用:Pod將PVC申領(lǐng)當(dāng)做存儲(chǔ)卷來使用。集群會(huì)檢查PVC申領(lǐng),找到所綁定的卷,并為Pod掛載該卷。對(duì)于支持多種訪問模式的卷,用戶要在Pod中以卷的形式使用申領(lǐng)時(shí)指定期望的訪問模式。

4)保護(hù)使用中的存儲(chǔ)對(duì)象:保護(hù)使用中的存儲(chǔ)對(duì)象(Storage Object in Use Protection)這一功能特性的目的是確保仍被Pod使用的PersistentVolumeClaim(PVC)對(duì)象及其所綁定的PersistentVolume(PV)對(duì)象在系統(tǒng)中不會(huì)被刪除,因?yàn)檫@樣做可能會(huì)引起數(shù)據(jù)丟失。

5)回收(Reclaiming):當(dāng)用戶不再使用其存儲(chǔ)卷時(shí),他們可以從API中將PVC對(duì)象刪除,從而允許該資源被回收再利用。PersistentVolume對(duì)象的回收策略告訴集群,當(dāng)其被從申領(lǐng)中釋放時(shí)如何處理該數(shù)據(jù)卷。目前,數(shù)據(jù)卷可以被Retained(保留)、Recycled(回收)或Deleted(刪除)。

保留(Retain):回收策略Retain使得用戶可以手動(dòng)回收資源。當(dāng)PersistentVolumeClaim對(duì)象被刪除時(shí),PersistentVolume卷仍然存在,對(duì)應(yīng)的數(shù)據(jù)卷被視為"已釋放(released)"。

刪除(Delete):對(duì)于支持Delete回收策略的卷插件,刪除動(dòng)作會(huì)將PersistentVolume對(duì)象從Kubernetes中移除,同時(shí)也會(huì)從外部基礎(chǔ)設(shè)施(如AWS EBS、CEPH)中移除所關(guān)聯(lián)的存儲(chǔ)資產(chǎn)。

回收(Recycle):回收策略Recycle在Kubernetes新版本中已被廢棄。取而代之的建議方案是使用動(dòng)態(tài)制備。

容器云存儲(chǔ)的落地實(shí)踐

目前,我們銀行已經(jīng)在開發(fā)測(cè)試和生產(chǎn)環(huán)境部署了多套容器云集群平臺(tái),并已經(jīng)承載運(yùn)行了重要應(yīng)用系統(tǒng)的服務(wù)。現(xiàn)階段主要還是將無狀態(tài)的應(yīng)用容器化,數(shù)據(jù)庫、中間件等一些有狀態(tài)的組件仍在虛擬機(jī)中運(yùn)行,將在未來逐步遷移。行內(nèi)容器云平臺(tái)涉及到的持久化存儲(chǔ)主要分為如下幾大塊:

1)容器鏡像類數(shù)據(jù)存儲(chǔ)。在內(nèi)網(wǎng)環(huán)境中,建立一套自己的私有鏡像倉庫,做好相關(guān)配置后容器云平臺(tái)就可以從私有鏡像庫中拉取鏡像。當(dāng)有pod所在服務(wù)器宕機(jī)或故障,pod需要在新節(jié)點(diǎn)啟動(dòng)時(shí),這時(shí)就會(huì)需要向私有鏡像庫拉取鏡像,當(dāng)生產(chǎn)環(huán)境pod數(shù)量達(dá)到一定規(guī)模時(shí),需要考慮多鏡像并行拉取導(dǎo)致的IO風(fēng)暴。所以容器鏡像類數(shù)據(jù)存儲(chǔ)建議采用分布式塊存儲(chǔ),能夠承擔(dān)一定的并發(fā)能力和有一定擴(kuò)展能力的持久性存儲(chǔ),當(dāng)然有存量集中式塊存儲(chǔ)也是可以利舊以節(jié)約投資,同時(shí)也要考慮做好該部分存儲(chǔ)的備份或私有鏡像倉庫的冗余存儲(chǔ)。

2)Pod/container類數(shù)據(jù)存儲(chǔ)。容器云集群的Etcd的數(shù)據(jù)會(huì)時(shí)刻以日志的形式記錄在內(nèi)存和硬盤中,etcd對(duì)磁盤的延遲會(huì)非常敏感,建議將Etcd部署在物理機(jī)/虛擬機(jī)(視集群規(guī)模)中,底層存儲(chǔ)配置SSD磁盤,保證低延遲、高性能的寫入。大部分應(yīng)用Pod/container對(duì)于存儲(chǔ)性能要求不高,主要耗費(fèi)計(jì)算資源,所以Pod/container在node上運(yùn)行的鏡像建議采用服務(wù)器本地盤存儲(chǔ)即可。

3)應(yīng)用之間共享類數(shù)據(jù)存儲(chǔ)。不管是有狀態(tài)還是無狀態(tài)應(yīng)用之間需要共享數(shù)據(jù)時(shí),NFS是一個(gè)主流的文件共享服務(wù)器。NFS數(shù)據(jù)卷可以提供對(duì)NFS掛載支持,可以自動(dòng)將NFS共享路徑掛載到Pod中。在各應(yīng)用pod中需文件共享時(shí)建議采用NAS雙活存儲(chǔ)提供的NFS文件系統(tǒng)以滿足業(yè)務(wù)系統(tǒng)文件共享需求。

4)日志類數(shù)據(jù)存儲(chǔ)。日志類數(shù)據(jù)收集,一般有如下常見幾種方案。(1)app的鏡像中自己集成日志收集組件,好處在于app應(yīng)用的yaml文件不需要特殊配置,一個(gè)鏡像解決問題,但是同時(shí)也造成耦合性強(qiáng),未來組件或應(yīng)用無法單獨(dú)升級(jí)。(2)在同一個(gè)pod中運(yùn)行app容器和日志收集組件容器,相較如上方案降低了耦合度,但是pod的yaml文件需單獨(dú)編寫、配置,較繁瑣。(3)直接將pod的日志掛在到宿主機(jī)node,每臺(tái)node起一個(gè)pod或者采用二進(jìn)制進(jìn)程進(jìn)行日志收集,好處是收集日志與應(yīng)用pod完全解耦,管理方便,只需要做好日志輸出規(guī)范,統(tǒng)一日志目錄和輸出方式即可,此方式日志存儲(chǔ)性能高。日志類數(shù)據(jù)存儲(chǔ)建議可采用pod日志輸出掛載在本地服務(wù)器的存儲(chǔ),通過Filebeat+Logstash+ElasticSearch+Kibana(ELK)或者Fluentd+Filebeat+Elasticsearch+Kibana(EFK)構(gòu)建統(tǒng)一的日志采集、分類、分析、查詢、展示平臺(tái)。

在整個(gè)容器云平臺(tái)的持久化存儲(chǔ)選型過程中,比如在日志類數(shù)據(jù)存儲(chǔ)我們也有考慮將其存放于分布式塊存儲(chǔ)(如ceph、longhorn等)上做日志統(tǒng)一存儲(chǔ)平臺(tái),但是為沿用已有的ELK日志收集展示平臺(tái)、初期容器規(guī)模較小等原因,暫將分布式塊存儲(chǔ)列為二期規(guī)劃建設(shè)。一期主要完成無狀態(tài)應(yīng)用的容器化工作,二期將重點(diǎn)放在有狀態(tài)應(yīng)用(如redis、zk、輕載mysql等)的容器化,建議部署為StatefulSet,當(dāng)節(jié)點(diǎn)重啟漂移到其他機(jī)器上時(shí),可通過掛載的PVC(PersistentVolumeClaim)拿到原來的完整數(shù)據(jù),但是分布式存儲(chǔ)帶來的讀寫延遲需要根據(jù)不同的容器化應(yīng)用敏感程度配置不同性能的分布式存儲(chǔ),以滿足對(duì)業(yè)務(wù)發(fā)展的IO需求。

總而言之,容器云持久化存儲(chǔ)最佳實(shí)踐沒有一個(gè)統(tǒng)一使用某種存儲(chǔ)的完美方案,而是需要根據(jù)業(yè)務(wù)類型、系統(tǒng)重要等級(jí)、集群規(guī)模、擴(kuò)展性等多方面進(jìn)行綜合考量,再結(jié)合本行的一個(gè)長(zhǎng)遠(yuǎn)規(guī)劃進(jìn)行存儲(chǔ)架構(gòu)設(shè)計(jì),以匹配科技戰(zhàn)略,助力業(yè)務(wù)發(fā)展。

THEEND

最新評(píng)論(評(píng)論僅代表用戶觀點(diǎn))

更多
暫無評(píng)論