宜信開源|一個例項解析PaaS平臺LAIN的9大殺手級功能
一、基於Docker的PaaS平臺LAIN
在金融的場景下,LAIN 是為解放各個團隊和業務線的生產力而設計的一個雲平臺。LAIN 正式上線已經大約兩年,基本已經成熟,為宜信大資料創新中心各個團隊提供了統一的測試和生產環境,簡化了服務的部署與上線流程,也降低了運維人員對系統管理的複雜度。
LAIN 規範了一個應用的開發、測試、上線工作流,提供了為應用做的容器編排、許可權控制、SDN、流量管理、監控報警、備份、日誌等 devops 問題的整體解決方案。(擴充套件閱讀:宜信開源|詳解PaaS平臺LAIN的功能和架構)
在 LAIN 上,應用是一個基本的概念,某個應用的開發者只需要定義一個 lain.yaml 即可定義應用的編譯和執行方式,對應用程式碼侵入性很低。LAIN 基於容器技術,面向多樣化的技術棧,並且天然隔離系統和應用的依賴。
當 LAIN 使用者建立一個應用(服務)時,可以到 LAIN 上註冊該應用,當前的使用者自動成為了該應用的維護者,擁有了進一步操作該應用的許可權。構建應用的環境需要 docker 和 lain 命令列工具,為了方便,我們建立了一個 vagrant box 即 lain-box. 在構建應用時,除了工程程式碼外,還需要一個 Docker 映象作為基礎映象,即編譯的環境。如果是二進位制的工程,如 golang,則可以在執行時換掉一個底,否則會使用 build 映象為 release 映象。準備好映象和編譯/執行的指令碼後,就可以編輯 lain.yaml 了。
具體來說,lain.yaml 主要做了如下四件事:
1、應用名稱的確定,體現一個應用的邊界
2、應用的基礎技術棧,即編譯和執行的映象
3、構建過程(如何編譯)
4、微服務拆分及服務內部配置(如何執行、運維)
關於第4點,LAIN 上有一個 Proc 的概念,即每個應用都有一個或多個 Proc,Proc 在應用內有唯一的名字和型別,Proc 在底層對應於一組容器,一個應用之間的各個 Proc 的各個容器的網路是互通的,所以應用就是可以互相信任的幾個 Proc,對外表現為現實中的某項功能。Proc 的型別是 LAIN 內建的,worker 型別是最簡單的型別,LAIN 處理其它的 Proc 型別會做一些額外的事情。
在應用的層面上,LAIN 除了用 lain.yaml 將一個應用的依賴和行為固化外,還有以下幾大亮點:
1、SDN 網路安全隔離
-
使用 calico 專案構建 SDN 網路
-
高效率的應用內網路互通
-
應用間網路預設隔離
-
顯式宣告應用間的服務互訪
2、應用許可權的控制
-
sso 單點登入,統一認證
-
利用 sso 的組管理,console 進行應用維護者的許可權管理,包括 registry 的映象的許可權和應用維護的許可權
接下來,我們以一個最簡單的 web 服務為例,來說明 LAIN 的工作原理。
二、通過例項看LAIN 的9大功能
首先,用 go 寫一個簡單的 web 服務,hello.go
下一步,編輯 lain.yaml 檔案:
可以看出,lain.yaml 定義瞭如何編譯,釋出,測試一個應用。注意到 hello 應用只有一個 Proc,web 是 web.web 的簡寫形式,即 Proc 型別和名字都是 web. 對於每一個 Proc,LAIN 提供了幾個殺手級功能:
1、動態擴容縮容
可以在 lain.yaml 中定義一個 Proc 的例項數量,即 num_instances,可以定義每個例項所用的記憶體,也可以在命令列或 console 的 UI 上動態對例項個數以及所用記憶體大小進行調整。動態擴容縮容會自動注入一些 swarm 的 filters,保證同一個 Proc 的例項排程到不同的節點上。
2、volumes
即 docker 的 volume,如果配置了該欄位,每一個例項都對應擁有一個節點上的檔案目錄。雖然大部分情況下,加入 volume 意味著加入了狀態,不利於 HA,但有些特殊情況比如資料庫容器化時,volume 還是必須的。LAIN 的 volume 的精彩之處是可以配置一個備份策略,lain 有一個元件可以支援自定義備份,在備份過程前後還可以自定義指令碼,這些自定義指令碼何時執行的配置類同 crontab 的排程策略,相當於可以在容器裡定義一些 cron job。
3、cloud_volumes
由於某些資料需要高可用,另外 Proc 中不同的例項可能需要共享一個 volume,LAIN 集成了分散式檔案系統,比方說 ceph 和 MooseFS,cloud_volume 比普通的 volume 多一種使用方式,即所有的 instance 共享同一個分散式檔案系統目錄。
4、logs
本質上還是 docker volume,但是定義在 logs 欄位下目錄包含的檔案會被 lain 的日誌收集系統收集,效果等同於輸出到標準輸入輸出。這樣我們可以統一管理、查詢所有應用的日誌。
5、secret_files
考慮到一次編譯要在不同叢集(如測試、生產叢集)上執行,那必然會導致一個問題,就是如何載入某些配置,如資料庫使用者名稱和密碼,將這些配置寫入程式碼倉庫會帶來明顯的安全問題,也不方便自動整合和不同叢集上的部署,LAIN 通過內建的 lvault 元件實現了程式碼與配置的分離,每一個 LAIN 叢集都有一個自帶的配置中心 lvault,加密儲存著所有該叢集應用的配置檔案。只有應用管理者有許可權管理應用的配置檔案。這樣,使用者將不同叢集的配置分別寫到對應的 lvault 中,即可用將同一個映象推送到不同的叢集中並部署執行。
6、web 型別的 Proc
-
相關 nginx 配置的自動化:web 型別的 Proc 的流量會由一個基於 nginx 的元件 webrouter 做負載均衡,對於不同的 Proc,叢集有預設的 mount point,也可以自定義新的 mount point,即 servername 或 baseurl; 也可以定義 health check 等諸多實踐上必須的功能。
-
watcher 會自動重新整理 nginx 配置
-
日誌系統會自動收集 nginx 日誌
7、虛IP
虛 IP 是為了保證某個 Proc 的高可用而設計的一套機制。
-
Proc 可以註冊一個或多個虛 IP,應用可以通過虛 IP 對外服務,比如 webrouter 可以用虛 IP 機制去除 nginx 的單點
-
networkd 動態維護虛 IP:在 etcd 配置虛 ip 後,各個節點的 networkd 會得到通知,如果對應的 Proc 的例項排程到本節點上,則 networkd 會啟用該節點配置 vip 和 iptables 規則,保證流量可以到達例項容器。如果一個 Proc 註冊了多個虛 IP,networkd 會盡量將不同的虛 IP 分配到不同的節點上,由於容器是預設分散到不同的節點上的,所以這樣可以保證很嚴格的高可用。
8、Filters
LAIN 支援 swarm 的 constraint 和 affinity 等容器排程的引數,使得容器的排程更加合理,比方說默認同一個 Proc 的容器儘量排程到不同的節點上,最新的 LAIN 還支援使用者自定義 Proc 的 label 以及 Filters。
9、容器的監控和報警
利用自己開發的 collectd 外掛,監控容器的基本執行時資料,集成了 Carbon,Whisper,Graphite-Web,Grafana,icinga2 等開源元件,團隊開發了 hedwig,hagrid 兩個元件,提供了一整套監控報警系統。
對叢集而言,一個應用的部署大致經過這麼幾個階段:
1)console 通過 lain-sdk 對 lain.yaml 進行解析,為應用建立 network,建立 calico profile, 建立 sso 的應用維護者組.
2)console 呼叫 deployd 的介面,deployd 完成容器的編排,也提供了應用線上擴容縮容等 API,進行自動維持和災難恢復,並將一些重要的資料寫入 etcd 中
3)lainlet 監聽 etcd,networkd 和 webrouter 裡的 watcher 通過 lainlet 拿到叢集的最新配置,來完成虛 IP 的自動漂移和 nginx 配置的自動更新等。
總之,LAIN 在最開始的設計中較多地考慮了安全性,包括了 SDN 網路和應用許可權的管理,祕密檔案配置系統;在實現中,考慮到了多種技術棧的支援和容器化帶來的優勢,提供了包括備份、日誌、監控報警等一攬子解決方案,能夠讓應用使用者方便地開發各種特性的應用,提高了生產力;最後,對於 LAIN 叢集維護者,LAIN 提供了很多運維工具,包括 LAIN 節點的加入刪除,應用容器的手動遷移,節點的維護模式等等,基本上滿足了從日常運維到災難恢復的方方面面。
GitHub地址:https://github.com/laincloud
白皮書:https://laincloud.gitbooks.io/white-paper/content/
原文釋出於“高可用架構”
作者:宜信大資料創新中