PAAS的架構設計與應用實踐(一)

CloudSpace是一個平臺即服務(PaaS),它提供給開發者自由的去選擇雲平臺、開發框架和應用服務,使得開發者能夠更快更容易的開發、測試、部署和擴展應用,讓開發人員專注於編寫應用程序,而無需爲中間件和基礎設施分心。團隊在使用自助式高生產力的框架和應用服務的同時,開發人員可以快速在自己的環境上開發和測試自己的下一代應用,並能部署到雲上而無需做任何更改,大大提升持續快速,高質量地交付價值的能力。

一、 PaaS解決了什麼問題?

     PaaS爲開發者提供應用全生命週期的服務能力,主要有兩方面:

  • 是提供了資源資源和服務集成的平臺,如  存儲、數據庫、緩存和搜索等;

  • 服務端應用程序的運行環境,如  Web應用和Work應用等;

PaaS架構設計要提供多租戶的應用平臺,多租戶間的隔離機制(Nodes、Network、IO、Runtime、Services等)非常重要,對於隔離要關注以下方面:

  • 資源隔離和約束

       指應用間的容器配額cpu、io、內存等資源要相互不受影響。

  • 訪問控制

       包括應用間的網絡訪問控制和本地IO訪問控制。

  • 數據和數據服務

       Container只掛在歸屬應用自身的UnionFS 

       OVS針對服務實例實施白名單策略

       類似S3等塊存儲天然隔離

 

PaaS平臺主要支持了通用應用架構應用運維兩方面能力:

  1. 支持應用架構能力

  

      隨着應用架構迭代,平臺最終將應用抽象爲兩種類型web和work。區分兩種類型, 就是看應用提供的是http能力,還是socket能力。對於通用應用架構,與框架無關,具有無狀態、分佈式、通用性三個特性。

  • 對於無狀態

       一個應用通常有多個實例集,單實例失去服務能力不影響應用的服務。應用開發時,不要將狀態與實例耦合,通常採用實例之外通用存儲來保證狀態一致性。

  • 對於分佈式

       一個應用通常要進行集羣部署,而不是單個應用部署。具體這樣的特性,必須在應用開發時,注意擴展性,不要將配置與實例耦合,通常採用實例之外通用配置中心來保證應用獨立性。

  • 對於通用性

       更多是從應用和服務角度來做定義,對於應用來講,從調用關係來看,可分爲對外或對內調用,應用間通信抽象爲同步(常用Http)或異步(常用Message);對於服務來講,從中間件角度來看,都應該具有分佈式能力(分佈式cache、分佈式db等),並且提供數據的安全訪問機制,屏蔽應用交互差異,做到通用模型。

 

2. 支持應用運維的能力

       運維通常劃分爲基礎運維和應用運維。對於基礎運維,主要負責物理設備及網絡等基礎建設,更偏底層。對於應用維護,主要圍繞應用構建全方位服務,如 虛擬資源,網絡規劃,軟件預裝、應用,安全、日誌等管理服務,一直以來都在推動運維工作的自動化、規範化和簡約化,但仍然面對不同應用團隊個性化的挑戰,這些都應該有PaaS平臺統一解決。

 

二、PaaS架構設計

 

  

  

CloudSpace圍繞AppEngine核心採用了容器級的PaaS模型來設計,其設計目標爲: 

#可用性,利用組件冗餘的設計,滿足應用7*24的服務。

#伸縮性,利用規則引擎的設計,滿足應用所屬實例的動態調度。

#安全性,利用軟控制策略,實現了應用與服務的網絡隔離和流量控制。

#省成本,利用虛擬化和自動化運維,節省資源,節省運維,按需計費。

#靈活性,利用容器技術,隔離環境,支持多語言,自定義軟件棧,  個性化配置等。

 

 

CloudSpace對於App的訪問,有Lvs集羣接入,通過Router來路由到具體App分配到宿主機(N)->容器(C)->實例(I)。對於三者關係, 對於PAAS平臺,會維護一個機器池,每個機器稱爲宿主機,每個宿主機上有多個容器,每個容器會部署一個App的實例。對於App在平臺上,實例的分佈有Master基於數據決策,調度到不同宿主不同容器,達到動態縮擴容要求,滿足應用的性能變化。

1.Node分層視圖

  

對於PaaS平臺部署應用最小物理單元爲Node,從結構上分爲三層:

第一層爲機器(簡稱Machine),提供給容器虛擬化的物理集羣,對應用透明。

第二層爲容器(簡稱Container),提供給App部署最小虛擬化單元,對應用透明。

第三層爲實例(簡稱 Instance),提供給App運行的實例,依賴軟件棧配置。

 

2.Container技術

主流PaaS模型包括 進程級、容器級、VM級,三種最重要區別隔離機制實現策略不同。

對於CloudSpace的容器技術迭代經歷了兩個重要版本: 

第一種:LXC 基於容器的虛擬化技術

  • 共享OS和內核

  • User Space + Kernel Space

  • Cgroup + Namespace

  • 容器的創建,銷燬,啓動,停止

      命令:  lxc-create, destroy,start,stop,attach, execute

第二種:Docker 輕量級的操作系統虛擬化解決方案

  

 

Docker是一個構建在LXC之上的,基於進程容器的輕量級VM解決方案。

  • 與VM不同

    Docker則直接在宿主平臺上加載運行應用程序. 本質上他在底層使用LXC啓動一個Linux Container,通過Cgroup等機制對不同容器內運行的應用程序進行隔離,權限管理和quota分等,每個container擁有自己獨立的各種命名空間(亦即資源)包括:  PID 進程, MNT 文件系統, NET 網絡, IPC , UTS 主機名等。

  • 與LXC不同

    Docker是Lxc的一個高級封裝,提供了各種輔助工具和標準接口方便使用,可以依靠Lxc和各種腳本實現與docker類似的功能。除此之外,Docker核心思想就體現在它的運行容器構建方案上, 爲了最大化重用Image運行時所構造的運行環境,實際上是由具有依賴關係的多個Layer組成的。有了層級化的Image做基礎,不同的APP共用底層文件系統及相關軟件棧,同一個APP的不同實例也可以實現共用絕大多數數據。

  

CloudSpace系統(如上圖)有六大組件構成:

1.Agent組件(應用代理)

  

  • 容器生命週期

    容器創建/配置/啓動/停止等指令,有Master通過Agent下發執行,應用於容器的生命週期。

  • 語言運行環境初始化

    容器本身語言無關,但在啓動時會指定語言類型(如java),並初始化語言相關的軟件棧(如 Jetty),爲應用配置好環境。

  •  與Master交互命令

    Agent與Master通過消息方式進行通信,接受Master對容器與應用的控制。

  • 運行數據採集

    Agent負責對應用依賴的機器和容器,進行性能數據採集(如 cpu,load,io等)。

  • APP狀態管理

Agent負責對應用的可用性進行健康檢查。

 

2.Router組件(路由)

  

CloudSpace部署多個Router共同處理所有HTTP流量。Controller獲得信息並實時更新路由表,持續維護分佈式路由狀態,並將用戶請求URL的訪問路由至具體的應用,保持在應用實例之間分發流量實現負載均衡。

  •  Dynamic Upstream

APP在Master調度過程中,會動態更新Router中的映射地址,即爲用戶訪問APP的域名與容器地址,便於支持APP的動態所擴容策略。

  •  Management Interface

Router開放接口,來支持Master圍繞APP動態load配置信息,實時控制應用鏈路映射,支持相關特性實現。

  • Http/Https

Route支持針對有https需求的應用配置https證書能力。

  • Sticky Session

      Route反向代理應用請求,可以根據配置支持IPHash能力,便於應用支持粘性會話功能,但在實例調度時,仍然失效,只能一定程度保持狀態。更好建議是採用分佈式集中緩存的token或cookie方案來實現。

3. Master組件(控制)

Master是PAAS平臺最核心的控制中心,主要圍繞APP針對網絡和實例進行管理。對網絡利用SDN來進行多APP及服務間訪問限制;對於實例集中在資源分配和實例調度兩方面,最重要利用規則引擎實現了動態縮擴容,支持應用的彈性部署,能夠從容地應對業務的流量高峯。

  • 對於APP資源分配,就是容器數量與類型配置選擇。對於已選定的APP資源也可以進行擴展,即分爲橫向擴展(實例數量)和縱向擴展(實例配置)。

  

  

  • Master主要依據APP的指標設置規則和採集機器及容器的性能數據做動態分析,對於APP實例調度,支持四種策略來實現自動縮擴容。

 

  

 

  • 策略一:負載調度

若APP部署了三個實例(A/B/C),圍繞APP的三個實例的負載數據(cpu/mem/load等)進行採集,然後計算APP平均負載指標,來對比指標設置數據,若達到閥值,就觸發APP負載調度。Master會計算需要擴容3個實例能達到閥值以下,接着在剩餘資源中找到不同宿主機(負載最低)啓動APP的新實例DEF,最終APP啓動了六個實例來服務線上業務。

  • 策略二:性能調度

若APP部署了三個實例(A/B/C),圍繞APP的三個實例的性能數據(qps/tps/rt/等)進行採集,然後計算APP平均性能指標,來對比指標設置數據,若達到閥值,就觸發APP性能調度。Master會計算需要擴容3個實例能達到閥值以下,接着在剩餘資源中找到不同宿主機(負載最低)啓動APP的新實例DEF,最終APP啓動了六個實例來服務線上業務。

  • 策略三:故障調度

若APP部署了三個實例(A/B/C),圍繞APP設置健康檢查配置(端口、協議和頻次),Agent週期進行健康探測,然後根據結果狀態判斷來觸發故障調度。故障分爲三種Node、Container,不管那種故障類型,只是調度範圍不同。對於Node,是針對Node上所有app,對於Container,是針對Container內app,首先Master要發指令給Router,剔除掉原有映射關係,避免請求到故障實例上。對於負載和性能調度策略,在縮擴容時也要考慮映射關係動態變更。

  • 策略四:最大最小調度

對於APP的業務有高峯有低谷,常常流量不平均,期望在高峯時擴容,低谷時縮容,提升對資源利用率。正式這種考慮,需要依據APP最小最大調度數設置(如: 3<x<6),Master利用規則引擎,實現自動縮擴容。圍繞APP動態計算性能和負載的綜合數據指標,並進行同比和環比計算,來預測指標趨勢,最終決定是要擴還是縮。

 

總結:自動縮擴容機制,本質上是利用Router的動態Upstream機制,實現APP期望的實例數動態映射。現在有很多網關方案均支持這種特性,感興趣也可以研究下k8s,比原有方案會簡單不少。

 

4.Monitor組件(監控)

  

對於監控來講,基於日誌自研的APM系統,對於APP的應用請求和業務日誌通過Flume採集,經過實時計算分鐘級的性能指標(機器/容器/APP),存儲在數據庫中,提供Console進行可視化展示,同時讓開發者可以基於ES查詢實現日誌搜索查詢。

 

5.Service組件(服務)

Sevice是一個獨立的、插件式的模塊,便於第三方方便地把自己的服務整合成CloudSpace服務。在此PAAS平臺中已經包含了服務的框架及核心類庫,如MongoDB、Mysql、 PostgreSql、RabbitMQ、Redis和ElasticSearch等,並且第三方可以繼承Node和Gateway基礎類來開發自己的服務。

 

6.Net模塊(網絡)

PAAS平臺主要採用了floodlight實現SDN功能,來控制容器的OVS的配置,實現APP間的網絡限制功能。對於floodlight的高可用利用ZK特性實現了M/S架構二次開發,並對ovs可視化視圖進行了指標優化,進而提升了平臺安全性。

 

三、CloudSpace架構設計未來規劃

 

1.支持多平臺多區域

  • 支持多平臺:

考慮多平臺的資源集成架構設計,增加Azure,Aws等資源平臺。

  •  支持多區域:

考慮多Region架構設計,支持後續會逐步增加節點

2.支持開放平臺原則

  • 持續完善OpenApi

      便於第三方管理平臺集成服務

  • 接入更多的服務

      便於滿足用戶更多的業務需求

3. 支持AIops功能

在不斷完善devops外,引入更加智能aiops,爲用戶提供一致的開發/測試/生產環境,更好的提升交付價值的效率。

4.  支持新應用架構

   跟進新一代微服務技術Service  Mesh的發展。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章