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