胡俊, 章兵, 陳鄭平, 范海威, 吳煒, 李澤科
(1. 南瑞集團公司(國網電力科學研究院), 江蘇, 南京 211106;2. 國電南瑞科技股份有限公司, 江蘇, 南京 211106; 3. 國網福建省電力有限公司, 福建, 福州 350000)
調控云[1]包括基礎設施層(IaaS)、平臺服務層(PaaS)、應用服務層(SaaS)共3層, 對外提供計算資源、調控云模型和數據服務。基礎設施層通過存儲虛擬化、主機虛擬化、桌面虛擬化、網絡虛擬化等,構建計算資源池、存儲資源池和網絡資源池。平臺服務層集成了云存儲、應用集成、數據處理、公共服務等多種組件,調控云將平臺服務層細分為4個業務支撐平臺:模型數據云平臺、運行數據云平臺、實時數據云平臺和大數據平臺[1]。
調控云平臺服務層為應用服務層運行提供了強有力的支撐,但對開發場景和測試場景的支撐則相對薄弱。目前虛擬資源管理機制在服務的部署、升級、擴容、回退、下線等方面靈活性不足,影響應用的彈性伸縮和敏捷交付[2]。為此,采用虛擬機和容器的混合架構對平臺進行升級,并引入容器和Kubernets[3]容器平臺技術。這為解決開發測試環境一致性和彈性伸縮等問題提供了可行解決方案,但也帶來了新的運行維護問題。
采用混合架構,調控云平臺存在虛擬機和容器等不同形式的資源池,應用部署將面臨更為復雜的運行環境管理,調試和測試難度都會增加。在IT界,通過實施DevOps(開發運維一體化)、建立自動化持續交付體系來提升軟件部署效率和質量,保障軟件快速可靠交付已成為大型分布式系統運維的普遍手段[4]。
因此,借鑒DevOps實踐在軟件交付和運維的成功經驗,設計調控云開發運維一體化服務、擴展云平臺服務層的開發運維支撐能力,是保障調控云穩定運行、發揮混合架構優勢的關鍵之一。
開發運維一體化服務不僅僅是一個應用部署自動化工具,還具備運行環境管理和系統監視功能。借助開發運維一體化服務,可以基于容器資源池快速構建運行環境、實現應用快速上線和實時監視。它的主要功能需求包括用戶管理、基礎數據管理、部署管理和系統狀態監視。
用戶管理實現基于角色的用戶權限模型。主要用戶角色包括:① 管理員,負責平臺運維,分配資源;② 應用開發人員,提交上線單;③ 應用負責人,管理項目資源,審核上線單;④ 測試人員,操作測試環境。
基礎數據分為運行環境數據和應用項目數據。運行環境數據主要包括虛擬機信息、容器集群信息和平臺公共服務組件信息。應用項目信息主要包括項目源代碼版本庫地址、分支、提交號和標簽等版本信息,以及項目的運行環境信息。
部署管理主要包括平臺組件部署、容器集群部署和應用部署。平臺組件和容器集群是部署在虛擬機上,應用軟件部署在虛擬機或容器集群上。部署管理支持二進制制品部署和基于源碼庫自動構建及部署;支持多項目并發部署,支持一鍵發布和一鍵快速回滾;用唯一ID標識每次部署,并記錄部署過程相關信息,當出錯時,可以快速定位和排查故障。
定時檢查虛擬機、容器集群、中間件和應用服務健康狀況。每個容器集群只能配置一個定時巡檢任務收集集群健康狀況數據,并及時對異常或風險點進行處理。應用健康檢查包括“應用存活檢查”和“應用就緒檢查”。
非功能性需包括部署要求和安全性要求。
(1) 部署要求。作為調控云平臺層服務在云端部署,提供Web界面,通過瀏覽訪問。
(2) 安全性要求。支持以HTTP協議調用容器集群接口和對外提供服務。
開發運維一體化服務由后端服務和前端界面2部分組成,如圖1所示。

圖1 體系結構圖
后端服務分為控制層、執行層和基礎環境。控制層由數據管理、用戶管理、部署管理和任務管理組成,主要功能是接收來自前端界面的調用,分發給執行層處理。執行層包括容器集群部署、平臺組件部署、應用軟件部署和系統狀態監視4個模塊,實現開發運維一體化的基本功能。
采用前后端分離的設計原則,前端界面與后端服務通過Restful協議通信,并采用WebSocket實現前后端的雙向實時通信,滿足遠程操作和實時信息展示等需求。采用模塊化設計可以支持擴展。
任務管理由任務觸發、任務配置、狀態查詢、消息隊列、任務執行單元、數據庫和實時庫組成,如圖2所示。任務觸發支持異步任務和定時任務2種類型,異步任務由前端業務邏輯觸發,定時任務由定時器產生。消息隊列接收任務觸發產生的消息(即任務),將其存入隊列;任務執行單元實時監控消息隊列,獲取隊列中調度的任務并執行。數據庫用于存儲任務定義和任務執行結果。

圖2 任務管理
部署管理由前端Web界面,后端的控制模塊、構建模塊分發模塊等組成,如圖3所示。構建模塊通過git-ssh方式創建倉庫本地副本,運行項目構建腳本生成可發布的軟件包。分發模塊支持二進制包和容器鏡像2種部署方式。針對以二進制方式部署場景,使用scp向服務器分發,然后再通過ssh解包部署和啟動運行;針對容器方式部署場景,編譯后打包成容器鏡像,推送到容器鏡像倉庫,通過容器或kuernetes的接口部署運行。控制模塊調用構建模塊和分發模塊執行具體操作,可支持人工觸發和基于代碼提交自動觸發。

圖3 部署管理
狀態監視包括應用服務狀態監視、平臺組件狀態監視和主機資源狀態監視,如圖4所示。應用服務狀態監視和平臺組件狀態監視,采用Google的4個黃金指標方法收集延遲、流量、錯誤和飽和度指標數據,在服務層級監視終端用戶體驗、服務中斷、業務影響等問題。主機狀態監視包括物理機和虛擬機,采用USE(Utilization、 Saturation和Error)方法,從操作系統層面收集CPU、內存、 網絡 I/ O、磁盤 I/ O等相關指標數據,監視任何資源在某種程度上的飽和都可能導致系統性能下降問題。

圖4 狀態監視
狀態監視在結構上分為監視服務和指標采集代理2部分,如圖5所示。監視服務由前端Web界面,后端數據收集、數據處理、數據接口和時序數據庫組成。指標采集代理部署在目標系統上,數據收集通過指標采集代理獲得指標數據。
狀態監視關注的是近期和實時數據,為保證時效,在本地采用時間序列庫保存指標數據,默認保留2周。指標數據經過處理后通過Web界面展示,也可生成告警。數據接口對外提供Restful服務,同時支持主動向信息運維綜合監管系統報送健康數據。數據收集、數據處理、對外數據報送等作為任務由任務管理模塊調度運行。

圖5 狀態監視結構圖
3.1.1 前后端分離
相比傳統的Web架構,前后端分離把MVC架構[5-6]中的業務邏輯處理單獨分離出來由后端處理。前端負責視圖和控制層,后端只負責業務邏輯,進行業務處理和數據處理等,如圖6所示。前后端通過AJAX和Json進行交付,需要雙向實時通信的場景則使用WebSocket,比如Web SSH。

圖6 前后端分離
3.1.2 前端框架
前端技術選型主要使用Vue.js[6]、Element[7]和Axios[8]框架,如圖7所示。Vue.js是一個前端用戶界面框架,適合于構建復雜單頁應用程序。Element是一套基于 Vue 2.0 的桌面端組件庫,有助于網站快速開發。Axios是一個基于Promise的HTTP請求客戶端。

圖7 前端架構
使用axios實現rest調用非常簡單,但是它沒有封裝,當項目變大時,會導致代碼冗余,難以維護。本項目對其進行二次封裝,各個組件能復用請求,讓代碼變得容易維護。
3.2.1 Web服務框架
開發 Web服務,引入一個框架是必要的,選擇合適的框架可以達到事半功倍的效果。 Go語言憑借簡潔的語法和優雅的并發,在開源中間件產品開發中被廣泛應用,比如Kubernets 等。Beego 是一個Go語言的Web應用快速開發框架,支持 Restful,提供了高度解耦的cache、config、context、httplibs、logs、orm、session和toolbox獨立模塊。因此本項目采用了Beego作為后端Web服務框架。
基于Beego框架,本項目快速實現了用戶管理、角色管理、菜單管理、字典管理、系統配置等通用后臺功能。并在此基礎上對自動化部署工具Ansible進行封裝,配合前端界面,將其指令界面化,達到操作直觀、簡單易用的效果。
3.2.2 分布式任務和鎖
利用消息隊列實現任務調度是分布式系統的常用設計模式。OpenStack云平臺就是使用了消息隊列來協調服務之間的操作和狀態信息[7-8]。本文采用消息隊列來實現任務管理。定時任務被封裝為一條消息,發往消息隊列,工作節點監聽消息隊列執行任務。為了防止定時任務觸發單點故障,運行多個觸發器,并通過分布式鎖防止重復觸發。
分布式鎖有3個基本屬性:互斥、無死鎖和容錯。主流分布式鎖有基于ZooKeeper、Redis 或Etcd的實現方案。調控云平臺中已使用Redis和Etcd集群,本文在redis和Etcd方案進行比較和選型。Redis方案在某些場景下解決并發問題存在不安全的因素[9]。Etcd具備分布式一致性、租約機制、前綴機制和監聽機制等特性,能實現可靠的分布式鎖,因此本文采用Etcd方案。
Prometheus[10]是一個開源的完整監控解決方案, 2016年5月繼Kubernetes之后成為第二個正式加入CNCF基金會的項目,于 2017年底發布了2.0版本,能夠感知Kubernetes容器編排系統部署動態創建的應用服務是它的優勢。
Prometheus通過HTTP協議周期性收集被監控組件的指標數據,只要組件提供相應接口就可以接入,這種接口稱為 Exporter。一般常用組件都有可用的Exporter,比如 Nginx、MySQL和Linux 系統信息(包括CPU、內存、網絡、磁盤等)。Prometheus可擴展性友好,可以開發Exporter來支撐新組件。

圖8 前后端分離
本項目采用Prometheus框架,并從配置文件下發、查詢API封裝和定制Exporter等方面進行二次開發。采用Gitlab版本化存儲Prometheus配置信息,通過下發配置來管理監控目標,通過API讀出監控數據統一展示。此外,定制開發Exporter獲取調控云達夢數據庫的指標,如圖8所示。
隨著調控云平臺采用虛擬機和容器混合部署,以及微服務的應用,軟硬件架構變得復雜,同時服務數量增加,服務上線周期縮短,運維壓力隨之增大。本文提出一個面向調控云平臺的開發運維一體化服務解決方案,并對關鍵技術和實現路徑進行了詳細分析。開發運維一體化服務能有效提高平臺自身及應用微服務的運行維護自動化水平,保證系統的安全、穩定和高效運行。