中國(guó)移動(dòng)通信集團(tuán)江蘇有限公司|宗序梅 任彥輝
IT能力已不再是簡(jiǎn)單地提供裸金屬、虛擬機(jī)等傳統(tǒng)的IaaS基礎(chǔ)設(shè)施,而是需要為應(yīng)用提供完整的開(kāi)發(fā)和運(yùn)行維護(hù)平臺(tái)。以開(kāi)源軟件為基礎(chǔ)的PaaS平臺(tái),為運(yùn)營(yíng)商應(yīng)用快速開(kāi)發(fā)和運(yùn)維提供了強(qiáng)大的技術(shù)支撐。
隨著多種多樣業(yè)務(wù)的不斷發(fā)展,運(yùn)營(yíng)商的云平臺(tái)遇到瓶頸,需要升級(jí)改造。中國(guó)移動(dòng)江蘇公司(以下簡(jiǎn)稱江蘇移動(dòng))構(gòu)建的業(yè)務(wù)云資源池,主要為自有業(yè)務(wù)提供基于計(jì)算、存儲(chǔ)和網(wǎng)絡(luò)的IaaS層資源,承載了和娛樂(lè)、車衛(wèi)士、和教育、視頻能力等眾多的業(yè)務(wù)平臺(tái),快速響應(yīng)了公司的業(yè)務(wù)發(fā)展。
但是,由于江蘇移動(dòng)業(yè)務(wù)系統(tǒng)多采用傳統(tǒng)單體式應(yīng)用,組件眾多、布署耗時(shí)久、擴(kuò)容周期長(zhǎng),無(wú)法靈活應(yīng)對(duì)突發(fā)的業(yè)務(wù)訪問(wèn);同時(shí)基于虛擬化的云資源難以有效動(dòng)態(tài)調(diào)整,無(wú)法做到彈性擴(kuò)展,云資源池的利用率也無(wú)法有效提升。
比如和教育業(yè)務(wù),其通過(guò)傳統(tǒng)的虛擬機(jī)承載相關(guān)的應(yīng)用模塊,云平臺(tái)提供基礎(chǔ)的IaaS層資源。隨著代碼量的增長(zhǎng),和教育業(yè)務(wù)每次更新代碼,必須進(jìn)行全面檢查以便確定對(duì)其他服務(wù)無(wú)影響,開(kāi)發(fā)效率較低;業(yè)務(wù)在高峰期需緊急申請(qǐng)主機(jī)布署業(yè)務(wù),配置網(wǎng)絡(luò)策略,流程較長(zhǎng)。
因此,江蘇移動(dòng)計(jì)劃通過(guò)對(duì)業(yè)務(wù)微服務(wù)化改造,降低應(yīng)用耦合性,減少開(kāi)發(fā)更新時(shí)間;同時(shí)結(jié)合容器平臺(tái)的功能,保障業(yè)務(wù)輕松擴(kuò)容。
基于容器的PaaS平臺(tái)為整個(gè)數(shù)據(jù)中心提供分布式調(diào)度與資源協(xié)調(diào)功能,實(shí)現(xiàn)數(shù)據(jù)中心級(jí)彈性伸縮能力的軟件堆棧,它將所有數(shù)據(jù)中心的資源當(dāng)做一臺(tái)計(jì)算機(jī)來(lái)調(diào)度和管理。
圖1 容器平臺(tái)架構(gòu)圖
Kubernetes(k8s) 是Google開(kāi)源的容器集群管理系統(tǒng),是一個(gè)基于容器技術(shù)構(gòu)建的數(shù)據(jù)中心操作系統(tǒng)的解決方案。在Docker技術(shù)的基礎(chǔ)上,為容器化的應(yīng)用提供部署運(yùn)行、資源調(diào)度、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等一系列完整功能,提高了大規(guī)模容器集群管理的便捷性。下面我們從系統(tǒng)架構(gòu)、功能架構(gòu)等方面詳細(xì)介紹。
一方面,在系統(tǒng)架構(gòu)方面,江蘇移動(dòng)在業(yè)務(wù)云資源池進(jìn)行PaaS的探索研究,基于Kubernetes開(kāi)源軟件在資源池改造6臺(tái)物理機(jī),部署容器PaaS平臺(tái)。管理節(jié)點(diǎn)、負(fù)載均衡節(jié)點(diǎn)、鏡像倉(cāng)庫(kù)節(jié)點(diǎn)、日志告警節(jié)點(diǎn)和業(yè)務(wù)節(jié)點(diǎn)分散于三臺(tái)主機(jī)承載。
其中,m a st er節(jié)點(diǎn)主要由k ubeapiserver、kube-controller-manager、kubeschduler等組成。apiserver作為Kubernetes系統(tǒng)的入口,封裝了核心對(duì)象的增刪改查操作,以RESTFul接口方式提供給外部客戶和內(nèi)部組件使用。Schduler負(fù)責(zé)集群的資源調(diào)度,為新建的pod分配資源。controller-manager負(fù)責(zé)執(zhí)行各種控制器。
minion節(jié)點(diǎn)主要由kubelet、kubeproxy等組成。kubelet負(fù)責(zé)管控docker容器,如啟動(dòng)、停止、監(jiān)控運(yùn)行狀態(tài)等。它定期從etcd獲取分配到本機(jī)的pods,并根據(jù)pod信息啟動(dòng)或停止相應(yīng)的容器。同時(shí),它接收apiserver的http請(qǐng)求,匯報(bào)pods的運(yùn)行狀態(tài)。
proxy負(fù)責(zé)為pod提供代理,定期從etcd中獲取所有的services,并根據(jù)service信息創(chuàng)建代理。當(dāng)某個(gè)客戶pod要訪問(wèn)其它pod時(shí),訪問(wèn)請(qǐng)求會(huì)經(jīng)過(guò)本機(jī)proxy做轉(zhuǎn)發(fā)。另一方面,在功能架構(gòu)方面,PaaS平臺(tái)由管理域和業(yè)務(wù)域兩部分組成。
1.管理域。管理模塊完全分布式微服務(wù)化,基于Kubernetes管理各個(gè)模塊,使得平臺(tái)模塊可以獨(dú)立升級(jí)和運(yùn)維,對(duì)模塊實(shí)現(xiàn)灰度發(fā)布、版本快速迭代。同時(shí)具有容錯(cuò)、自動(dòng)負(fù)載均衡和擴(kuò)縮容等功能。
2.業(yè)務(wù)域。這是業(yè)務(wù)運(yùn)行的節(jié)點(diǎn),提供業(yè)務(wù)平臺(tái)運(yùn)行環(huán)境和訪問(wèn)途徑。業(yè)務(wù)域可以有多個(gè)集群,每個(gè)集群是完整、獨(dú)立的一套Kubernetes集群。Kubernetes集群部署在物理機(jī)資源上,由PaaS統(tǒng)一管理,并提供裸計(jì)算、存儲(chǔ)、網(wǎng)絡(luò)等資源。
平臺(tái)功能由七大功能模塊組成,分別是PaaS平臺(tái)應(yīng)用管理、日志管理、監(jiān)控告警、資源管理、鏡像倉(cāng)庫(kù)、域管理,主要面向平臺(tái)不同用戶角色提供相應(yīng)的功能。
應(yīng)用管理:運(yùn)行應(yīng)用的全生命周期管理,功能覆蓋應(yīng)用的代碼托管、應(yīng)用的發(fā)布管理、彈性伸縮、應(yīng)用配置等。
日志管理:實(shí)現(xiàn)系統(tǒng)組件和應(yīng)用日志的采集、分析、展示。
監(jiān)控告警:實(shí)現(xiàn)組件和應(yīng)用的監(jiān)控、告警功能。
圖2 容器平臺(tái)功能圖
資源管理:指運(yùn)行在PaaS平臺(tái)之上的所有服務(wù)組件及應(yīng)用的硬件資源環(huán)境的統(tǒng)一管理,涉及資源模板、資源分配與編排、資源注入等功能。
服務(wù)管理:指運(yùn)行在PaaS平臺(tái)上的所有服務(wù)組件的全生命周期管理,功能覆蓋服務(wù)上架、服務(wù)訂閱、服務(wù)目錄、服務(wù)運(yùn)行等。
鏡像倉(cāng)庫(kù):可以讓開(kāi)發(fā)人員輕松存儲(chǔ)、管理和部署 Docker容器鏡像。鏡像倉(cāng)庫(kù)采用分布式 的Docker鏡像服務(wù)架構(gòu),支持快速、穩(wěn)定的Docker鏡像下載與發(fā)布。通過(guò)HTTPS 傳輸容器鏡像,然后自動(dòng)對(duì)靜態(tài)映像進(jìn)行加密。
域管理:可以創(chuàng)建不同的用戶、角色和域。各用戶創(chuàng)建的資源池相對(duì)獨(dú)立,互不影響。
首先我們看下微服務(wù)組件框架。和教育微服務(wù)組件基于Spring Cloud技術(shù)開(kāi)發(fā),Spring Cloud框架的基本組件與關(guān)系如圖2。
網(wǎng)關(guān):通過(guò)服務(wù)網(wǎng)關(guān)統(tǒng)一向外系統(tǒng)提供REST API,除了具備服務(wù)路由、均衡負(fù)載功能之外,它還具備了權(quán)限控制等功能。網(wǎng)關(guān)將權(quán)限控制這些較重的非業(yè)務(wù)邏輯內(nèi)容遷移到服務(wù)路由層面,使得服務(wù)集群主體能夠具備更高的可復(fù)用性和可測(cè)試性。
注冊(cè)中心:用于云端服務(wù)發(fā)現(xiàn)與定位服務(wù),以實(shí)現(xiàn)云端中間層服務(wù)發(fā)現(xiàn)和故障轉(zhuǎn)移。當(dāng)一個(gè)客戶端注冊(cè)到Eureka,它提供關(guān)于自己的元數(shù)據(jù)(諸如主機(jī)和端口、健康指標(biāo)URL、首頁(yè)等)。
配置中心:把應(yīng)用原本放在本地文件的配置抽取出來(lái)放在中心服務(wù)器,從而能夠提供更好的管理、發(fā)布能力。SpringCloudConfig分服務(wù)端和客戶端,服務(wù)端負(fù)責(zé)將git中存儲(chǔ)的配置文件發(fā)布成REST接口,客戶端可以從服務(wù)端REST接口獲取配置。
微服務(wù):微服務(wù)應(yīng)用,即開(kāi)發(fā)的具體應(yīng)用,向注冊(cè)中心注冊(cè),從配置中心獲取具體配置,由網(wǎng)關(guān)調(diào)用以實(shí)現(xiàn)訪問(wèn)。
我們?cè)倏聪挛⒎?wù)的網(wǎng)絡(luò)。PaaS平臺(tái)中針對(duì)每個(gè)微服務(wù)應(yīng)用啟動(dòng)多個(gè)pod,微服務(wù)應(yīng)用本身遵循Spring Cloud的架構(gòu)模式,向注冊(cè)中心注冊(cè),從配置中心取配置。pod之間的訪問(wèn)地址為Kubernetes架構(gòu)下的虛擬IP,以避免容器重啟后容器IP變化導(dǎo)致的無(wú)法訪問(wèn)問(wèn)題。
在對(duì)外提供服務(wù)時(shí),使用PaaS提供的負(fù)載均衡器,只需將gateway應(yīng)用對(duì)外暴露,即可保證整個(gè)微服務(wù)系統(tǒng)的可訪問(wèn)性。在這種部署方式中,每一個(gè)微服務(wù)都能夠無(wú)中斷的自由擴(kuò)展或縮減容器數(shù)量,以應(yīng)對(duì)服務(wù)高峰期或低谷期的不同訪問(wèn)壓力,且無(wú)需更改其他配置。
和教育微服務(wù)中的應(yīng)用除discovery和config以外,均對(duì)外提供服務(wù),所有的請(qǐng)求均是通過(guò)gateway來(lái)傳達(dá)的,因此微服務(wù)架構(gòu)中只需暴露網(wǎng)關(guān)服務(wù)即可。
在Kuber netes環(huán)境中,服務(wù)發(fā)布通過(guò)ing ress來(lái)實(shí)現(xiàn),gateway的服務(wù)地址和端口為:172.16.20.13∶50078、172.16.20.14∶50092、172.16.20.15∶50099(宿主機(jī)+端口)。
公網(wǎng)客戶端發(fā)來(lái)的請(qǐng)求,首先經(jīng)過(guò)硬件負(fù)載均衡分發(fā)到和教育APPINT1-10主機(jī),然后通過(guò)容器平臺(tái)自帶Nginx負(fù)載分發(fā)到上述3個(gè)地址,由網(wǎng)關(guān)來(lái)分配到不同的微服務(wù)應(yīng)用上。
總結(jié)可知,微服務(wù)改造取得四方面的顯著效果。第一,應(yīng)用彈性伸縮、水平擴(kuò)展,擴(kuò)容周期提高到秒級(jí)。結(jié)合PaaS平臺(tái)的水平擴(kuò)展功能、微服務(wù)的自動(dòng)發(fā)現(xiàn)與注冊(cè),保障了和教育在開(kāi)學(xué)季訪問(wèn)高峰期只需要增加容器數(shù)量就可以滿足擴(kuò)容;通過(guò)設(shè)置CPU和內(nèi)存利用率閾值,實(shí)現(xiàn)容器自動(dòng)擴(kuò)容。
第二,軟件系統(tǒng)開(kāi)發(fā)解耦,縮短代碼更新時(shí)間,上線周期縮短60%。和教育業(yè)務(wù),對(duì)資源配置需求靈活,客戶端接口模塊進(jìn)行微服務(wù)化后,降低耦合性,減少了開(kāi)發(fā)更新的時(shí)間;編寫(xiě)代碼提交到自動(dòng)編譯打包、持續(xù)集成、自動(dòng)部署上線全流程自動(dòng)化。
第三,應(yīng)用服務(wù)實(shí)時(shí)檢測(cè)、故障自動(dòng)恢復(fù),提升業(yè)務(wù)可靠性。PaaS系統(tǒng)平臺(tái)設(shè)置監(jiān)控粒度及監(jiān)控對(duì)象,自動(dòng)重啟故障應(yīng)用;微服務(wù)的健康檢查能夠自動(dòng)剔除無(wú)效應(yīng)用,對(duì)微服務(wù)組件的可靠性起到了極大的提升。
第四,資源精細(xì)化運(yùn)營(yíng)、內(nèi)存利用率由原來(lái)40%提升到80%。和教育客戶端組件原來(lái)承載于10臺(tái)虛擬機(jī),內(nèi)存峰值利用率40%左右。微服務(wù)化后布署了45個(gè)Pod,內(nèi)存峰值利用率達(dá)到80%。
PaaS平臺(tái)基于Kubernetes技術(shù),具有高擴(kuò)展性、高兼容性、負(fù)載均衡、灰度升級(jí)、失敗冗余、容災(zāi)恢復(fù)等優(yōu)點(diǎn)。在使用中適合對(duì)這些因素有要求的場(chǎng)景,如高峰時(shí)段和低谷時(shí)段業(yè)務(wù)量差異巨大,業(yè)務(wù)負(fù)載波動(dòng)劇烈,且波峰不可預(yù)估;高峰期業(yè)務(wù)資源需求高,很多應(yīng)用面臨快速上線的壓力;服務(wù)組件眾多,每次部署需要耗費(fèi)很長(zhǎng)時(shí)間,且容錯(cuò)能力比較薄弱,無(wú)法應(yīng)對(duì)大規(guī)模并發(fā)訪問(wèn)等。通過(guò)實(shí)踐,江蘇移動(dòng)認(rèn)為,結(jié)合容器化本身的特性,此系統(tǒng)更適合于模塊化程度高的應(yīng)用系統(tǒng)。