宜信開源|一個實例解析PaaS平臺LAIN的9大殺手級功能

1、基於Docker的PaaS平臺LAIN

在金融的場景下,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 的工做原理。

2、經過實例看LAIN 的9大功能

首先,用 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團隊 王超一

相關文章
相關標籤/搜索