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

JFrog傑蛙科技發表於2020-03-02

一、背景

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 的基本架構如下圖所示:

其中:

·        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命令,都可以在 上獲得。該專案的README也詳細記錄的所有的操作步驟,供大家參考。(注:本文部署是基於Kubernetes 1.16.3版本的。)

 

1 、建立名稱空間

為管理需要,所有Prometheus元件都應執行在一個獨立的名稱空間當中。因此安裝的第一步,就是要建立一個新的Namespace,此處為“monitoring”。

 

2 、部署node-exporter

作為監控資料的來源,node-exporter用於提供*NIX核心的硬體以及系統指標,包括機器的loadavg、filesystem、meminfo等,類似於傳統的主機監控資料。node-exporter由Prometheus官方提供維護,不會捆綁安裝,但基本上是必備的exporter。

node-exporter 是以DaemonSet物件的方式進行部署的,可以確保每個Kubernetes Node的資料都會被採集到Prometheus。

注意,node-exporter開放了hostPort:9100,所以可以透過直接訪問<Node_IP>:9100來訪問node-exporter採集到的資料。如下圖所示: 

 

除DaemonSet外,還需要部署對應的Service,供Prometheus Server對接使用。需要注意的是,該Service只開放了Cluster內部埠,不能直接從外部訪問。

 

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:7

為了和Prometheus Server對接,也要部署對應的Service。和node-exporter一樣,這個Service也只開放了Cluster內部埠,不能直接從外部訪問。

 

4 、部署Prometheus Server

部署Prometheus Server之前,同樣首先要建立Service Account來提供許可權。同時,需要透過建立兩個ConfigMap來預先提供Prometheus Server的配置資料,和產生警報的門限和規則。Prometheus的各種配置可以到 檢視相關詳細定義。

之後,還需要建立一個Secret來設定Prometheus的預設使用者和密碼。

一切就緒之後,就可以部署Prometheus Server的Deployment了:

注意,在引數當中預先設定了AlertManager的對接方式。

最後,再建立Prometheus的Service:

該Service開放了NodePort,但沒有指定埠號,所以由Kubernetes自動分配。可以透過kubectl get service命令得到該埠,並透過<Node_IP>:<Node_Port>來訪問Prometheus原生的UI介面:

在該介面上,可以直接看到所有采集上來的監控資料,並透過各種內建的數學公式進行加工,並以圖形化的方式展示出來。

此外,根據設定的告警門限和規則,也會在UI上顯示各種告警資訊:

 

5 、部署Grafana

Prometheus 的原生UI,看起來還是有些基礎和單薄,所以在日常應用當中,通常都會再對接Grafana來進行資料展示。

部署Grafana也首先要透過建立ConfigMap來設定Dashboard的模版設定。Grafana的模版設定引數可以參考 。

模版引數設定好之後,就可以部署Grafana的Deployment和Service了:

Grafana 的Service也是開放了NodePort,但沒有指定埠號。可以透過Node_IP和自動分配的Port來訪問Grafana的介面:

還需要再執行一些指令碼來和Prometheus連線,即新增資料來源,並根據ConfigMap的設定來建立Dashboard。這些指令碼是透過建立一個Job物件來執行的。Job執行結束之後,就可以在Grafana上看到監控資料了: 

這個介面看起來就更為豐富和美觀了。

當然,為了更好地對外展示Grafana,還可以再建立一個Ingress來透過域名的方式對外開放:

 

6 、部署Alertmanager

之前Prometheus根據預設的門限和規則,已經從採集到的監控資料中產生了告警資訊,下一步就需要透過Alertmanager把告警資訊傳送出去。

首先,還是透過建立ConfigMap來設定Alermanager對接的資訊傳送路徑,和傳送的資訊格式模版。Alertmanager的配置可以參考 。 Alertmanager可以對接的傳送路徑很多,如郵件、PagerDuty、Slack、Webhook等。本文的例子中只提供了郵件方式的設定。

之後,再分別部署Alertmanager的Deployment和Service: 

Alertmanager 的Service也是沒有指定埠號的Node_Port,可以透過自動分配的埠訪問到Alertmanager的介面:

在Alertmanager的介面上,可以看到即時接收到的告警資訊。

根據傳送路徑的設定,可以在郵箱中收到相應的告警郵件:

 

至此,我們在Kubernetes的環境中快速部署了Prometheus的系統,並採集了Node和Kubernetes元件的各種狀態資料,可以透過Grafana進行展示;系統產生的告警資訊也可以透過Alertmanager設定的方式,以郵件的方式傳送出來。

五、總結

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

本文部署過程所涉及的所有Kuberntes物件的yaml檔案、kubectl命令,都可以在 上獲得。該專案的README也詳細記錄的所有的操作步驟,供大家參考。(注:本文部署是基於Kubernetes 1.16.3版本的。)

此外,本文中各種部署物件是基於Docker image的,因此過程中也需要本地Docker映象中心的支援,保證部署過程的穩定、快速和可重複。本文在部署過程中採用了JFrog的JCR(JFrog Container Registry),只是一款免費的、功能強大的Docker映象中心。具體資訊請參見: 。大家可以透過 來下載免費使用。

 

更多精彩內容請微信搜尋公眾號:  jfrogchina

更多技術分享可以關注 3   3   日線上課堂:《傑蛙讀書《鳳凰專案》,一小時帶你入門DevOps及敏捷轉型》

 

課程介紹

透過本次課程,透過 DevOps 神書《鳳凰專案,一個 IT 運維的傳奇故事》中的一些故事點,明確 DevOps 建設中遇到的坑,以及透過這些坑孵化出的解決方法,瞭解一個 IT 運維如何幫助公司實現鳳凰涅槃。本次課程比較輕鬆,聽眾可以按照聽故事的方式,瞭解一個傳統企業轉型 DevOps 的一些趣事。  

  

課程大綱

1. 《鳳凰專案》故事主線梳理

2. 歸納故事中遇到的問題及處理方式

3. 總結DevOps轉型技術點及文化落地方案

 

課堂活動

本期課堂講師會在結束前進行抽獎活動

第一名:小愛音響

第二名: JFrog  新版

 

報名連結:  


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69954434/viewspace-2678108/,如需轉載,請註明出處,否則將追究法律責任。

相關文章