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