宗序梅 任彥輝
中國移動通信集團江蘇有限公司
江蘇移動公司業務云資源池主要為自有業務提供基于計算、存儲和網絡的IaaS層資源,承載了和娛樂、車衛士、和教育、視頻能力等眾多的業務平臺,快速響應了公司的業務發展。由于業務系統多采用的是傳統單體式應用,組件眾多、布署耗時久、擴容周期長,無法靈活應對突發的業務訪問;同時基于虛擬化的云資源難以有效動態調整,無法做到彈性擴展,云資源池的利用率也無法有效提升。
和教育業務通過傳統的虛擬機承載相關的應用模塊,云平臺提供基礎的IaaS層資源。隨著代碼量的增長,每次更新代碼,必須進行全面檢查以便確定對其他服務無影響,開發效率較低;業務在高峰期需緊急申請主機布署業務,配置網絡策略,流程較長。因此計劃通過對業務微服務化改造,降低應用耦合性,減少開發更新時間;同時結合容器平臺的功能,保障業務輕松擴容。
基于容器的PaaS平臺為整個數據中心提供分布式調度與資源協調功能,實現數據中心級彈性伸縮能力的軟件堆棧,它將所有數據中心的資源當做一臺計算機來調度和管理。
Kubernetes(k8s)是Google開源的容器集群管理系統,是一個基于容器技術構建的數據中心操作系統的解決方案。在Docker技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模容器集群管理的便捷性。
江蘇移動公司在業務云資源池進行PaaS的探索研究,基于Kubernetes開源軟件在資源池改造6臺物理機,部署容器PaaS平臺。管理節點、負載均衡節點、鏡像倉庫節點、日志告警節點和業務節點分散部署。

圖1 容器平臺架構圖
master節點:主要由 apiserver、controller-manager、schduler等組成。
apiserver:作為kubernetes系統的入口,封裝了核心對象的增刪改查操作,以RESTFul接口方式提供給外部客戶和內部組件使用。
controller-manager:負責執行各種控制器。
schduler:負責集群的資源調度,為新建的pod(由一組緊耦合的容器組成的容器組)分配資源。
minion節點∶主要由kubelet、kube-proxy等組成。
kubelet:負責管控docker容器,如啟動、停止、監控運行狀態等。它定期從etcd獲取分配到本機的pods,并根據pod信息啟動或停止相應的容器。同時,接收apiserver的http請求,匯報pods的運行狀態。
proxy:負責為pod提供代理。定期從etcd中獲取所有的services,并根據service信息創建代理。當某個客戶pod要訪問其它pod時,訪問請求會經過本機proxy做轉發。
PaaS平臺由管理域和業務域兩部分組成。
管理域:管理模塊完全分布式微服務化,基于Kubernetes管理各個模塊,使得平臺模塊可以獨立升級和運維,對模塊實現灰度發布、版本快速迭代。同時具有容錯、自動負載均衡和擴縮容等功能。
業務域:業務運行的節點,提供業務平臺運行環境和訪問途徑。業務域可以有多個集群,每個集群是完整的、獨立的一套Kubernetes集群。Kubernetes集群部署在物理機資源上,由PaaS統一管理,并提供裸計算、存儲、網絡等資源。

圖2 容器平臺功能圖
平臺功能由七大功能模塊組成,分別是PaaS平臺應用管理、日志管理、監控告警、資源管理、鏡像倉庫、服務管理域管理,主要面向平臺不同用戶角色提供相應的功能。
應用管理:運行應用的全生命周期管理,功能覆蓋應用的代碼托管、應用的發布管理、彈性伸縮、應用配置等。
日志管理:實現系統組件和應用日志的采集、分析、展示。
監控告警:實現組件和應用的監控、告警功能。
資源管理:指運行在PaaS平臺之上的所有服務組件及應用的硬件資源環境的統一管理,涉及資源模板、資源分配與編排、資源注入等功能。
服務管理:指運行在PaaS平臺上的所有服務組件的全生命周期管理,功能覆蓋服務上架、服務訂閱、服務目錄、服務運行等。
鏡像倉庫:可以讓開發人員輕松存儲、管理和部署Docker 容器鏡像。采用分布式 的Docker鏡像服務架構,支持快速、穩定的Docker鏡像下載與發布。通過HTTPS傳輸容器鏡像,然后自動對靜態映像進行加密。
域管理:可以創建不同的用戶、角色和域。各用戶創建的資源池相對獨立,互不影響。
和教育微服務組件基于Spring Cloud框架開發,Spring Cloud框架的基本組件與關系如下:

圖3 微服務組件框架圖
網關:通過服務網關統一向外系統提供RESTFul API,除了具備服務路由、均衡負載功能之外,它還具備了權限控制等功能。將權限控制這些較重的非業務邏輯內容遷移到服務路由層面,使得服務集群主體能夠具備更高的可復用性和可測試性。
注冊中心:用于云端服務發現與定位服務,以實現云端中間層服務發現和故障轉移。客戶端向注冊中心提供關于自己的元數據(諸如主機和端口,健康指標URL,首頁等)。
配置中心:把應用原本放在本地文件的配置抽取出來放在中心服務器,從而能夠提供更好的管理、發布能力。SpringCloudCon fi g分服務端和客戶端,服務端負責將Git中存儲的配置文件發布成RESTFul接口,客戶端可以從服務端RESTFul接口獲取配置。
微服務:微服務應用,即開發的具體應用,向注冊中心注冊,從配置中心獲取具體配置,由網關調用以實現訪問。
PaaS平臺中針對每個微服務應用啟動多個pod,微服務應用本身遵循Spring Cloud的架構模式,向注冊中心注冊,從配置中心取配置。pod之間的訪問地址為Kubernetes架構下的虛擬IP,以避免容器重啟后容器IP變化導致的無法訪問問題。
在對外提供服務時,使用PaaS提供的負載均衡器,只需將網關服務對外暴露,即可保證整個微服務系統的可訪問性。在這種部署方式中,每一個微服務都能夠無中斷的自由擴展或縮減容器數量,以應對服務高峰期或低谷期的不同訪問壓力,且無需更改其他配置。
和教育微服務中的應用除discovery和con fi g以外,均對外提供服務,所有的請求均是通過網關服務來傳達的,因此微服務架構中只需暴露網關服務即可。在Kubernetes環境中,客戶端發來的請求首先經過硬件負載均衡分發到Nginx代理,然后通過Nginx ingress分發到不同的微服務應用上。

圖4 微服務網絡架構圖
和教育平臺經過微服務化改造后:
(1)應用彈性伸縮、水平擴展,擴容周期提高到秒級:結合PaaS平臺的水平擴展功能、微服務的自動發現與注冊,保障了和教育在開學季訪問高峰期只需要增加容器數量就可以滿足擴容;通過設置CPU和內存利用率閾值,實現容器自動擴容。
(2)軟件系統開發解耦,縮短代碼更新時間,上線周期縮短60%:和教育業務,對資源配置需求靈活,客戶端接口模塊進行微服務化后,降低耦合性,減少了開發更新的時間;編寫代碼提交到自動編譯打包、持續集成、自動部署上線全流程自動化。
(3)應用服務實時檢測、故障自動恢復,提升業務可靠性:PaaS系統平臺設置監控粒度及監控對象,自動重啟故障應用;微服務的健康檢查能夠自動踢除無效應用,對微服務組件的可靠性起到了極大的提升作用。
(4)資源精細化運營,內存利用率由原來40%提升到80%:和教育客戶端組件原來承載于10臺虛擬機,內存峰值利用率40%左右。微服務化后布署了45個Pod,內存峰值利用率達到80%。
PaaS平臺基于Kubernetes技術,具有高擴展性、高兼容性、負載均衡、灰度升級、失敗冗余、容災恢復等優點。在使用中適合對這些因素有要求的場景,如:高峰時段和低谷時段業務量差異巨大,業務負載波動劇烈,且波峰不可預估;高峰期業務資源需求高,很多應用面臨快速上線的壓力;服務組件眾多,每次部署需要耗費很長時間,且容錯能力比較薄弱,無法應對大規模并發訪問等。結合容器化本身的特性,此系統更適合于模塊化程度高的應用系統。