前言
本篇文章介紹 k8s叢集中部署 prometheus、grafana、alertmanager,并且配置 prometheus 的動态、靜态服務發現,實作對容器、實體節點、service、pod 等資源名額監控,并在Grafana 的 web界面展示 prometheus 的監控名額,然後通過配置自定義告警規則,通過 alertmanager 實作 qq、釘釘、微信報警。
Prometheus 監控工具介紹
Prometheus是一個最初在SoundCloud上建構的開源系統監視和警報工具包。
自2012年成立以來,許多公司群組織都采用了Prometheus,該項目擁有一個非常活躍的開發人員和使用者社群。它現在是一個獨立的開源項目,可以獨立于任何公司進行維護。為了強調這一點,并澄清項目的治理結構,Prometheus 于2016年加入 雲計算本地計算基金會,作為繼Kubernetes之後的第二個托管項目。
https://prometheus.io
https://github.com/prometheus
特征
Prometheus的主要特點是:
- 多元資料模型:由度量名稱和鍵值對辨別的時間序列資料
- 支援多種exporter采集資料
- PromQL:一種靈活的查詢語言,可以利用多元資料完成複雜的查詢
- 不依賴分布式存儲,單個伺服器節點可直接工作(不需要安裝資料庫,直接使用即可,内置內建了資料庫不需要重新的部署)
- 基于HTTP的pull方式采集時間序列資料
- 推送時間序列資料通過PushGateway元件支援,目标主機上報資料到PushGateway,普羅米修斯從PushGateway拉取資料,這個是可以跨網段的。
- 通過服務發現或靜态配置發現目标
- 多種圖形模式及儀表盤支援(grafana)
- 高效的存儲,每個采集資料占用3.5bytes左右,300萬的時間序列,30s的時間間隔,保留60天,消耗磁盤大約200G
- 做高可用,對資料進行異地備份。聯邦叢集,部署多套普羅米修斯,每套普羅米修斯可以在不同的機房,然後将這些普羅米修斯彙總到一個普羅米修斯,那麼就可以将各個地方的資料,整體收集上來了。
Prometheus元件與架構
Prometheus 監控工具架構圖
Prometheus生态系統由多個元件組成,其中許多元件是可選的:
- 主要的Prometheus server,用于存儲時間序列資料。
- 用于檢測應用程式代碼的用戶端庫。
- 用于支援short-lived工作的推送網關(push gateway)。
- 針對HAProxy,StatsD,Graphite等服務的exporters。
- 一個alertmanager處理警報管理器。
- 各種支援工具
大多數Prometheus元件都是用Go編寫的,是以很容易建構和部署為靜态二進制檔案。
具體元件的作用:
• Prometheus Server:收集名額和存儲時間序列資料,并提供查詢接口(采集,存儲,查詢)
• ClientLibrary:用戶端庫
• Push Gateway:短期存儲名額資料。主要用于臨時性的任務,各個目标主機可以上報資料到pushgateway,,然後prometheus server統一從pushgateway拉取資料
• Exporters:采集已有的第三方服務監控名額并暴露metrics(類似于zabbix agent,但是exporter有很多種,針對不同的監控名額)
• Alertmanager:從prometheus server端收到alters之後,會進行去重,分組,并且路由到接收方,發出報警,常見的接收方式有:電子郵件,微信,釘釘
• Web UI:簡單的Web控制台
普羅米修斯服務端是内置了TSDB的資料庫,是存儲在本地的檔案系統當中。存儲了采集被監控端資料名額。
擷取名額有兩種方式:
- 一種直接是從pushgateway這裡擷取被監控名額,這是一個獨立的元件,主要完成短周期任務暴露的名額,比如定時任務。(短周期任務不是每分鐘都有的名額,可能在運作任務的時候才會産生名額。是以可以将臨時的名額彙總到pushgateway,然後有pushgateway統一的暴露給服務端去采集)
- 另外一種就是主要使用的,持久性的應用,比如nginx,mysql還要微服務jar包,這些都屬于持久性運作任務的。
使用這種任務的監控就是采用exporter方式了。會配置exporter這樣一個元件,主要是用來采集名額暴露給服務端。
Prometheus 根據配置的作業,直接從資料源pull拉取或者通過中間推送網關(push gateway),擷取路徑成本Metrics。它在本地存儲所有擷取的樣本,并在此資料上運作規則,以從現有資料聚合和記錄新的時間序列,或者生成警報。Grafana或其他API使用者可用于可視化收集的資料。
服務端采集好之後就會存儲在tsdb資料庫當中,可以通過其ui去檢視,因為其通過了http服務就可以通路其ui了。在ui上可以通過promql完成資料的查詢。(export--->prometheus(TSDB)---->promsql)
告警是由altermanager提供的,在普羅米修斯這裡定義告警規則,普羅米修斯這裡會周期的評估目前采集的名額是否觸發了告警規則,如果觸發了會将事件推送給altermanger。altermanger會根據自己相關的邏輯處理後發給接收人,提供email webhook,是以告警是由單獨的元件完成的。(告警規則在普羅米修斯裡面定義,觸發了告警推送給altermanager)
普羅米修斯實作了服務的發現,也就是可以自動的找到被監控端,這個需要在普羅米修斯的配置檔案裡面去配置。有了服務發現就不要一個一個的去配置了,讓被監控端自動納入監控。
普羅米修斯從目标主機拉取資料的時候有兩種方式,一種是靜态的,也就是我們部署exporter,靜态的采集名額,也可以配置服務發現,自動的發現名額資料。通過服務發現和exporter采集到的資料的方式都是采用了預設的pull方式拉取名額的,也可以使用pushgateway上報到prometheus當中,通過在目标主機上面寫腳本的方式。
監控名額資料模型
資料模型:
• Prometheus将所有資料存儲為時間序列(存儲的時候都會記錄時間,并且存儲到時序的資料庫裡面,也就是内置的TSDB)
• 具有相同度量名稱以及标簽屬于同一個名額(名額名稱是一樣,但是标簽是不一樣的)
• 每個時間序列都由度量标準名稱和一組鍵值對(稱為标簽)唯一辨別,
通過标簽查詢指定名額。
名額格式 名額名稱加上多個标簽
<metric name>{<label name>=<label value>,...}
再配置被監控端這裡要配置監控誰,在配置被監控端,必須要暴露名額出來,這種名額以https的方式給暴露出來,暴露出來之後在配置檔案當中配置被監控端,最後就會被普羅米修斯給采集到,如果以上正确配置
在普羅米修斯的圖形界面targets可以看到被監控端,也可以通過名額名稱檢視采集的資料了。
這個就相當于資料庫,可以提供promql來查詢資料,并且通過圖表繪制出來
Prometheus 部署
• 二進制部署
https://prometheus.io/docs/prometheus/latest/getting_started/ 下載下傳位址
• Docker部署
https://prometheus.io/docs/prometheus/latest/installation/
通路位址:http://IP:9090
[root@localhost ~]# ls
anaconda-ks.cfg prometheus-2.23.0.linux-amd64.tar.gz
[root@localhost ~]# mv prometheus-2.23.0.linux-amd64 /usr/local/prometheus
[root@localhost ~]# cd /usr/local/prometheus/
[root@localhost prometheus]# ls
console_libraries consoles LICENSE NOTICE prometheus prometheus.yml promtool
prometheus 主程式
promtool 檢查普羅米修斯的工具,主要是用于檢查普羅米修斯配置檔案的文法
Prometheus啟動
./premetheus -h 指令行常用參數:
• --config.file="prometheus.yml" # 指定配置檔案
• --web.listen-address= "0.0.0.0:9090" # 監聽位址和端口
• --log.level=info # 日志級别
• --alertmanager.timeout=10s # 與報警元件的逾時時間
• --storage.tsdb.path="data/ " # 資料目錄
• --storage.tsdb.retention.time=15d # 資料儲存時間,預設15天(到時候會在普羅米修斯目錄下生成data目錄用來儲存資料,資料存儲時間是15天,會定期的删除,也可以自己設定儲存一個月)
直接啟動,檢視監聽端口
[root@localhost prometheus]# ./prometheus
可以看到監聽的端口是9090
[root@localhost ~]# netstat -tpln | grep pr
tcp6 0 0 :::9090 :::* LISTEN 26554/./prometheus
浏覽器上通路你的主機IP加端口即可
Alters 如果你在這配置了告警,那麼這裡會顯示告警資訊
Graph 根據普羅米修斯的查詢語言會給你繪制一個圖,這裡主要是用于編寫promq表達式相關的調試
Status 檢視運作狀态。在status裡面的tragets裡面是普羅米修斯監控的目标,預設把自己也監控了,service discovery服務發現可以加入被監控端。這裡也可以看到告警規則,Configuration 檢視普羅米修斯的配置檔案内容
[root@localhost ~]# cd /usr/local/prometheus/
[root@localhost prometheus]# ls
console_libraries consoles data LICENSE NOTICE prometheus prometheus.yml promtool
[root@localhost prometheus]# cd data/
[root@localhost data]# ls
01ETPMX68HCBK9BN6DA4KPNPNK chunks_head lock queries.active wal
使用系統的服務systemd管理來管理普羅米修斯
[root@localhost prometheus]# cat /usr/lib/systemd/system/prometheus.service
[Unit]
Description=prometheus #描述普羅米修斯,可以寫任意内容
[Service] #啟動普羅米修斯具體路徑,如果需要什麼參數都可以在後面加上
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
[root@localhost prometheus]# systemctl daemon-reload
[root@localhost prometheus]# systemctl start prometheus
[root@localhost prometheus]# systemctl enable prometheus
[root@localhost ~]# ps -ef | grep prome
root 63071 1 0 10:08 ? 00:00:12 /usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml
root 63472 62981 0 10:39 pts/0 00:00:00 grep --color=auto prome
[root@localhost ~]# kill -HUP 63071