宜信開源|詳解PaaS平臺LAIN的功能和架構
LAIN是宜信公司大數據創新中心開發的開源PaaS平臺。在金融的場景下,LAIN 是爲解放各個團隊和業務線的生產力而設計的一個雲平臺。LAIN 爲宜信大數據創新中心各個團隊提供了統一的測試和生產環境,簡化了服務的部署與上線流程,也下降了運維人員對系統管理的複雜度。mysql
1、設計理念及解決問題
LAIN 規範了一個應用的開發、測試、上線工做流,提供了爲應用作的容器編排、權限控制、SDN、流量管理、監控報警、備份、日誌等 devops 問題的總體解決方案。nginx
在 LAIN 上,應用是一個基本的概念,某個應用的開發者只須要定義一個 lain.yaml 便可定義應用的編譯和運行方式,對應用代碼侵入性很低。LAIN 基於容器技術,面向多樣化的技術棧,而且自然隔離系統和應用的依賴。git
當 LAIN 用戶建立一個應用(服務)時,能夠到 LAIN 上註冊該應用,當前的用戶自動成爲了該應用的維護者,擁有了進一步操做該應用的權限。構建應用的環境須要 docker 和 lain 命令行工具,爲了方便,咱們建立了一個 vagrant box 即 lain-box. 在構建應用時,除了工程代碼外,還須要一個 Docker 鏡像做爲基礎鏡像,即編譯的環境。若是是二進制的工程,如 golang,則能夠在運行時換掉一個底,不然會使用 build 鏡像爲 release 鏡像。準備好鏡像和編譯/運行的腳本後,就能夠編輯 lain.yaml 了。github
具體來講,LAIN 解決了如下四個問題:golang
一、應用開發之下的devops問題的總體解決方案
常見問題web
- 面對用戶的應用級開發僅僅是冰山一角,在此之下有機房、網絡、服務器、系統管理、運維管理、監控、告警、日誌等等一系列背後的工做,而這部份的工做可能比應用級開發還要複雜
- 採用IaaS解決了服務器採購和上架問題,可是依然須要一個強大的devops團隊來負責上述事務,不然基礎設施很容易成爲發展瓶頸,且越拖越難解決
- 上面的這些工做對於每個產品可能都是同質化但又伴隨着定製,會消耗大量的時間作這些重複的工做
Lain是怎麼作的redis
- 直接在幾乎裸的IaaS或者服務器上便可構建lain集羣,方便地進行在線的擴容縮容等集羣底層資源操做
- 整合了業界沉澱下來的良好的運維總體實踐,提供了冰山下的這一大塊工做的總體解決方案
- 將紛繁複雜的系統管理和運維管理行爲封裝爲更簡單易用的工具包,極大簡化大部分的系統工做,下降平常維護的技術門檻和人力需求
- 將同質化的工做整合在一塊兒,避免重複勞動
- 開箱即用的各類管理組件,囊括了部署,擴容,監控,告警,日誌等方方面面。還有附贈應用,包括mysql,redis的集羣服務
二、規範了應用開發的工做流程,並輔以適當的SCM支援
常見問題sql
- 在我的開發者以及startup組織中,良好的工做流這件事幾乎是不會被說起的,然而在日漸發展的過程當中遺留的技術債務卻會愈來愈多的影響開發部署的效率和質量
- 設計、開發和部署行爲的不規範會引起各類問題
Lain是怎麼作的docker
- 提供本地開發環境的解決方案
- 提供本地開發過程的SDK / CLI工具鏈,使得開發和構建過程是嵌入在解決方案中的
- 隱性的提供了SCM支援,約束了開發者的開發和發佈行爲
三、提升總體資源利用率,優化冗餘資源池
常見問題編程
- 傳統的按照產品線規劃資源池的狀況下,會給各產品預留專屬的資源池以及配備冗餘,以便進行災備以及服務突發流量
- 然而各產品線的資源需求類型不一樣,冗餘類型也不一樣,沒法共通共享,形成衆多的重複冗餘,資源利用率比較低
- 經過服務器資源的冗餘,擴容縮容,以及資源遷移的操做比較複雜,時間消耗大,風險高
Lain是怎麼作的
- 經過容器技術的資源隔離和控制,實現多種技術棧多種應用在集羣內安全的不相互影響的混合部署,經過統一的資源池進行冗餘,有效提升資源利用率
- 容器技術的運用使得對下資源的使用造成徹底統一的形式,擴容縮容以及遷移的成本很低,操做也更簡單。
四、TBD:架構上提供了服務治理的可能性和解決方案
2、特徵
在應用的層面上,LAIN 還有如下特徵:
一、基於配置文件定義應用
- 在現有的應用上只須要增長一個配置文件lain.yaml便可定義應用在lain集羣裏的編譯和運行
- 對應用代碼的侵入性很低
二、SDN網絡安全隔離
三、基於容器技術支持多樣化的技術棧
- 使用開源的docker項目構建容器雲
- 擴展封裝Dockerfile,使用自定義的yaml格式進行應用的集羣定義
- 只需符合最簡單的lain cluster runtime interface,可自由選擇base image
- 容器技術自然的支持隔離系統和應用的依賴
- lain SDK / CLI以及可選的ci組件支援代碼版本和鏡像之間的對應關係
- 編譯時和運行時鏡像都可徹底定製和隔離
四、應用在線擴容縮容
- 使用開源的swarm調度應用部署
- 深度封裝swarm docker API,自行開發集羣控制器(deployd)以及應用控制器(console)
- 直接支持用戶API調用進行容器實例數擴容,縮容
- 直接支持用戶API調用進行容器單實例資源的擴容,縮容(CPU,MEM)
五、節點在線擴容縮容
六、服務自動維持和災難恢復
- 自行開發集羣控制器(deployd)
- 容器實例級別的服務巡檢和維持,自動遷移和服務恢復
- 基於虛ip自動漂移的入口load balancer HA
- 高級API支持服務定製遷移
七、內部服務依賴和發現機制
- 集羣支援Service / Resource 機制
- 集羣總體的服務應用
- 應用私有Service (即 Resource)服務應用
- 集羣支援特別的服務應用類型和資源應用類型
- 在lain.yaml中顯式聲明使用的Service / Resource
- 基於DNS的服務發現機制
- 可編程的service/resource load balancer
- 默認提供可用的RoundRobin類型的load balancer
八、統一認證
- 集羣自行開發統一認證組件(sso)
- 支持oauth2的多種認證方式
九、虛ip和負載均衡器統一管理
- 支援 virtual ip 和 應用 proc 的註冊,應用可註冊 virtual ip 來進行對外服務
- 基於etcd lock機制的virtual ip 漂移機制,應用 load balancer 可藉此實現 HA
十、web load balancer的自動配置
十一、集羣體系化的日誌收集
十二、私有docker registry以及認證機制
- 使用開源的docker registry封裝私有 registry 應用
- 集成支援集羣的私有統一認證機制
- 定製支援可選的moosefs存儲後端或者Ceph存儲後端
1三、應用配置加密存儲
- 使用開源的庫封裝的應用私有配置加密存儲組件
- 集成sso組件實現用戶管理和權限隔離
- 在應用運行時階段將配置注入
1四、本地化開發環境
- 使用開源的vagrant,免費的centos和virtualbox組織統一的本地化開發環境
- 甚至支援本地使用上述工具鏈bootstrap出一個lain本地集羣
1五、應用部署運維API以及相應的CLI客戶端
- 應用的構建,發佈,部署,運維都由集羣的各組件提供API
- 使用lain SDK / CLI再次封裝上述API,給用戶提供良好的操做界面
- 集成集羣的統一認證,進行用戶管理和權限隔離
![](http://static.javashuo.com/static/loading.gif)
1六、集羣管理CLI
- 使用開源的ansible開發集羣管理運維工具包
- 再次封裝ansible調用爲簡單的CLI使得操做更方便,包括增長節點,移除節點,遷移應用,集羣健康檢查等。
1七、規範化的開發workflow
- 基於上述組件,以代碼 - 鏡像的一一對應關係進行SCM,對鏡像進行發佈管理
- 使用lain SDK / CLI以及可選的ci組件進行本地開發,構建發佈,會很天然的規範開發workflow
- 工做流運轉的核心單位是鏡像,lain cli封裝了鏡像的生成,更新,推送,部署,運維
![](http://static.javashuo.com/static/loading.gif)
1八、可選的集羣體系化的備份和恢復(backupd + moosefs)
- 採用開源的moosefs做爲分佈式存儲後端
- 支援在lain.yaml中顯式聲明volume備份需求和策略,以及設定備份策略的hooks
- 支援指定備份恢復
1九、可選的集羣日誌查詢組件(kafka + elasticsearch + kibana)
- 採用開源的kakfa ,elasticsearch,kibana搭建外部依賴的卡夫卡集羣和elasticsearch集羣,封裝集羣可選組件libana
- rebellion集羣日誌收集組件支援發送全部日誌到上述外部依賴kafka
- 在libana上支援對集羣應用日誌和web load balancer 日誌的條件組合查詢
20、可選的系列預置應用
3、系統架構
一、物理視圖
從物理層面看,每個 lain 集羣是由一個或多個網絡互通的節點(Node)構成的。
![](http://static.javashuo.com/static/loading.gif)
每一個節點能夠被賦予不一樣的 label ,供容器調度時進行節點選擇使用。 目前的實現中,須要全部節點位於同一個路由器後。
二、邏輯視圖
從邏輯層面看,一個 lain 集羣是由多個應用組成,應用和應用之間網絡相互隔離(經過SDN技術)。
![](http://static.javashuo.com/static/loading.gif)
每個應用是由多個 Docker 容器組成,每一個容器均可能運行在不一樣的節點上。
![](http://static.javashuo.com/static/loading.gif)
應用開發者能夠在一個應用中定義多種容器(稱爲 proc),每一個 proc 能夠指定爲在集羣上運行多份,每份即爲一個容器,被稱爲 proc instance 。Lain 集羣會盡量保證有指定份數的容器在運行,若是有容器 crash 或者節點 fail 的狀況發生,集羣會試圖重啓容器或者在節點間遷移容器。
三、系統架構設計圖
目標是作成一層一層能夠深刻的架構圖
總圖
![](http://static.javashuo.com/static/loading.gif)
節點
![](http://static.javashuo.com/static/loading.gif)
四、工做流程
![](http://static.javashuo.com/static/loading.gif)
GitHub地址:https://github.com/laincloud
白皮書:https://laincloud.gitbooks.io/white-paper/content/
來源:宜信技術學院