天天看點

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

本篇已加入《 .NET Core on K8S學習實踐系列文章索引 》,可以點選檢視更多容器化技術相關系列文章。上一篇介紹了Google開發的容器監控工具cAdvisor,但是其提供的操作界面較為簡陋,且不支援監控多Host,實用性有待提高。是以,本篇會介紹一個流行的生産級監控工具,不,準确說來應該是一個監控方案,它就是Prometheus!

實驗環境: 阿裡雲ECS主機 (兩台),CentOS 7.4

一、Prometheus簡介

1.1 關于Prometheus

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

  Prometheus是由SoundCloud開發的開源監控系統的開源版本。2016年,由Google發起的雲原生基金會CNCF (Cloud Native Computing Foundation) 将其納入為其第二大開源項目(第一大開源項目是Kubernetes)。Prometheus提供了一整套的包括監控資料搜集、存儲、處理、可視化和告警的完整解決方案。

  Prometheus官網位址:

https://prometheus.io/

  Prometheus GitHub:

https://github.com/prometheus/prometheus/

1.2 Prometheus架構

  Prometheus在其官方github上貼出的其架構圖如下:  

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   為了更容易了解這個架構,這裡我們采用園友

Cloud Man

(他也是本文參考資料《每天5分鐘玩轉Docker》作者)總結的下圖,它去掉了一些部分,隻保留了最重要的元件,可以幫助我們避免注意力分散。

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   從上圖看來,我們着重需要關注以下幾個核心元件:

  (1)Prometheus Server:負責從Exporter中拉取和存儲監控資料,并提供一套查詢語言(PromQL)供使用者使用。

  (2)Exporter:負責收集目标對象(如Host或Container)的性能資料,并通過HTTP接口供Prometheus Server擷取。

  (3)可視化元件 Grafana:擷取Prometheus Server提供的監控資料并通過Web UI的方式完美展現資料。

  (4)AlertManager:負責根據告警規則和預定義的告警方式發出例如Email、Webhook之類的告警。

1.3 Prometheus資料模型

  Prometheus 中存儲的資料為時間序列,是由 metric 的名字和一系列的标簽(鍵值對)唯一辨別的,不同的标簽則代表不同的時間序列。

  • metric 名字:該名字應該具有語義,一般用于表示 metric 的功能,例如:http_requests_total, 表示 http 請求的總數。其中,metric 名字由 ASCII 字元,數字,下劃線,以及冒号組成,且必須滿足正規表達式 a-zA-Z_:*。
  • 标簽:使同一個時間序列有了不同次元的識别。例如 http_requests_total{method="Get"} 表示所有 http 請求中的 Get 請求。當 method="post" 時,則為新的一個 metric。标簽中的鍵由 ASCII 字元,數字,以及下劃線組成,且必須滿足正規表達式 a-zA-Z_:*。
  • 樣本:實際的時間序列,每個序列包括一個 float64 的值和一個毫秒級的時間戳。

  時間序列格式:

<metric name>{<label name>=<label value>, ...}      

  示例:

api_http_requests_total{method="POST", handler="/messages"}      

  之前有分享過另一個

時序資料庫InfluxDB

,它也是一個不錯的時序資料庫,經常用來作為監控資料的存儲。OK,關于Prometheus的簡介就到這兒,下面那我們開始動手将Prometheus初步用起來。

二、Prometheus實踐

2.1 實驗環境說明

  此次實驗會搭建一個基于Prometheus的監控系統,用于監控兩台阿裡雲ECS主機,監控目标為Host和容器兩個層次。

主機 IP 運作元件
阿裡雲ECS1 47.102.140.100 Prometheus Server、Grafana、Exporter(Node Exporter & cAdvisor)
阿裡雲ECS2 47.102.140.101 Exporter(Node Exporter & cAdvisor)
Note:Prometheus支援多種Exporter,這裡我們使用Node Exporter 和 cAdvisor。其中,Node Exporter用于收集Host相關資料,cAdvisor用于收集容器相關資料。Node Exporter 和 cAdvisor 會運作在所有實驗主機上。

2.2 運作Node Exporter

  在兩台主機上執行以下指令運作Node Exporter:

docker run -d -p 9100:9100 \
-v "/proc:/host/proc" \
-v "/sys:/host/sys" \
-v "/:/rootfs" \
prom/node-exporter \
--path.procfs /host/proc \
--path.sysfs /host/sys \
--collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"           

  執行成功後,會建立一個Node Exporter的容器執行個體,通路兩台主機的位址

http://[ECS1/2-HostIP]:9100/metrics

,你可以看到如下圖所示的資訊:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   如果能看到上圖,說明你的Node Exporter可以為Prometheus提供該Host的監控資料了。

2.3 運作cAdvisor

  這部分我們在上一篇《

容器監控(2)cAdvisor

》中已經介紹過了,這裡我們繼續在這兩台主機中執行以下指令安裝運作cAdvisor(如果已經運作了,就不必再執行了):

docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest           

  同樣,我們也可以通過通路

http://[ECS1/2-HostIP]:8080/metrics

來檢視cAdvisor提供的監控資料,如下圖所示:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   如果能看到上圖,說明你的cAdvisor可以為Prometheus提供該Host的監控資料了。

2.4 運作Prometheus Server

  這裡我們在主機A(表中的ECS1)上執行以下指令來運作Prometheus Server:

docker run -d -p 9090:9090 \
  -v /edc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  --name prometheus \
  prom/prometheus           

  此外,這裡的prometheus.yml 是Prometheus Server的配置檔案,需要事先編輯好并放到指定目錄下(這裡是/edc/prometheus/目錄下)讓docker可以讀取到,内容如下:

global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    monitor: 'edc-lab-monitor'

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

rule_files:
  # - "first.rules"
  # - "second.rules"
  
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['47.102.140.100:9090']
  
  - job_name: 'host'
    static_configs:
      - targets: ['47.102.140.100:9100','47.102.140.101:9100']

  - job_name: 'container'
    static_configs:
      - targets: ['47.102.140.100:8080','47.102.140.101:8080']           

  這裡需要注意的配置是scrape_configs中的static_configs,裡面定義了Prometheus會從哪些Exporter中抓取監控資料,這裡指定了兩台雲主機的Node Exporter與cAdvisor。

  執行成功後,Prometheus容器已經建立好了,通路這台ECS1的位址:

http://[ECS1

Host IP]:9090/metrics,如下圖所示:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   然後,我們直接通路

http://[ECS1-HostIP]:9090

,會進入Prometheus首頁:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   單擊菜單Status => Targets,會看到所有監控的目标Exporters:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   可以看到所有監控目标的狀态都是Up,表示Prometheus Server可以正常擷取監控資料。

2.5 運作Grafana

  這裡我們繼續在主機A(ECS1)上執行以下指令運作Grafana:

docker run -d -i -p 3000:3000 \
-e "GF_SERVER_ROOT_URL=http://grafana.server.name" \
-e "GF_SECURITY_ADMIN_PASSWORD=secret" \
grafana/grafana           

  -e "GF_SECURITY_ADMIN_PASSWORD=secret" 則指定了Admin使用者的密碼為secret,這裡你也可以随你的意願改為你可以記得住的。

  執行成功後,我們可以通過通路:

http://[ECS1-HostIP]:3000

看到以下Grafana的登入界面

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

  下面幾個步驟用于初始化配置Grafana讓其可以展示監控資料儀表盤Dashboard:

  Step1.登陸之後進入首頁,選擇引導頁,從"add data source"開始,第一步選擇時序資料庫,這裡選擇Prometheus

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

  Step2.配置Prometheus Server位址及Name,完成後點選“Save&Test”:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

  Step3.回到引導首頁,選擇Add Dashboard按鈕,進入Dashboard頁,選擇Import Dashboard,進入下圖:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   這裡選擇的Dashboard,你可以在

grafana的dashboard官網

的搜尋你喜歡的關于Docker監控主題的各種Dashboard樣式。這裡我們要做的就是将其ID(這裡我選擇的一個Docker監控的dashboard ID是193,其餘的我不記得了)複制到圖中的文本框中(當然,你也可以下載下傳json并粘貼進去)。

  Step4.Grafana識别之後,就會顯示其詳情讓你确認。在确認頁選擇Prometheus的資料源,這裡選擇我們剛剛添加的資料源,然後點選Import即可完成導入。

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   完成以上導入Dashboard步驟之後,這裡我的Dashboard清單有了三個Dashboard:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

  這裡我們主要關注第一個(Docker-Monitor)和第三個(Host-Monitor),先來看第一個Dashboard,它主要是為我們展示Docker層次的監控面闆:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   從上圖可以看到兩台Host中的所有容器監控資料一覽無遺。

   第三個面闆(Host-Monitor)的展示面闆如下圖所示:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   在上圖中,我們選擇的分組是Host,它主要是收集來自Node-Exporter中回報的基于Host的監控資料,可以實時展示Host的關鍵名額。不過,它每次隻能顯示單台Host的資料,我們可以通過切換Host IP下拉清單檢視不同Host的性能資料。

  此外,我們一般會将其投屏到工作區的電視上,是以我們可以點選下面這個按鈕以投屏模式顯示在電視上,供整個團隊及時檢視。

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

三、監控工具大比較

  這裡我們仍然引用Cloud Man總結的一張表來看看:

容器監控知多少 (3) Prometheus一、Prometheus簡介二、Prometheus實踐三、監控工具大比較四、小結參考資料

   毫無疑問,Prometheus作為生産級的監控方案,對其他幾個工具形成了壓倒性的優勢。而事實上,Prometheus + Grafana + cAdvisor這一套方案也是大家廣泛采用的結構。

四、小結

  本文首先簡單介紹了Prometheus及其架構,然後通過搭建基于Prometheus + cAdvisor + Grafana的監控系統,能夠實作對于多台雲主機的性能監控(包括Host和容器兩個層次的資料)。當然,Prometheus還有很多的配置和好玩的地方例如Alert Manager可以及時發送告警通知等,筆者也隻是初步把玩,還有很多東西不知道。後面我會分享引入K8S後,結合Prometheus + cAdvisor + Grafana實作K8S叢集的監控,敬請期待。

參考資料

Cloud Man,《

每天5分鐘玩轉Docker容器技術

無涯,《

從零開始搭建Prometheus自動監控告警系統

三無程式員,《

Prometheus

虎糾衛,《

監控神器-普羅米修斯Prometheus

項思凱,《

Prometheus介紹詳解

rj-bai,《

Prometheus+Grafana打造全方位監控系統

GeekerLou,《

雲原生監控系統Prometheus 一文搞懂各種容器監控方案