Docker系列——Grafana+Prometheus+Node-exporter伺服器監控平台(一)
在最近的博文中,都是介紹監控平台的搭建,其實並不難,主要是需要自己動手操作,實踐一番就會了。
有天在想,雲上的伺服器,是不是也可以搭建一個監控平台,所以就搗鼓了一下,不過遺憾的是,使用阿里雲開源的插件-CMS Grafana Service沒能成功,嘗試了許久都沒能成功。
所以就改用Prometheus了,一步步實踐,配置成功,小有收穫吧,來分享下每天點滴。
Node-exporter
Node-exporter簡介
在配置環境前,可能會有疑問,為什麼需要?所以就先來講下其作用。
在Prometheus的架構設計中,Prometheus Server並不直接服務監控特定的目標,其主要任務負責數據的收集,存儲並且對外提供數據查詢支援。因此為了能夠監控到某些東西,如主機的CPU使用率,我們需要使用到Exporter。Prometheus周期性的從Exporter暴露的HTTP服務地址(通常是/metrics)拉取監控樣本數據。
Node-exporter 與之前博文中的 Jmeter 是一個作用,就是用於機器系統數據收集。我們在展示數據時,數據肯定是有來源的,監控系統,監控的數據有:CPU、記憶體、磁碟、I/O等資訊。所以就需要部署Node-exporter,我們一起來看下部署過程。
環境部署
拉取鏡像
使用命令 docker pull prom/node-exporter 拉取鏡像,操作如下所示:

啟動服務
使用命令如下命令啟動即可:
docker run -d -p 9100:9100 \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
--net="host" \
prom/node-exporter

我們可以查看埠,是否有啟動成功,命令 netstat -anpt

或者使用命令 docker ps -a 查看容器是否啟用成功
確認啟動成功之後,可以通過url訪問查看,伺服器ip+9100;這裡需要注意的是,伺服器埠有安全策略,需要手動開啟,開啟後才能正常訪問,如下所示:

我們可以查看到具體的監聽資訊,如下所示:

Prometheus
Prometheus簡介
Prometheus(普羅米修斯)是一套開源的監控&報警&時間序列資料庫的組合,起始是由SoundCloud公司開發的。隨著發展,越來越多公司和組織接受採用Prometheus,社會也十分活躍,他們便將它獨立成開源項目,並且有公司來運作。Google SRE的書內也曾提到跟他們BorgMon監控系統相似的實現是Prometheus。現在最常見的Kubernetes容器管理系統中,通常會搭配Prometheus進行監控。
Prometheus基本原理是通過HTTP協議周期性抓取被監控組件的狀態,這樣做的好處是任意組件只要提供HTTP介面就可以接入監控系統,不需要任何SDK或者其他的集成過程。這樣做非常適合虛擬化環境比如VM或者Docker 。
Prometheus應該是為數不多的適合Docker、Mesos、Kubernetes環境的監控系統之一。
輸出被監控組件資訊的HTTP介面被叫做exporter 。目前互聯網公司常用的組件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux 系統資訊 (包括磁碟、記憶體、CPU、網路等等)。
與其他監控系統相比,Prometheus的主要特點是:
- 易於管理
- 監控服務的內部運行狀態
- 強大的數據模型
- 強大的查詢語言PromQL
- 高效
- 可擴展
- 易於集成
- 可視化
- 開放性
Prometheus架構
架構圖如下所示:

從架構圖中,可以看出有幾大核心組件,一起來看下。
Prometheus Server
Prometheus Server是Prometheus組件中的核心部分,負責實現對監控數據的獲取,存儲以及查詢。 Prometheus Server可以通過靜態配置管理監控目標,也可以配合使用Service Discovery的方式動態管理監控目標,並從這些監控目標中獲取數據。其次Prometheus Server需要對採集到的監控數據進行存儲,Prometheus Server本身就是一個時序資料庫,將採集到的監控數據按照時間序列的方式存儲在本地磁碟當中。最後Prometheus Server對外提供了自定義的PromQL語言,實現對數據的查詢以及分析。
Prometheus Server內置的Express Browser UI,通過這個UI可以直接通過PromQL實現數據的查詢以及可視化。
Prometheus Server的聯邦集群能力可以使其從其他的Prometheus Server實例中獲取數據,因此在大規模監控的情況下,可以通過聯邦集群以及功能分區的方式對Prometheus Server進行擴展。
Exporters
Exporter將監控數據採集的端點通過HTTP服務的形式暴露給Prometheus Server,Prometheus Server通過訪問該Exporter提供的Endpoint端點,即可獲取到需要採集的監控數據。
一般來說可以將Exporter分為2類:
- 直接採集:這一類Exporter直接內置了對Prometheus監控的支援,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接內置了用於向Prometheus暴露監控數據的端點。
- 間接採集:間接採集,原有監控目標並不直接支援Prometheus,因此我們需要通過Prometheus提供的Client Library編寫該監控目標的監控採集程式。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。
AlertManager
在Prometheus Server中支援基於PromQL創建告警規則,如果滿足PromQL定義的規則,則會產生一條告警,而告警的後續處理流程則由AlertManager進行管理。在AlertManager中我們可以與郵件,Slack等等內置的通知方式進行集成,也可以通過Webhook自定義告警處理方式。AlertManager即Prometheus體系中的告警處理中心。
PushGateway
由於Prometheus數據採集基於Pull模型進行設計,因此在網路環境的配置上必須要讓Prometheus Server能夠直接與Exporter進行通訊。 當這種網路需求無法直接滿足時,就可以利用PushGateway來進行中轉。可以通過PushGateway將內部網路的監控數據主動Push到Gateway當中。而Prometheus Server則可以採用同樣Pull的方式從PushGateway中獲取到監控數據。
環境部署
拉取鏡像
使用命令 docker pull prom/prometheus ,操作如下:

• 添加配置文件
使用命令 mkdir -p /opt/prometheus && cd /opt/prometheus 新建文件夾,並進入到該目錄下。新建配置文件的操作命令 vim prometheus.yml ,添加如下內容:
global:
scrape_interval: 60s
evaluation_interval: 60s
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['自己ip:9090']
labels:
instance: prometheus
- job_name: linux
static_configs:
- targets: ['自己ip:9100']
labels:
instance: ip
• 啟動服務
使用如下命令,將配置文件掛載到容器中:
docker run -d \
-p 9090:9090 \
-v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
啟動後,可以檢查是否啟動成功,查看埠或者查看容器運行情況,查看埠如下:

我們可以通過web頁面查看,服務運行狀態,訪問地址:伺服器ip+埠/targets,如下所示:

Grafana配置
在之前的博文中,已經詳細介紹過Grafana了,所以這裡就不細說了,詳細可以看之前的博文,Docker系列——InfluxDB+Grafana+Jmeter性能監控平台搭建(三)
添加數據源
在使用過程中,稍有區別就是需要添加新的數據源,因為我們現在使用的是 Prometheus ,操作如下:
訪問grafana://ip:3000/login ,添加即可,操作如下:

在這裡可以配置數據源名稱,配置數據源的地址,地址填啟動的prometheus地址即可。
引用模板
接下來就是添加模板,模板直接按id導入: 8919 ,可以配置監控面板的名稱和引用源,添加即可。引用模板就是讓數據展示的更美觀。其他面板,也可以在Grafana官網去搜索,裡面還有其他的模板數據。

數據展示
配置完成後,查看面板數據如下:



我們從圖中看出,監控面板的數據很齊全,各種指標都有展示,還是挺不錯的。監控伺服器就完成了,操作簡單吧,有資源的,可以手動操作一下,很容易上手的哦。

