包達爾罕,袁成軍,賀新樂
(西安微電子技術研究所,陜西 西安 710054)
隨著空間技術的高速發(fā)展,空間任務的復雜性和空間資源的稀缺性使得傳統(tǒng)的軟件部署方式已經(jīng)逐漸無法滿足空間探索的要求.空間探索帶來靈活多樣的軟件需求、短期快速的軟件研制周期、延后的軟件狀態(tài)固化和日益復雜的軟件架構框架等.
因此,空間技術需要一種新的軟件框架來降低服務的復雜度和縮短平臺的軟件開發(fā)周期,實現(xiàn)系統(tǒng)、平臺和服務的解耦合,提高系統(tǒng)的可靠性、安全性.微服務架構正是滿足上述要求而出現(xiàn),它的核心是軟件開發(fā)與面向服務相結合,將復雜多樣的軟件程序架構變成一組或多組低耦合、單一性的服務.每個服務具有相對獨立性,互不影響,而且服務之間也可以通過一定的通信機制互相傳遞信息.
本文的微服務框架采用SaaS(Software as a Service)框架,把服務平臺演化成以網(wǎng)絡通信構建的模式,其中,軟件應用的研發(fā)平臺都是一種服務.SaaS能夠顯著提高軟件開發(fā)的速度,尤其是縮短軟件的研發(fā)周期.因此,對于空間軟件應用的要求,SaaS能夠顯著提升工程效率,并且有效整合當前空間資源,實現(xiàn)空間軟件服務部署的近似最優(yōu)解.
SaaS的優(yōu)點在于可以給用戶提供在空間環(huán)境下應用服務程序,并且可以通過輕量級的客戶端接口或程序接口使用戶可以直接訪問應用程序.用戶無需管理或控制底層SaaS 的基礎架構,包括網(wǎng)絡、服務器、操作系統(tǒng)、存儲甚至單獨的應用程序功能[1].
在主流的SaaS解決方案中,筆者選用容器作為空間應用服務的最小細胞單元,因此選用docker作為SaaS關鍵技術層;Kubernetes作為當前docker容器管理的主流平臺,作為SaaS服務管理層.同時,當前主流的容器監(jiān)控平臺主要以Kubernetes自帶的Dashboard為主,也有以Prometheus+Grafana的相對靈活的監(jiān)控方式.
但是,根據(jù)空間應用的特點,筆者提出了一種基于Lens的信息化監(jiān)控軟件模型,以滿足SaaS平臺中服務監(jiān)控的要求,同時能夠解決對網(wǎng)絡與硬件信息實時獲取的要求.
主要介紹空間多平臺信息化監(jiān)控軟件模型中可視化實時顯示工具Lens 與以流形式獲取信息工具Prometheus,并且介紹兩者技術特點和應用情況.
Lens 是一個跨平臺的開源的度量分析和可視化工具,可以通過將采集的數(shù)據(jù)查詢然后可視化的展示,并及時通知.它近似于一種針對Kubernetes的IDE工具,可以獨立于SaaS框架之外作為監(jiān)控使用,并且可以通過通信機制遠端查看Kubernetes的狀態(tài)信息[2].
Lens可以實時查看Kubernetes集群狀態(tài),比如Pod實時日志查看、集群Events實時查看、集群故障排查等.Lens,就不再需要敲打很長的kubectl命令,只要使用鼠標點擊幾下,非常便捷.它具有下面這些優(yōu)點:(1)可多集群管理,能夠支持數(shù)百個集群;(2)它是相對獨立應用,無需在集群中安裝特殊組件;(3)集群狀態(tài)實時可視化,提供資源利用率圖表和歷史趨勢圖表;(4)提供終端訪問節(jié)點和容器;(5)完全支持Kubernetes RBAC.
同樣,Lens具有較好的可擴展性.因其屬于開源項目,主要使用的技術包括TypeScript作為前端與后端,ReactJS作為前端與UI,MobX作為狀態(tài)管理.Lens可以通過編寫擴展API的方式,來獲得定制化功能或增強性變化.
Prometheus 屬于系統(tǒng)監(jiān)控和警報工具,最初構建于SoundCloud[3].自2012年成立以來,許多公司和組織都采用了Prometheus,該項目擁有非?;钴S的開發(fā)者和用戶社區(qū).它現(xiàn)在是一個獨立的開源項目,獨立于任何公司進行維護.為了強調這一點,并澄清項目的治理結構,Prometheus于2016年加入云原生計算基金會,作為繼Kubernetes之后的第二個托管項目[4].
Prometheus 實質上是開源報警系統(tǒng)和時序列數(shù)據(jù)庫(TSDB).因此,它的模型結構如圖1 所示.Prometheus 存儲數(shù)據(jù)是時序數(shù)據(jù),即按相同時序進行數(shù)據(jù)排列,以時間維度存儲連續(xù)的數(shù)據(jù).因此,它設定Metric類型,并建立相應的數(shù)據(jù)查詢DSL語言即PromQL.圖中Exporter負責數(shù)據(jù)搜集并匯報的程序[5].
圖1 Prometheus結構模型圖Fig. 1 Structural model diagram of Prometheus
因此,Prometheus的核心組件構成主要有(1)Prometheus server:主要的核心組件,用來收集和存儲時間序列數(shù)據(jù);(2)client libraries:提供客戶端,主要是用來幫助應用程序更容易生成滿足Prometheus 格式的監(jiān)控數(shù)據(jù),支持各種各樣的開發(fā)語言;(3)push gateway:對于那些生存時間很短的job 工作,采用Prometheus 的pull 模式可能來不及收集,可以部署這個組件,讓job 主動把監(jiān)控指標push 到getway,Prometheus再從getway中拉??;(4)exports:各種各樣的集群信息;(5)alertmanager:警告組件[6].
Prometheus作為Google發(fā)起的Linux基金會的開源項目有如下優(yōu)點:
(1)提供時序性數(shù)據(jù)模型(時間流的key/value 數(shù)據(jù)組);(2)自主開發(fā)的數(shù)據(jù)查詢DSL 語言.即PromQL;(3)支持系統(tǒng)節(jié)點存儲,也可以存儲到指定的數(shù)據(jù)庫中;(4)采用Http協(xié)議,具有默認的模式拉取數(shù)據(jù),也可以通過中間工具轉發(fā)數(shù)據(jù);(5)易于集成、可擴展.
信息化監(jiān)控的本質是,基于信息化系統(tǒng)中的服務,構建起獲取信息與傳遞信息的通路,其中可以涉及軟件資源、硬件資源和系統(tǒng)狀態(tài)信息等.信息化的數(shù)據(jù)記錄并承載服務的動態(tài)或靜態(tài)指標,并且獨立于運行平臺之外.監(jiān)控軟件模型能夠通過不同的采集方法,減少空間應用軟件與多樣資源的差異,實現(xiàn)統(tǒng)一管理、統(tǒng)一規(guī)范、統(tǒng)一處理、統(tǒng)一展現(xiàn),最終實現(xiàn)運維規(guī)范化、自動化、智能化的運維管理[7].
監(jiān)控的日志信息和數(shù)據(jù)展示是監(jiān)控軟件模型的重要組成功能,SaaS服務監(jiān)控模型的實現(xiàn)架構主要可以分為2個部分,其中包括日志信息和數(shù)據(jù)展示2個部分.由此可以再劃分為4個部分,分別為數(shù)據(jù)收集、數(shù)據(jù)展示、日志收集、日志展示.針對空間多平臺信息化系統(tǒng)的要求,數(shù)據(jù)收集主要通過Prometheus和Kubernetes的kubectl工具完成,數(shù)據(jù)展示和日志展示則主要通過Lens來實現(xiàn),如圖2所示.
圖2 信息化監(jiān)控軟件模型Fig. 2 Software model of information monitor
Lens從根本上解決了Zabbix不能檢測Kubernetes集群中容器狀態(tài)的問題,通過kubectl遠程客戶端和kubelet配置文件組合,形成可以脫離集群范圍的以網(wǎng)絡通信為媒介的監(jiān)控系統(tǒng)框架.并且,Lens支持多集群的監(jiān)控,其Kubernetes系統(tǒng)資源數(shù)據(jù)收集,通過Prometheus完成,形成圖形化、可視化和動態(tài)化的功能模塊.
Lens 的系統(tǒng)有前端展示界面和后端數(shù)據(jù)收集,前端展示通過TypeScript 和Electron 完成界面.后端數(shù)據(jù)收集由2 個模塊共同構成,分別是kubectl構成k8s資源信息的收集和Prometheus組成的系統(tǒng)狀態(tài)信息.
前端界面模塊是一個窗口展示界面,主要是將數(shù)據(jù)收集層獲取到的數(shù)據(jù)進行統(tǒng)一展示,展示的方式可以是曲線圖、柱狀圖、餅狀圖等,通過將數(shù)據(jù)圖形化,可以幫助用戶了解一段時間內主機或網(wǎng)絡的運行狀態(tài)和運行趨勢,并幫助用戶來排查問題或解決問題.
Lens 是一個開源的管理Kubernetes 集群的IDE,支持MacOS,Windows 和Linux.當前演示環(huán)境使用Linux 的Ubuntu20.04 LTS 版本和Windows 10 版本,Lens 版本使用4.2.4,連接的Kubernetes 集群運行在本地環(huán)境,包括X86和ARM 64的樹莓派節(jié)點.
啟動Lens 后,通過點擊左上角的+圖標并選擇kube-config,將Lens 連接到Kubernetes 集群.連接上之后,Lens將顯示大量關于集群的信息,可以看到正在運行的工作負載,包括Pods、守護進程.
前端界面展示主要用來完成收集到的數(shù)據(jù)整理,并按照預先的分類進行處理,筆者對Lens進行了部分前端界面的修改使之能夠滿足空間應用的需求.
前端界面受限是系統(tǒng)整體的狀態(tài)圖,這部分的數(shù)據(jù)收集是通過Prometheus的時序數(shù)據(jù)實現(xiàn),而下方的數(shù)據(jù)則是通過kubectl獲取的系統(tǒng)日志信息.前端界面的左側為預先定制好的Kubernetes系統(tǒng)對象資源分類.包括了主要Kubernetes信息,如Node信息、工作負載、Pod信息、調度信息、集群配置信息和網(wǎng)絡等.
節(jié)點主要包含kubectl執(zhí)行kubectl get nodes命令后的信息,艙儲則是Pod的相關信息,還有相關的日志信息都在其中.
后端數(shù)據(jù)收集模塊主要包括了2個部分,分別是kubectl和Prometheus.這2個部分共同運作,才能夠在前端顯示出動態(tài)的、實時的數(shù)據(jù).
3.2.1 kubectl 數(shù)據(jù)收集模塊 kubectl 數(shù)據(jù)收集模塊的構成主要通過Kubernetes 發(fā)布的應對不同系統(tǒng)的kubectl客戶端,和與之相對應的kubectl命令構成.
后端使用TypeScript 構建并生成數(shù)據(jù)收集所需的JS 文件,通過JS 文件執(zhí)行kubectl 客戶端,實現(xiàn)對Kubernetes 的資源對象類型信息獲取的功能.但是,資源對象經(jīng)過分類主要分為node、pod、kube-object 和log4類.這4類分別通過不同的數(shù)據(jù)模塊解決,即node-menu、pod-menu、kube-object-event-status和example-extension,其中,后兩者收集Kubernetes的大量信息.
3.2.2 Prometheus 數(shù)據(jù)收集模塊 Prometheus 數(shù)據(jù)收集模塊對于Kubernetes 也是容器的一種,與其他單一容器不同,它是由多個不同類型的容器組成,主要包含3種容器,即本體容器Prometheus、節(jié)點信息收集容器node-exporter 和數(shù)據(jù)收集處理的kube-state-metrics.Prometheus 具有2 種數(shù)據(jù)處理方式,kube-statemetrics 是其中一種,另一種為metric-server.在Lens 中,本文使用的是前者,更有利于收集集群的狀態(tài)信息,更偏向于Kubernetes相關的信息[8].
Prometheus的部分相對復雜,因此,Lens則用單獨功能模塊實現(xiàn)這部分功能,并且也提供與之相對應的接口,用戶可自行修改Prometheus 的部署方式,使用不同的版本和組件.筆者使用的版本是能夠兼容x86和ARM64的容器架構,具有跨硬件平臺監(jiān)控的能力.
筆者主要是修改功能模塊下的yaml文件,來修改Prometheus的功能規(guī)則和信息標準.Prometheus把收集到的數(shù)據(jù)通過kube-state-metrics保存統(tǒng)一格式的數(shù)據(jù)存儲到Prometheus自帶的時序數(shù)據(jù)庫,用于Lens調用.
Prometheus 的部署主要分成14 個相關yaml 文件,其中,關鍵文件為configmap 文件、service 文件、statefulset 文件和rules文件.這4種文件決定數(shù)據(jù)收集信息的內容和規(guī)則,并且將安全密鑰等級寫入Prometheus中,使之能夠正確運行在Kubernetes集群之上.
除了Prometheus的容器部署之外,還需要部分node-exporter和kube-state-metrics兩種容器.
Prometheus的工作流程相對固定,主要包含3個方面:Prometheus server定期從配置好的jobs或者exporters中拉取metrics,或者接收來自Push的gateway發(fā)送過來的metrics,或者從其他的Prometheusserver中拉metrics;Prometheus server在本地存儲收集到的metrics,并運行定義好的alerts.rules,記錄新的時間序列或者向Alert manager推送警報;Alertmanager根據(jù)配置文件,對接收到的警報進行處理,在圖形界面中發(fā)出警告,可視化采集數(shù)據(jù).
筆者對Lens進行部分修改,使之更適應空間多平臺信息化應用,并且提升監(jiān)控模塊的組成,更有利于對SaaS平臺服務的觀察與監(jiān)控,能夠節(jié)省大量的人力成本,實現(xiàn)自動化且實時的監(jiān)控軟件平臺.