謝超群
(福建中醫(yī)藥大學(xué) 現(xiàn)代教育技術(shù)中心,福州 350122)
隨著近年來高校信息化的不斷深入,高校數(shù)據(jù)中心中的許多應(yīng)用服務(wù)已經(jīng)逐漸采用微服務(wù)架構(gòu),轉(zhuǎn)變到使用容器部署的方式.目前高校數(shù)據(jù)中心主要利用Docker容器技術(shù)和Kubernetes容器編排管理技術(shù)來構(gòu)建學(xué)校的容器云平臺,但傳統(tǒng)的監(jiān)控模式不具備完善的監(jiān)控容器云的功能,導(dǎo)致高校數(shù)據(jù)中心在容器云平臺的監(jiān)控方面遇到了以下的問題:由于Kubernetes管理的應(yīng)用服務(wù)具備彈性擴(kuò)展的特性,容器云中的應(yīng)用容器會動態(tài)創(chuàng)建和銷毀,傳統(tǒng)監(jiān)控模式無法自動發(fā)現(xiàn)和監(jiān)控這些容器;容器云可能需要對應(yīng)用運(yùn)行的指標(biāo)進(jìn)行監(jiān)控,但傳統(tǒng)的監(jiān)控模式無法對應(yīng)用容器中的應(yīng)用運(yùn)行指標(biāo)進(jìn)行監(jiān)控.
Prometheus是一款開源的監(jiān)控系統(tǒng),具備對Kubernetes管理的容器云的監(jiān)控功能,可對容器云上的Node物理節(jié)點(diǎn)、應(yīng)用容器、Kubernetes集群資源、容器應(yīng)用運(yùn)行狀態(tài)進(jìn)行動態(tài)發(fā)現(xiàn)、監(jiān)控和智能告警.結(jié)合開源可視化組件Grafana對接Prometheus監(jiān)控?cái)?shù)據(jù),作為容器云的監(jiān)控前端,構(gòu)建高校數(shù)據(jù)中心容器云監(jiān)控平臺,可解決目前高校數(shù)據(jù)中心容器云監(jiān)控面臨的難題.
Prometheus是基于Google公司的Borgmon監(jiān)控系統(tǒng)的設(shè)計(jì)理念,由SoundCloud公司采用Go語言開發(fā)的一款開源監(jiān)控系統(tǒng).與Google的Borgmon功能類似,Prometheus主要用于數(shù)據(jù)中心各種服務(wù)器、容器云平臺和應(yīng)用程序等的監(jiān)控,具備強(qiáng)大的云原生監(jiān)控功能,于2016年加入云原生云計(jì)算基金會(CNCF),并成為繼Kubernetes之后的第二個(gè)CNCF認(rèn)可的云原生項(xiàng)目[1].
圖1 Prometheus體系結(jié)構(gòu)圖
Prometheus主要由Prometheus Server、 Exporter、Push Gateway、Alertmanager、Web UI等幾大模塊構(gòu)成,Prometheus Server是Prometheus的核心組件,主要負(fù)責(zé)對監(jiān)控對象的監(jiān)控?cái)?shù)據(jù)采集、存儲和查詢,Prometheus Server采用輪詢Pull的方式,從監(jiān)控對象開放的接口中拉取監(jiān)控?cái)?shù)據(jù).Prometheus Server內(nèi)置高效的TSDB的數(shù)據(jù)庫,其抓取的監(jiān)控?cái)?shù)據(jù)按照時(shí)間序列的方式存儲在該數(shù)據(jù)庫中,并使用自定義的PromQL,對外提供監(jiān)控?cái)?shù)據(jù)的查詢和分析功能.Prometheus Server除可以采用靜態(tài)配置方式監(jiān)控目標(biāo)對象之外,還可以利用Service Discovery自動發(fā)現(xiàn)方式動態(tài)監(jiān)控目標(biāo)對象,比如自動感知Kubernetes動態(tài)創(chuàng)建的應(yīng)用容器,并將新的應(yīng)用容器加入監(jiān)控列表[2].Exporter安裝在監(jiān)控對象上,主要負(fù)責(zé)將監(jiān)控?cái)?shù)據(jù)轉(zhuǎn)化為Prometheus Server能理解的數(shù)據(jù)形式,通過http的EndPoint端點(diǎn)開放在網(wǎng)絡(luò)上.Prometheus Server通過訪問Exporter暴露的EndPoint端點(diǎn)來采集監(jiān)控?cái)?shù)據(jù).Exporter分為兩種類型:一類Exporter可以直接支持Prometheus 的數(shù)據(jù)采集,其內(nèi)置了Prometheus Server的http的EndPoint端點(diǎn),Prometheus Server可直接獲取該類型Exporter的監(jiān)控?cái)?shù)據(jù).另一類Exporter由于監(jiān)控目標(biāo)不支持Prometheus 的數(shù)據(jù)采集,需采用 Prometheus的ClientLibrary來編寫監(jiān)控目標(biāo)的監(jiān)控采集程序Exporter.Push Gateway作為中間網(wǎng)關(guān),主要負(fù)責(zé)對短期監(jiān)控任務(wù)的數(shù)據(jù)采集,短期監(jiān)控任務(wù)往往在Prometheus Server來抓取監(jiān)控?cái)?shù)據(jù)之前就已經(jīng)結(jié)束,因此需要Push Gateway來采集短期監(jiān)控任務(wù)推送過來的監(jiān)控?cái)?shù)據(jù),避免監(jiān)控?cái)?shù)據(jù)的丟失.Alertmanager主要負(fù)責(zé)管理來自Prometheus Server推送過來的告警信息,具備告警去重、 分組的功能,并可以自定義告警方式,可以支持郵件、 微信、 釘釘?shù)戎髁髅浇榫嫱扑头绞剑甈rometheus Server 可以利用Prom QL 自定義告警的規(guī)則,當(dāng)Prom QL創(chuàng)建的規(guī)則被觸發(fā)時(shí),Prometheus Server將產(chǎn)生告警并推送到Alertmanager[3].Web UI是Prometheus內(nèi)置的Web圖形界面,可以對Prometheus Server抓取的數(shù)據(jù)在瀏覽器中利用PromQL實(shí)現(xiàn)監(jiān)控?cái)?shù)據(jù)的查詢以及可視化.Prometheus的體系架構(gòu)圖如圖1所示.
Kubernetes是一款開源的容器編排工具,現(xiàn)已成為高校數(shù)據(jù)中心容器云管理的常見平臺.從架構(gòu)層次上分析,Kubernetes容器云的監(jiān)控可以分為三個(gè)層次,第一層次是容器云底層基礎(chǔ)設(shè)施的監(jiān)控,主要是對容器云的各種集群節(jié)點(diǎn)如物理機(jī)、虛擬機(jī)、云主機(jī)的監(jiān)控,包含對集群節(jié)點(diǎn)的主機(jī)負(fù)載、CPU使用率、內(nèi)存使用率、存儲空間以和網(wǎng)絡(luò)IO等指標(biāo)的監(jiān)控,這些指標(biāo)直接影響著整個(gè)容器云的運(yùn)行狀態(tài).第二個(gè)層次是對 Kubernetes內(nèi)部系統(tǒng)組件的監(jiān)控,Kube-apiserver是Kubernetes提供的API服務(wù)接口 ,是Kubernetes所有服務(wù)的入口,Kubernetes容器云中的內(nèi)部組件和外部客戶端都需要與Kube-apiserver通訊,才能完成與Kubernetes容器云的交互,因此需要監(jiān)控Kube-apiserver的可用性和并發(fā)數(shù)等指標(biāo),這些指標(biāo)直接影響著Kubernetes容器云的正常運(yùn)行.Kube-scheduler負(fù)責(zé)完成容器POD在集群上調(diào)度工作,Kubelet完成POD的創(chuàng)建和啟動工作.這二個(gè)Kubernetes組件的運(yùn)行狀態(tài)直接影響著POD容器創(chuàng)建和啟動的速度,因此需要監(jiān)控Kube-scheduler和Kubelet的運(yùn)行狀態(tài).第三個(gè)層次是對容器和POD性能指標(biāo)的監(jiān)控.容器和POD是承載應(yīng)用運(yùn)行的系統(tǒng)資源,容器和POD占用的內(nèi)存、CPU、網(wǎng)絡(luò)IO等性能指標(biāo),直接影響著容器中應(yīng)用的運(yùn)行狀態(tài)[4].第四個(gè)層次是容器中運(yùn)行的應(yīng)用服務(wù)本身的監(jiān)控,比如容器中運(yùn)行的WEB服務(wù)和中間件服務(wù)的可用性和并發(fā)數(shù)等指標(biāo),這些是數(shù)據(jù)中心管理員都需要關(guān)注的應(yīng)用指標(biāo),通過這些指標(biāo)能隨時(shí)掌握數(shù)據(jù)中心容器云中應(yīng)用服務(wù)的動態(tài)情況.
隨著高校數(shù)據(jù)中心的應(yīng)用服務(wù)越來越多采用微服務(wù)的架構(gòu),數(shù)據(jù)中心的應(yīng)用服務(wù)從傳統(tǒng)服務(wù)器的部署模式漸漸向容器部署的模式轉(zhuǎn)移,導(dǎo)致數(shù)據(jù)中心管理的應(yīng)用容器增長迅速.?dāng)?shù)據(jù)中心的應(yīng)用容器主要采用Kubernetes容器編排管理工具進(jìn)行管理,Prometheus原生支持監(jiān)控Kubernetes管理的容器云.通過Prometheus可以監(jiān)控Kubernetes集群節(jié)點(diǎn)、Kubernetes的內(nèi)部系統(tǒng)組件Kube-apiserver、Kube-scheduler、Kubelet的運(yùn)行情況、容器和Pod相關(guān)的性能指標(biāo)數(shù)據(jù)、Kubernetes資源對象的狀態(tài)信息、應(yīng)用服務(wù)運(yùn)行狀態(tài)等.使用Prometheus基本可以完成對Kubernetes管理的容器云各個(gè)層面的監(jiān)控,高校數(shù)據(jù)中心容器云監(jiān)控平臺架構(gòu)圖如圖2所示.
圖2 容器云監(jiān)控平臺架構(gòu)圖
采用Prometheus監(jiān)控Kubernetes容器云實(shí)現(xiàn)的具體實(shí)現(xiàn)思路如下:通過在每臺Kubernetes集群節(jié)點(diǎn)部署Node_exporter,采集Kubernetes容器云節(jié)點(diǎn)資源使用的監(jiān)控?cái)?shù)據(jù).Node_exporter的部署方式采用DeamonSet控制器來部署Node_exporter,保證容器云中每個(gè)節(jié)點(diǎn)上都會運(yùn)行一個(gè)Node_exporter的POD實(shí)例,并會隨著節(jié)點(diǎn)數(shù)的增減而動態(tài)調(diào)整Node_exporter的POD實(shí)例的數(shù)量;通過Kube-apiserver、Kube-scheduler、Kubelet等Kubernetes內(nèi)部組件開放的接口,采集Kubernetes容器云的內(nèi)部系統(tǒng)組件的監(jiān)控?cái)?shù)據(jù).Kube-apiserver、Kube-scheduler、Kubelet默認(rèn)都有開放http接口,Prometheus可通過該接口來采集指標(biāo)數(shù)據(jù);cAdvisor是內(nèi)置在Kubernetes的kubelet組件中的容器監(jiān)控工具,默認(rèn)部署在每個(gè)容器云節(jié)點(diǎn)之上,Prometheus通過查詢cAdvisor暴露的http接口,可以采集應(yīng)用容器的相關(guān)性能指標(biāo),包含容器的內(nèi)存、CPU、網(wǎng)絡(luò)IO、資源IO等資源使用情況,并可通過容器的監(jiān)控?cái)?shù)據(jù)進(jìn)一步計(jì)算POD的性能指標(biāo)[5];Kube-state-metrics組件是Kubernetes官方提供的監(jiān)控容器云資源對象的組件,采用Deployment部署的方式運(yùn)行在Kubernetes容器云中,通過Kubernetes提供的API獲取容器云中Node、Pod、Daemonset、Deployment、Ingress、Endpoint等資源的狀態(tài)信息,并將這些信息通過以http接口的形式提供給Prometheus進(jìn)行采集[6];容器云上部署的應(yīng)用服務(wù)的性能監(jiān)控,可以在應(yīng)用程序開發(fā)時(shí)利用Prometheus的ClientLibrary開發(fā)應(yīng)用的http監(jiān)控接口,將應(yīng)用程序的運(yùn)行相關(guān)監(jiān)控?cái)?shù)據(jù)暴露給外界,Prometheus可通過該接口獲取相應(yīng)的應(yīng)用運(yùn)行監(jiān)控?cái)?shù)據(jù).隨著Kubernetes容器云上的容器數(shù)量增多,Prometheus需要監(jiān)控的目標(biāo)對象越多.因此,Prometheus部署方式采用Deployment的方式部署在Kubernetes容器云上,可以保證Prometheus的POD隨著監(jiān)控目標(biāo)的數(shù)量增多,進(jìn)行相應(yīng)的彈性擴(kuò)容.Prometheus是一個(gè)實(shí)時(shí)的時(shí)間序列采集平臺,默認(rèn)只能存儲近期一段時(shí)間的數(shù)據(jù),可以通過為Prometheus掛載遠(yuǎn)端存儲如OpenTSDB來實(shí)現(xiàn)對監(jiān)控?cái)?shù)據(jù)的長期保存.
Kubernetes容器云監(jiān)控的前端可以采用開源可視化組件Grafana對接Prometheus的監(jiān)控?cái)?shù)據(jù)來實(shí)現(xiàn),具體思路如下:以Deployment的方式在容器云上部署開源可視化組件Grafana,安裝Grafana的Prometheus數(shù)據(jù)源插件,配置Prometheus數(shù)據(jù)源插件連接到Prometheus讀取采集到的監(jiān)控?cái)?shù)據(jù)[7].通過Grafana獲取到Prometheus的監(jiān)控?cái)?shù)據(jù)后,針對采集到的監(jiān)控?cái)?shù)據(jù),利用Grafana 豐富的內(nèi)置可視化組件和Prom QL定制開發(fā)相應(yīng)的Grafana 監(jiān)控?cái)?shù)據(jù)儀表盤.
Kubernetes容器云監(jiān)控的智能報(bào)警可采用Prometheus的Alertmanager告警管理組件來實(shí)現(xiàn),具體思路如下:采用Deployment的方式在Kubernetes容器云上部署Alertmanager,接受來自Prometheus的各種告警.通過配置Prometheus的rules規(guī)則文件來定義各種告警觸發(fā)規(guī)則,同時(shí)配置Alertmanger 的配置文件來定義各種信息媒介的推送方式[8].微信告警的推送方式可以先申請一個(gè)微信公眾號,并配置微信相關(guān)的Wechat_api連接信息和微信推送信息模板來實(shí)現(xiàn).由于Alertmanager默認(rèn)不支持釘釘告警,需要在容器云上先部署一個(gè)Prometheus-webhook-dingtalk的Depolyment,該Depolyment已經(jīng)默認(rèn)配置好了釘釘機(jī)器人信息推送接口url. 然后通過配置Alertmanager的webhook對接到Prometheus-webhook-dingtalk容器服務(wù)上,完成Alertmanager與釘釘機(jī)器人Webhook信息推送接口的對接.
通過上述基于Prometheus的 Kubernetes容器云監(jiān)控平臺思路的實(shí)踐,基本可實(shí)現(xiàn)高校數(shù)據(jù)中心容器云上的各種資源對象的可視化監(jiān)控和智能告警,解決高校數(shù)據(jù)中心容器云監(jiān)控的難題,提高了高校數(shù)據(jù)中心容器云的運(yùn)維監(jiān)控水平.
隨著微服務(wù)架構(gòu)在高校數(shù)據(jù)中心的逐漸落地,高校數(shù)據(jù)中心面臨著高效監(jiān)控微服務(wù)容器云的難題. Prometheus具備強(qiáng)大的云原生監(jiān)控功能,可對數(shù)據(jù)中心Kubernetes容器云的集群節(jié)點(diǎn)、內(nèi)部系統(tǒng)組件、容器和POD、應(yīng)用服務(wù)進(jìn)行監(jiān)控.利用可視化對接組件Grafana對接 Prometheus監(jiān)控?cái)?shù)據(jù)源,構(gòu)建Kubernetes容器云可視化監(jiān)控平臺,并通過Prometheus的Alertmanager告警管理組件進(jìn)行監(jiān)控平臺的智能告警,可以實(shí)現(xiàn)對高校數(shù)據(jù)中心容器云的各種資源對象的監(jiān)控和智能報(bào)警,解決高校數(shù)據(jù)中心容器云監(jiān)控的難題.