在金融的場景下,LAIN 是爲解放各個團隊和業務線的生產力而設計的一個雲平臺。LAIN 正式上線已經大約兩年,基本已經成熟,爲宜信大數據創新中心各個團隊提供了統一的測試和生產環境,簡化了服務的部署與上線流程,也下降了運維人員對系統管理的複雜度。nginx
LAIN 規範了一個應用的開發、測試、上線工做流,提供了爲應用作的容器編排、權限控制、SDN、流量管理、監控報警、備份、日誌等 devops 問題的總體解決方案。(擴展閱讀:宜信開源|詳解PaaS平臺LAIN的功能和架構)git
在 LAIN 上,應用是一個基本的概念,某個應用的開發者只須要定義一個 lain.yaml 便可定義應用的編譯和運行方式,對應用代碼侵入性很低。LAIN 基於容器技術,面向多樣化的技術棧,而且自然隔離系統和應用的依賴。github
當 LAIN 用戶建立一個應用(服務)時,能夠到 LAIN 上註冊該應用,當前的用戶自動成爲了該應用的維護者,擁有了進一步操做該應用的權限。構建應用的環境須要 docker 和 lain 命令行工具,爲了方便,咱們建立了一個 vagrant box 即 lain-box. 在構建應用時,除了工程代碼外,還須要一個 Docker 鏡像做爲基礎鏡像,即編譯的環境。若是是二進制的工程,如 golang,則能夠在運行時換掉一個底,不然會使用 build 鏡像爲 release 鏡像。準備好鏡像和編譯/運行的腳本後,就能夠編輯 lain.yaml 了。golang
具體來講,lain.yaml 主要作了以下四件事:web
一、應用名稱的肯定,體現一個應用的邊界docker
二、應用的基礎技術棧,即編譯和運行的鏡像數據庫
三、構建過程(如何編譯)安全
四、微服務拆分及服務內部配置(如何運行、運維)網絡
關於第4點,LAIN 上有一個 Proc 的概念,即每一個應用都有一個或多個 Proc,Proc 在應用內有惟一的名字和類型,Proc 在底層對應於一組容器,一個應用之間的各個 Proc 的各個容器的網絡是互通的,因此應用就是能夠互相信任的幾個 Proc,對外表現爲現實中的某項功能。Proc 的類型是 LAIN 內置的,worker 類型是最簡單的類型,LAIN 處理其它的 Proc 類型會作一些額外的事情。架構
在應用的層面上,LAIN 除了用 lain.yaml 將一個應用的依賴和行爲固化外,還有如下幾大亮點:
一、SDN 網絡安全隔離
使用 calico 項目構建 SDN 網絡
高效率的應用內網絡互通
應用間網絡默認隔離
顯式聲明應用間的服務互訪
二、應用權限的控制
sso 單點登陸,統一認證
利用 sso 的組管理,console 進行應用維護者的權限管理,包括 registry 的鏡像的權限和應用維護的權限
接下來,咱們以一個最簡單的 web 服務爲例,來講明 LAIN 的工做原理。
首先,用 go 寫一個簡單的 web 服務,hello.go
下一步,編輯 lain.yaml 文件:
能夠看出,lain.yaml 定義瞭如何編譯,發佈,測試一個應用。注意到 hello 應用只有一個 Proc,web 是 web.web 的簡寫形式,即 Proc 類型和名字都是 web. 對於每個 Proc,LAIN 提供了幾個殺手級功能:
一、動態擴容縮容
能夠在 lain.yaml 中定義一個 Proc 的實例數量,即 num_instances,能夠定義每一個實例所用的內存,也能夠在命令行或 console 的 UI 上動態對實例個數以及所用內存大小進行調整。動態擴容縮容會自動注入一些 swarm 的 filters,保證同一個 Proc 的實例調度到不一樣的節點上。
二、volumes
即 docker 的 volume,若是配置了該字段,每個實例都對應擁有一個節點上的文件目錄。雖然大部分狀況下,加入 volume 意味着加入了狀態,不利於 HA,但有些特殊狀況好比數據庫容器化時,volume 仍是必須的。LAIN 的 volume 的精彩之處是能夠配置一個備份策略,lain 有一個組件能夠支持自定義備份,在備份過程先後還能夠自定義腳本,這些自定義腳本什麼時候運行的配置類同 crontab 的調度策略,至關於能夠在容器裏定義一些 cron job。
三、cloud_volumes
因爲某些數據須要高可用,另外 Proc 中不一樣的實例可能須要共享一個 volume,LAIN 集成了分佈式文件系統,比方說 ceph 和 MooseFS,cloud_volume 比普通的 volume 多一種使用方式,即全部的 instance 共享同一個分佈式文件系統目錄。
四、logs
本質上仍是 docker volume,可是定義在 logs 字段下目錄包含的文件會被 lain 的日誌收集系統收集,效果等同於輸出到標準輸入輸出。這樣咱們能夠統一管理、查詢全部應用的日誌。
五、secret_files
考慮到一次編譯要在不一樣集羣(如測試、生產集羣)上運行,那必然會致使一個問題,就是如何加載某些配置,如數據庫用戶名和密碼,將這些配置寫入代碼倉庫會帶來明顯的安全問題,也不方便自動集成和不一樣集羣上的部署,LAIN 經過內置的 lvault 組件實現了代碼與配置的分離,每個 LAIN 集羣都有一個自帶的配置中心 lvault,加密存儲着全部該集羣應用的配置文件。只有應用管理者有權限管理應用的配置文件。這樣,用戶將不一樣集羣的配置分別寫到對應的 lvault 中,便可用將同一個鏡像推送到不一樣的集羣中並部署運行。
六、web 類型的 Proc
相關 nginx 配置的自動化:web 類型的 Proc 的流量會由一個基於 nginx 的組件 webrouter 作負載均衡,對於不一樣的 Proc,集羣有默認的 mount point,也能夠自定義新的 mount point,即 servername 或 baseurl; 也能夠定義 health check 等諸多實踐上必須的功能。
watcher 會自動刷新 nginx 配置
日誌系統會自動收集 nginx 日誌
七、虛IP
虛 IP 是爲了保證某個 Proc 的高可用而設計的一套機制。
Proc 能夠註冊一個或多個虛 IP,應用能夠經過虛 IP 對外服務,好比 webrouter 能夠用虛 IP 機制去除 nginx 的單點
networkd 動態維護虛 IP:在 etcd 配置虛 ip 後,各個節點的 networkd 會獲得通知,若是對應的 Proc 的實例調度到本節點上,則 networkd 會激活該節點配置 vip 和 iptables 規則,保證流量能夠到達實例容器。若是一個 Proc 註冊了多個虛 IP,networkd 會盡可能將不一樣的虛 IP 分配到不一樣的節點上,因爲容器是默認分散到不一樣的節點上的,因此這樣能夠保證很嚴格的高可用。
八、Filters
LAIN 支持 swarm 的 constraint 和 affinity 等容器調度的參數,使得容器的調度更加合理,比方說默認同一個 Proc 的容器儘可能調度到不一樣的節點上,最新的 LAIN 還支持用戶自定義 Proc 的 label 以及 Filters。
九、容器的監控和報警
利用本身開發的 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/
原文發佈於「高可用架構」
做者:宜信大數據創新中心LAIN團隊 王超一