宜信開源|詳解PaaS平臺LAIN的功能和架構
宜信開源|詳解PaaS平臺LAIN的功能和架構
LAIN是宜信公司大資料創新中心開發的開源PaaS平臺。在金融的場景下,LAIN 是為解放各個團隊和業務線的生產力而設計的一個雲平臺。LAIN 為宜信大資料創新中心各個團隊提供了統一的測試和生產環境,簡化了服務的部署與上線流程,也降低了運維人員對系統管理的複雜度。
一、設計理念及解決問題
LAIN 規範了一個應用的開發、測試、上線工作流,提供了為應用做的容器編排、許可權控制、SDN、流量管理、監控報警、備份、日誌等 devops 問題的整體解決方案。
在 LAIN 上,應用是一個基本的概念,某個應用的開發者只需要定義一個 lain.yaml 即可定義應用的編譯和執行方式,對應用程式碼侵入性很低。LAIN 基於容器技術,面向多樣化的技術棧,並且天然隔離系統和應用的依賴。
當 LAIN 使用者建立一個應用(服務)時,可以到 LAIN 上註冊該應用,當前的使用者自動成為了該應用的維護者,擁有了進一步操作該應用的許可權。構建應用的環境需要 docker 和 lain 命令列工具,為了方便,我們建立了一個 vagrant box 即 lain-box. 在構建應用時,除了工程程式碼外,還需要一個 Docker 映象作為基礎映象,即編譯的環境。如果是二進位制的工程,如 golang,則可以在執行時換掉一個底,否則會使用 build 映象為 release 映象。準備好映象和編譯/執行的指令碼後,就可以編輯 lain.yaml 了。
具體來說,LAIN 解決了以下四個問題:
1、應用開發之下的devops問題的整體解決方案
常見問題
- 面對使用者的應用級開發僅僅是冰山一角,在此之下有機房、網路、伺服器、系統管理、運維管理、監控、告警、日誌等等一系列背後的工作,而這部份的工作可能比應用級開發還要複雜
- 採用IaaS解決了伺服器採購和上架問題,但是依然需要一個強大的devops團隊來負責上述事務,否則基礎設施很容易成為發展瓶頸,且越拖越難解決
- 上面的這些工作對於每一個產品可能都是同質化但又伴隨著定製,會消耗大量的時間做這些重複的工作
Lain是怎麼做的
- 直接在幾乎裸的IaaS或者伺服器上即可構建lain叢集,方便地進行線上的擴容縮容等叢集底層資源操作
- 整合了業界沉澱下來的良好的運維整體實踐,提供了冰山下的這一大塊工作的整體解決方案
- 將紛繁複雜的系統管理和運維管理行為封裝為更簡單易用的工具包,極大簡化大部分的系統工作,降低日常維護的技術門檻和人力需求
- 將同質化的工作整合在一起,避免重複勞動
- 開箱即用的各種管理元件,囊括了部署,擴容,監控,告警,日誌等方方面面。還有附贈應用,包括mysql,redis的叢集服務
2、規範了應用開發的工作流程,並輔以適當的SCM支援
常見問題
- 在個人開發者以及startup組織中,良好的工作流這件事幾乎是不會被提及的,然而在日漸發展的過程中遺留的技術債務卻會越來越多的影響開發部署的效率和質量
- 設計、開發和部署行為的不規範會引發各種問題
Lain是怎麼做的
- 提供本地開發環境的解決方案
- 提供本地開發過程的SDK / CLI工具鏈,使得開發和構建過程是嵌入在解決方案中的
- 隱性的提供了SCM支援,約束了開發者的開發和釋出行為
3、提高整體資源利用率,優化冗餘資源池
常見問題
- 傳統的按照產品線規劃資源池的情況下,會給各產品預留專屬的資源池以及配備冗餘,以便進行災備以及服務突發流量
- 然而各產品線的資源需求型別不同,冗餘型別也不同,無法共通共享,造成眾多的重複冗餘,資源利用率比較低
- 通過伺服器資源的冗餘,擴容縮容,以及資源遷移的操作比較複雜,時間消耗大,風險高
Lain是怎麼做的
- 通過容器技術的資源隔離和控制,實現多種技術棧多種應用在叢集內安全的不相互影響的混合部署,通過統一的資源池進行冗餘,有效提高資源利用率
- 容器技術的運用使得對下資源的使用形成完全統一的形式,擴容縮容以及遷移的成本很低,操作也更簡單。
4、TBD:架構上提供了服務治理的可能性和解決方案
二、特徵
在應用的層面上,LAIN 還有以下特徵:
1、基於配置檔案定義應用
- 在現有的應用上只需要增加一個配置檔案lain.yaml即可定義應用在lain叢集裡的編譯和執行
- 對應用程式碼的侵入性很低
2、SDN網路安全隔離
- 使用開源的calico(https://github.com/projectcalico/calico)專案構建SDN網路
- 高效率的應用內網路互通
- 應用間網路預設隔離
- 顯式宣告應用間的服務互訪
3、基於容器技術支援多樣化的技術棧
- 使用開源的docker專案構建容器雲
- 擴充套件封裝Dockerfile,使用自定義的yaml格式進行應用的叢集定義
- 只需符合最簡單的lain cluster runtime interface,可自由選擇base image
- 容器技術天然的支援隔離系統和應用的依賴
- lain SDK / CLI以及可選的ci元件支援程式碼版本和映象之間的對應關係
- 編譯時和執行時映象均可完全定製和隔離
4、應用線上擴容縮容
- 使用開源的swarm排程應用部署
- 深度封裝swarm docker API,自行開發叢集控制器(deployd)以及應用控制器(console)
- 直接支援使用者API呼叫進行容器例項數擴容,縮容
- 直接支援使用者API呼叫進行容器單例項資源的擴容,縮容(CPU,MEM)
5、節點線上擴容縮容
- 使用開源的ansible(https://github.com/ansible/ansible)開發叢集管理運維工具包
- 叢集的伺服器節點(NODE)相容同一個C段內的物理伺服器,虛擬機器,公有云伺服器
- 叢集管理工具包支援add NODE 和 remove NODE 指令,快速進行底層資源擴容和縮容
6、服務自動維持和災難恢復
- 自行開發叢集控制器(deployd)
- 容器例項級別的服務巡檢和維持,自動遷移和服務恢復
- 基於虛ip自動漂移的入口load balancer HA
- 高階API支援服務定製遷移
7、內部服務依賴和發現機制
- 叢集支援Service / Resource 機制
- 叢集整體的服務應用
- 應用私有Service (即 Resource)服務應用
- 叢集支援特別的服務應用型別和資源應用型別
- 在lain.yaml中顯式宣告使用的Service / Resource
- 基於DNS的服務發現機制
- 可程式設計的service/resource load balancer
- 預設提供可用的RoundRobin型別的load balancer
8、統一認證
- 叢集自行開發統一認證元件(sso)
- 支援oauth2的多種認證方式
9、虛ip和負載均衡器統一管理
- 支援 virtual ip 和 應用 proc 的註冊,應用可註冊 virtual ip 來進行對外服務
- 基於etcd lock機制的virtual ip 漂移機制,應用 load balancer 可藉此實現 HA
10、web load balancer的自動配置
- 使用開源的nginx和tengine(https://github.com/alibaba/tengine)封裝web服務的負載均衡器
- 自研的watcher檢測叢集應用的整體 runtime 資料,自動為 web 服務生成配置
- 獲取runtime變化的時間,判斷是否需要進行配置變更
- 配置變更事件出發配置的渲染
- 觸發 reload 生效
11、叢集體系化的日誌收集
- 使用開源的 heka(https://github.com/mozilla-services/heka)配合docker的配置以及rsyslog封裝叢集整體日誌收集
- 預設收集應用的stdout / stderr日誌收集
- 支援應用顯式宣告需要收集的落地檔案日誌
- 支援應用顯式宣告結構化的監控資料日誌
- 定製檢測web服務load balancer的nginx日誌收集和資料統計
12、私有docker registry以及認證機制
- 使用開源的docker registry封裝私有 registry 應用
- 整合支援叢集的私有統一認證機制
- 定製支援可選的moosefs儲存後端或者Ceph儲存後端
13、應用配置加密儲存
- 使用開源的庫封裝的應用私有配置加密儲存元件
- 整合sso元件實現使用者管理和許可權隔離
- 在應用執行時階段將配置注入
14、本地化開發環境
- 使用開源的vagrant,免費的centos和virtualbox組織統一的本地化開發環境
- 甚至支援本地使用上述工具鏈bootstrap出一個lain本地叢集
15、應用部署運維API以及相應的CLI客戶端
- 應用的構建,釋出,部署,運維都由叢集的各元件提供API
- 使用lain SDK / CLI再次封裝上述API,給使用者提供良好的操作介面
- 整合叢集的統一認證,進行使用者管理和許可權隔離
16、叢集管理CLI
- 使用開源的ansible開發叢集管理運維工具包
- 再次封裝ansible呼叫為簡單的CLI使得操作更方便,包括增加節點,移除節點,遷移應用,叢集健康檢查等。
17、規範化的開發workflow
- 基於上述元件,以程式碼 - 映象的一一對應關係進行SCM,對映象進行釋出管理
- 使用lain SDK / CLI以及可選的ci元件進行本地開發,構建釋出,會很自然的規範開發workflow
- 工作流運轉的核心單位是映象,lain cli封裝了映象的生成,更新,推送,部署,運維
18、可選的叢集體系化的備份和恢復(backupd + moosefs)
- 採用開源的moosefs作為分散式儲存後端
- 支援在lain.yaml中顯式宣告volume備份需求和策略,以及設定備份策略的hooks
- 支援指定備份恢復
19、可選的叢集日誌查詢元件(kafka + elasticsearch + kibana)
- 採用開源的kakfa ,elasticsearch,kibana搭建外部依賴的卡夫卡叢集和elasticsearch叢集,封裝叢集可選元件libana
- rebellion叢集日誌收集元件支援傳送所有日誌到上述外部依賴kafka
- 在libana上支援對叢集應用日誌和web load balancer 日誌的條件組合查詢
20、可選的系列預置應用
- MySQL的服務(https://github.com/laincloud/mysql-service)
- MySQL的資源
- Redis的服務-SM(https://github.com/laincloud/redis-service-sm)
三、系統架構
1、物理檢視
從物理層面看,每一個 lain 叢集是由一個或多個網路互通的節點(Node)構成的。
每個節點可以被賦予不同的 label ,供容器排程時進行節點選擇使用。 目前的實現中,需要所有節點位於同一個路由器後。
2、邏輯檢視
從邏輯層面看,一個 lain 叢集是由多個應用組成,應用和應用之間網路相互隔離(通過SDN技術)。
每一個應用是由多個 Docker 容器組成,每個容器都可能執行在不同的節點上。
應用開發者可以在一個應用中定義多種容器(稱為 proc),每個 proc 可以指定為在叢集上執行多份,每份即為一個容器,被稱為 proc instance 。Lain 叢集會盡可能保證有指定份數的容器在執行,如果有容器 crash 或者節點 fail 的情況發生,叢集會試圖重啟容器或者在節點間遷移容器。
3、系統架構設計圖
目標是做成一層一層可以深入的架構圖
總圖
節點
4、工作流程
GitHub地址:https://github.com/laincloud