Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

一、背景

Kubernetes是目前最爲流行、成爲事實標準的容器集羣管理平臺,爲容器化應用提供了集羣化部署運行、自動資源調度,和動態水平伸縮等一系列完整功能。雖然Kubernetes平臺本身已經實現了應用狀態的實時監控,但是監控的指標和方式還是比較基礎,難以滿足各種複雜和個性化的監控管理需求。因此,我們需要在Kubernetes的基礎上,增加獨立的、不影響現有應用集羣的架構和部署的,而且功能全面、易於部署、便於監視分析、能夠及時告警的監控體系。
在當前應用與Kubernetes的監控體系當中,Prometheus得到了更爲廣泛的關注和應用。本文就結合JFrog在Kubernetes落地實踐當中的積累,介紹如何在Kubernetes環境中快速部署Prometheus系統,實現對Kubernetes環境狀態的實時監視和告警。

二、Prometheus簡介

Prometheus是一套開源的系統監控報警框架。和Kubernetes類似,它也發源於Google的Borg體系,其原型爲Borgmon,是一個幾乎與Borg同時誕生的內部監控系統,由工作在SoundCloud的Google前員工在 2012年創建。之後作爲社區開源項目進行開發,並於2015年正式發佈。2016年,Prometheus正式加入CNCF(Cloud Native Computing Foundation),是僅次於Kubernetes的第二個項目,目前已經全面接管了 Kubernetes項目的整套監控體系。
Prometheus的監控是基於時序數據的,即通過採樣數據(metrics),不斷獲取監控目標的狀態信息,即時地記錄與展示,並根據設定的門限和方式及時發佈告警。
作爲應用與Kubernetes的監控體系,Prometheus具備諸多的優勢,如:
• Kubernetes默認支持,非常適合容器和微服務
• 無依賴,安裝方便,上手容易
• 社區活躍,它不僅僅是個工具,而是生態
• 已有很多插件或者exporter,可以適應多種應用場景的數據收集需要
• Grafana默認支持,提供良好的可視化
• 高效,單一Prometheus可以處理百萬級的監控指標,每秒處理數十萬的數據點
而當前Prometheus最大的缺點就是暫時還不支持集羣化。當然,在社區的支持和推動下,可以預期在不久的將來,Prometheus也將會推出完善的集羣化方案。
Prometheus的基本架構如下圖所示:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

其中:
• Prometheus Server:是Prometheus架構中的核心部分,負責實現對監控數據的獲取、存儲及查詢。Prometheus Server可以通過靜態配置管理監控目標,也可以配合使用Service Discovery的方式動態管理監控目標,並從這些監控目標中獲取數據。其次Prometheus Server本身也是一個時序數據庫,將採集到的監控數據按照時間序列的方式存儲在本地磁盤當中。Prometheus Server對外提供了自定義的PromQL,實現對數據的查詢以及分析。
• Exporter:是提供監控數據的來源。Exporter分爲兩類:一類Exporter直接內置了對Prometheus監控的支持,如Kubernetes、etcd等;另一類是因爲原有監控目標並不直接支持Prometheus,需要通過Prometheus提供的Client Library編寫該監控目標的監控採集程序,如Mysql、JMX等。對於Exporter,Prometheus Server採用pull的方式來採集數據。
• PushGateway:同樣是監控數據的來源。對於由於特定原因,如網絡環境不允許等,Prometheus Server不能直接與Exporter進行通信時,可以使用PushGateway來進行中轉。內部網絡的監控數據主動Push到Gateway中,而和對Exporter一樣,Prometheus Server也利用pull的方式從PushGateway採集數據。
• Alertmanager:是Prometheus體系中的告警組件。在Prometheus Server中可以設定門限與警報規則。當採集到的數據滿足相關規則後,就會產生一條告警。Alertmanager從 Prometheus Server接收到告警後,會根據事先設定的路徑,向外發出告警。常見的告警發送路徑有:電子郵件、PagerDuty、Webhook、Slack等。
• 數據展示與輸出:Prometheus Server有內置的UI用於展示採集到的監控數據。在該UI上,可以通過各種內置的數學公式對原始數據進行加工,並通過圖形化的方式展現出來。當然,Prometheus Server原生UI的展示方式還是比較基礎和單薄,所以目前更多的是通過對接Grafana來進行數據的展示,可以得到更好的展示效果。此外,Prometheus Server也提供API的方式來實現對監控數據的訪問。
本文就將參照上述架構,介紹如何在Kubernetes環境中,快速地部署和配置Prometheus的監控體系。

三、Prometheus的安裝實錄

本節將基於JFrog在Kubernetes落地實踐當中的積累,一步一步地介紹如何在Kubernetes環境中,從零開始搭建Prometheus系統,並實現監控數據的收集、展示與告警。本節所涉及的所有Kuberntes對象的yaml文件、kubectl命令,都可以在https://github.com/xingao0803/Prometheus上獲得。該項目的README也詳細記錄的所有的操作步驟,供大家參考。(注:本文部署是基於Kubernetes 1.16.3版本的。)

1、創建命名空間

爲管理需要,所有Prometheus組件都應運行在一個獨立的命名空間當中。因此安裝的第一步,就是要創建一個新的Namespace,此處爲“monitoring”。
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

2、部署node-exporter
作爲監控數據的來源,node-exporter用於提供*NIX內核的硬件以及系統指標,包括機器的loadavg、filesystem、meminfo等,類似於傳統的主機監控數據。node-exporter由Prometheus官方提供維護,不會捆綁安裝,但基本上是必備的exporter。
node-exporter是以DaemonSet對象的方式進行部署的,可以確保每個Kubernetes Node的數據都會被採集到Prometheus。
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

注意,node-exporter開放了hostPort:9100,所以可以通過直接訪問<Node_IP>:9100來訪問node-exporter採集到的數據。如下圖所示:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

除DaemonSet外,還需要部署對應的Service,供Prometheus Server對接使用。需要注意的是,該Service只開放了Cluster內部端口,不能直接從外部訪問。
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

3、部署kube-state-metrics
除了node-exporter,還可以部署另一個數據來源,kube-state-metrics。kube-state-metrics關注於獲取kubernetes各種資源的最新狀態,如deployment或者daemonset等。kube-state-metrics輪詢Kubernetes API,並將Kubernetes的結構化信息轉換爲metrics,將kubernetes的運行狀況在內存中做個快照。
因爲kube-state-metrics要訪問API,所以要先創建ServiceAccount來提供權限。之後再部署相應的Deployment:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

爲了和Prometheus Server對接,也要部署對應的Service。和node-exporter一樣,這個Service也只開放了Cluster內部端口,不能直接從外部訪問。
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

4、部署Prometheus Server
部署Prometheus Server之前,同樣首先要創建Service Account來提供權限。同時,需要通過創建兩個ConfigMap來預先提供Prometheus Server的配置數據,和產生警報的門限和規則。Prometheus的各種配置可以到https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config查看相關詳細定義。
之後,還需要創建一個Secret來設置Prometheus的缺省用戶和密碼。
一切就緒之後,就可以部署Prometheus Server的Deployment了:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

注意,在參數當中預先設置了AlertManager的對接方式。
最後,再創建Prometheus的Service:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

該Service開放了NodePort,但沒有指定端口號,所以由Kubernetes自動分配。可以通過kubectl get service命令得到該端口,並通過<Node_IP>:<Node_Port>來訪問Prometheus原生的UI界面:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

在該界面上,可以直接看到所有采集上來的監控數據,並通過各種內置的數學公式進行加工,並以圖形化的方式展示出來。
此外,根據設置的告警門限和規則,也會在UI上顯示各種告警信息:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

5、部署Grafana
Prometheus的原生UI,看起來還是有些基礎和單薄,所以在日常應用當中,通常都會再對接Grafana來進行數據展示。
部署Grafana也首先要通過創建ConfigMap來設置Dashboard的模版設置。Grafana的模版設置參數可以參考https://grafana.com/grafana/dashboards。
模版參數設置好之後,就可以部署Grafana的Deployment和Service了:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

Grafana的Service也是開放了NodePort,但沒有指定端口號。可以通過Node_IP和自動分配的Port來訪問Grafana的界面:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

還需要再運行一些腳本來和Prometheus連接,即添加數據源,並根據ConfigMap的設置來創建Dashboard。這些腳本是通過創建一個Job對象來運行的。Job運行結束之後,就可以在Grafana上看到監控數據了:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

這個界面看起來就更爲豐富和美觀了。
當然,爲了更好地對外展示Grafana,還可以再創建一個Ingress來通過域名的方式對外開放:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

6、部署Alertmanager
之前Prometheus根據預設的門限和規則,已經從採集到的監控數據中產生了告警信息,下一步就需要通過Alertmanager把告警信息發送出去。
首先,還是通過創建ConfigMap來設置Alermanager對接的信息發送路徑,和發送的信息格式模版。Alertmanager的配置可以參考https://prometheus.io/docs/alerting/configuration/。 Alertmanager可以對接的發送路徑很多,如郵件、PagerDuty、Slack、Webhook等。本文的例子中只提供了郵件方式的設置。
之後,再分別部署Alertmanager的Deployment和Service:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

Alertmanager的Service也是沒有指定端口號的Node_Port,可以通過自動分配的端口訪問到Alertmanager的界面:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

在Alertmanager的界面上,可以看到即時接收到的告警信息。
根據發送路徑的設置,可以在郵箱中收到相應的告警郵件:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

至此,我們在Kubernetes的環境中快速部署了Prometheus的系統,並採集了Node和Kubernetes組件的各種狀態數據,可以通過Grafana進行展示;系統產生的告警信息也可以通過Alertmanager設置的方式,以郵件的方式發送出來。

五、總結

Prometheus是Kubernetes體系中應用最爲廣泛的時序數據的監控系統。本文詳細描述瞭如何從零開始,快速在Kubernetes環境中部署Prometheus系統,並實現監控數據的採集、展示,以及告警的全過程。本文安裝的Prometheus系統架構如下圖所示:
Kubernetes上的“火眼金睛”——Prometheus的安裝實錄

本文部署過程所涉及的所有Kuberntes對象的yaml文件、kubectl命令,都可以在https://github.com/xingao0803/Prometheus上獲得。該項目的README也詳細記錄的所有的操作步驟,供大家參考。(注:本文部署是基於Kubernetes 1.16.3版本的。)
此外,本文中各種部署對象是基於Docker image的,因此過程中也需要本地Docker鏡像中心的支持,保證部署過程的穩定、快速和可重複。本文在部署過程中採用了JFrog的JCR(JFrog Container Registry),只是一款免費的、功能強大的Docker鏡像中心。具體信息請參見:https://www.jfrog.com/confluence/display/JCR/Overview。大家可以通過https://www.jfrog.com/confluence/display/JCR/Overview來下載免費使用

更多精彩內容請微信搜索公衆號: jfrogchina
更多技術分享可以關注3 月5 日在線課堂:《DevOps 實戰之持續測試&安全掃描》

課程收益
1.瞭解持續測試的體系建設
2.瞭解各個階段常見自動化測試工具
3.瞭解DevSecOps 第三方依賴引入安全監管機制

本期話題

1.持續測試介紹
2.使用代碼掃描提高代碼質量
3.API接口自動化測試管理
4.UI自動化測試工具及管理
5.DevSecOps 持續安全監管

課堂活動
本期課堂講師會在結束前進行抽獎活動
第一名:小米藍牙耳機
第二名:JFrog 新版T 恤

報名鏈接: https://www.bagevent.com/event/6393824

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章