Docker監控之Prometheus

1、Prometheus簡介

Prometheus(普羅米修斯),是一套開源的系統監控報警框架。它以給定的時間間隔從已配置的目標收集指標,評估規則表達式,顯示結果,並在發現某些狀況爲真時觸發警報。
做爲新一代的監控框架,Prometheus 具備如下特色:html

* 多維數據模型:由度量名稱和鍵值對標識的時間序列數據
* PromSQL:一種靈活的查詢語言,能夠利用多維數據完成複雜的查詢
* 不依賴分佈式存儲,單個服務器節點可直接工做
* 基於HTTP的pull方式採集時間序列數據
* 推送時間序列數據經過PushGateway組件支持
* 經過服務發現或靜態配置發現目標
* 多種圖形模式及儀表盤支持(grafana)
* 適用於以機器爲中心的監控以及高度動態面向服務架構的監控
* 高效:單一Prometheus能夠處理數以百萬的監控指標;每秒處理數十萬的數據點。
* 易於伸縮:經過使用功能分區(sharing)+聯邦集羣(federation)能夠對Prometheus進行擴展,造成一個
邏輯集羣;Prometheus提供多種語言的客戶端SDK,這些SDK能夠快速讓應用程序歸入到Prometheus的監控當中。
* 良好的可視化:Prometheus除了自帶有Prometheus UI,Prometheus還提供了一個獨立的基於Ruby On Rails的Dashboard解決方案Promdash。
 另外最新的Grafana可視化工具也提供了完整的Proetheus支持,基於Prometheus提供的API還能夠實現本身的監控可視化UI。

Prometheus架構圖

Docker監控之Prometheus
大體的工做流程是:node

* Prometheus server 按期從配置好的 jobs 或者 exporters 中拉 metrics,或者接收來自 Pushgateway 發過來的 metrics,
或者從其餘的 Prometheus server 中拉 metrics;
* Prometheus server 在本地存儲收集到的 metrics,並運行已定義好的 alert.rules,記錄新的時間序列或者向 Alertmanager 推送警報;
* Alertmanager 根據配置文件,對接收到的警報進行處理,發出告警;
* 在圖形界面中,可視化採集數據;

2、環境準備

主機名稱 IP地址 安裝組件
docker01 192.168.45.129 NodeEXporter、cAdvisor、Prometheus Server、Grafana
docker02 192.168.45.141 NodeEXporter、cAdvisor
docker03 192.168.45.142 NodeEXporter、cAdvisor

注:部署該服務,包括四個組件:Prometheus Server、Node Exporter、cAdvrisor、Grafana其做用以下:linux

* Prometheus Server: 普羅米修斯的主服務器。(端口:9090)
* NodeEXporter: 負責收集Host硬件信息和操做系統信息。(端口:9100)
* cAdvisor: 負責收集Host上運行的容器信息。(端口:8080)
* Grafana:負責展現普羅米修斯監控界面。(端口:3000)
* Alertmanager:用來接收Prometheus發送的報警信息,而且執行設置好的報警方式,報警內容(一樣也是在dockerA主機上部署,端口:9093);

各組件的關係:NodeEXporter、cAdvisor負責收集信息發送給 Prometheus server,在由 Prometheus server交給Grafana進行圖形化的顯示。如需報警,則由prometheus向Alertmanager組件發送信息!web

實驗環境,所有關閉防火牆,禁用selinuxdocker

1)部署Node-EXporter收集硬件和系統信息
注:三臺dockerhost主機,所有部署Node-EXporter和cAdvisor。vim

[root@docker01 ~]# docker run -d --name node -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
//部署node-EXporter,負責收集硬件和系統信息。
//使用prom/node-exporter 鏡像建立一個名爲node的容器,用於收集硬件和系統信息;
//--net=host表示Prometheus server能夠直接與node-exporter通訊;
//並映射9100端口

驗證:打開瀏覽器驗證結果
Docker監控之Prometheus
Docker監控之Prometheus
注:出現這個結果表示Node-Exporter組件安裝成功,注意:另外兩臺dockerhost主機也需安裝Node-Exporter組件組件操做徹底同樣,安裝完成後請自行打開瀏覽器驗證。瀏覽器

2)部署cAdvisor,收集節點容器信息服務器

[root@docker01 ~]# docker run -v /:/rootfs:ro -v /var/run:/var/run/:rw -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro -p 8080:8080 --detach=true --name=cadvisor --net=host google/cadvisor

驗證:打開瀏覽器驗證結果
Docker監控之Prometheus
注:出現這個結果表示cAdvisor組件安裝成功,注意:另外兩臺dockerhost主機也需安裝cAdvisor組件操做徹底同樣,安裝完成後請自行打開瀏覽器驗證。微信

3)、在docker01上部署Prometheus Server服務
在部署prometheus以前,咱們須要對它的配置文件進行修改,因此咱們先運行一個容器,先將其配置文件拷貝出來。架構

[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
[root@docker01 ~]# docker cp prometheus:/etc/prometheus/prometheus.yml ./
[root@docker01 ~]# vim prometheus.yml
   - targets: ['localhost:9090','localhost:8080','localhost:9100','192.168.45.141:8080','192.168.45.141:9100','192.168.45.142:8080','192.168.45.142:9100']
 //用於指定監控本機的9090、8080、9100這三個端口,另外添加另外兩臺docker主機的8080、9100這兩個端口。
 //8080端口運行的是cAdvisor服務
 //9100端口運行的是node-exporter服務
 //9090端口運行的就是Prometheus服務

Docker監控之Prometheus
注:這裏指定了prometheus的監控項,包括它也會監控本身本地主機的數據

[root@docker01 ~]# docker rm prometheus -f    //將剛纔運行的容器刪除
prometheus
[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
//從新運行一個prometheus容器,將剛纔修改完成的配置文件掛載到容器中

驗證:打開瀏覽器驗證結果
Docker監控之Prometheus
Docker監控之Prometheus
3)在docker01上,部署grafana服務,用來展現prometheus收集到的數據

[root@docker01 ~]# mkdir grafana-storage
[root@docker01 ~]# chmod 777 -R grafana-storage/
[root@docker01 ~]# docker run -d -p 3000:3000 --name grafana -v /root/grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123.com" grafana/grafana

驗證:打開瀏覽器驗證結果
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus

Docker監控之Prometheus
上述配置完成後,咱們就須要配置它以什麼樣的形式來給咱們展現了,能夠自定義,可是很麻煩,我選擇直接去grafana官網尋找現成的模板。如圖:
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus
注:這裏多是這個模塊用不了,能夠去grafana官網多找點別的圖形模板,以上是第一種下載模板方式,接下來演示第二種下載模板方式。
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus
至此web界面的監控就部署完成了!
3)、配置Peometheus監控實現報警
Prometheus的報警方式有好幾種,好比:郵箱、微信、釘釘等,本次案例採用郵箱告警的方式。接下來,咱們須要啓動 AlertManager 來接受 Prometheus 發送過來的報警信息,並執行各類方式的告警。一樣以 Docker 方式啓動AlertManager,最簡單的啓動命令以下:
(1)、運行alertmanager容器只需在docker01上操做便可以下:

[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 prom/alertmanager
//隨便運行一個容器,其目的就是將容器中服務的配置文件拿到本地
[root@docker01 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml .
//將altermanager服務的yml配置文件複製到本地

進入qq郵箱生成受權碼:
Docker監控之Prometheus
Docker監控之Prometheus
Docker監控之Prometheus

[root@docker01 ~]# vim alertmanager.yml 
global:
  resolve_timeout: 5m
  smtp_from: '2567195852@qq.com'     //發送者信息
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '2567195852@qq.com   //接收者信息
  smtp_auth_password: 'tdcwcwvevmqwdjgg'    //使用本身qq郵箱生成的受權碼
  smtp_require_tls: false
  smtp_hello: 'qq.com'
route:
  group_by: ['alertname']                     //採用默認組
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: '2567195852@qq.com'               //發送者信息
    send_resolved: true                         //當容器恢復正常時,也會發送一份郵件
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

簡單介紹一下主要配置的做用:

*  global: 全局配置,包括報警解決後的超時時間、SMTP 相關配置、各類渠道通知的 API 地址等等。
*  route: 用來設置報警的分發策略,它是一個樹狀結構,按照深度優先從左向右的順序進行匹配。
*  receivers: 配置告警消息接受者信息,例如經常使用的 email、wechat、slack、webhook 等消息通知方式。
*  inhibit_rules: 抑制規則配置,當存在與另外一組匹配的警報(源)時,抑制規則將禁用與一組匹配的警報(目標)。
[root@docker01 ~]# docker rm -f alertmanager        //將本來的alertmanager 容器刪除
[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager
//從新運行alertmanager 容器,並將配置文件掛載到容器中
//建議運行容器以後,使用docker ps | grep alertmanager 確保容器正常運行
//若是配置文件編寫錯誤,那麼這個容器是沒法啓動的

(2)配置alertmanager報警規則

[root@docker01 ~]# mkdir -p prometheus/rules && cd prometheus/rules
//建立目錄用於存放規則的目錄
[root@dockerA rules]# vim node-up.rules         //編寫規則
groups:
- name: node-up               //自定義名稱
  rules:
  - alert: node-up
    expr: up{job="prometheus"} == 0               
// job的名稱必須和prometheus配置文件中的 - job_name: 'prometheus'對應
    for: 15s
    labels:
      severity: 1
      team: node
    annotations:
      summary: "{{ $labels.instance }} 已中止運行超過 15s!"

注:該 rules 目的是監測 node 是否存活,expr 爲 PromQL 表達式驗證特定節點 job="node-exporter" 是否活着,for 表示報警狀態爲Pending 後等待 15s 變成 Firing 狀態,一旦變成 Firing 狀態則將報警發送到 AlertManager,labels 和 annotations 對該 alert 添加更多的標識說明信息,全部添加的標籤註解信息,以及 prometheus.yml 中 該 job 已添加 label 都會自動添加到郵件內容中,更多關於 rule 詳細配置能夠參考它的官方文檔: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules
Docker監控之Prometheus
(3)關聯Prometheus

[root@docker01 ~]# vim prometheus.yml
# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - 192.168.45.129:9093     //此行將本來的內容更改成alertmanager容器的IP+端口

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  -  "/usr/local/prometheus/rules/*.rules"    //手動添加這一行

Docker監控之Prometheus

[root@docker01 ~]# docker rm -f prometheus      //修改完配置爲文件後,須要將容器刪除,從新運行一臺新的容器
prometheus
[root@docker01 ~]#  docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/rules/node-up.rules:/usr/local/prometheus/rules/node-up.rules prom/prometheus
//指定步驟(2)編寫的rule文件的路徑

至此開始模擬docker02節點 exporter組件失敗或將任意一臺的docker主機的容器中止運行以下圖:

Docker監控之Prometheus
Docker監控之Prometheus
OK以上能夠看郵箱收到容器中止運行的警告,但好像看的不是很直白爲了追求美觀,咱們採起設置一下報警信息的模板!
(4)、設置報警信息模板

[root@docker01 ~]# cd prometheus/
[root@docker01 prometheus]# mkdir alertmanager-tmpl
[root@docker01 prometheus]# cd alertmanager-tmpl/
[root@docker01 alertmanager-tmpl]# vim email.tmpl 
{{ define "email.from" }}2567195852@qq.com{{ end }}    //填寫本身的qq郵箱
{{ define "email.to" }}2567195852@qq.com{{ end }}      //填寫本身的qq郵箱
{{ define "email.to.html" }} 
{{ range .Alerts }}
=========start==========<br>
告警程序: prometheus_alert<br>
告警級別: {{ .Labels.severity }} 級<br>
告警類型: {{ .Labels.alertname }}<br>
故障主機: {{ .Labels.instance }}<br>
告警主題: {{ .Annotations.summary }}<br>
觸發時間: {{ .StartsAt.Format "2006-01-02 15:04:05" }} <br>
=========end==========<br>
{{ end }}
{{ end }}
//配置完成後保存退出便可
[root@docker01 alertmanager-tmpl]# cd
[root@docker01 ~]# vim alertmanager.yml 
global:
  resolve_timeout: 5m
  smtp_from: '2567195852@qq.com'     
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '2567195852@qq.com'
  smtp_auth_password: 'tdbwcpvewmzgderg'    //本身qq郵箱生成的受權碼
  smtp_require_tls: false
  smtp_hello: 'qq.com'
templates:                  //添加此行
  - '/etc/alertmanager-tmpl/*.tmpl'   //添加此行
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: '{{ template "email.to" }}'                    //必須和{{ define "email.to" }}2567195852@qq.com{{ end }} 中的對應
    html: '{{ template "email.to.html" . }}'       //必須和{{ define "email.to.html" }} 中的名字對應
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
//配置完成後保存退出便可
[root@docker01 ~]# docker rm  -f  alertmanger     //刪除此容器
[root@docker01 ~]# docker run -d --name alertmanger -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/prometheus/alertmanager-tmpl:/etc/alertmanager-tmpl  --restart=always prom/alertmanager
//運行一個新的容器

Docker監控之Prometheus
至此,新的報警模板也生成了,若是如下容器有Down的,就會給你發送新的郵件,恢復正常後,也會發送郵件,一樣,郵件中的內容格式是有誤的,可是你能夠正常接收到報警信息!
Docker監控之Prometheus
Docker監控之Prometheus

相關文章
相關標籤/搜索