centos7下安裝docker(17.4docker監控----prometheus)


Prometheus是一個非常優秀的監控工具。准確的說,應該是監控方案。Prometheus提供了監控數據搜集,存儲,處理,可視化和告警一套完整的解決方案

Prometheus架構如盜圖:

官網上的原始架構要復雜些。

Prometheus server

prometheus server負責從exporter拉取和存儲監控數據,並提供一套靈活的查詢語句(promQL)供用戶使用

exporter:

exporter負責收集目標對象(host,container。。。)的性能數據,並通過HTTP接口供prometheus server獲取

 

可視化組件:

監控數據的可視化展示對於監控方案至關重要。之前prometheus自己開發了一套工具,不過后來廢棄了,因為開源社區出現了更優秀的產品:Grafana。Grafana能夠與Prometheus無縫集成,提供完美的數據展示功能。

 

Alertmanager

用戶可以定義基於數據監控的告警規則,規則會觸發告警,會通過預定義的方式發出告警通知。支持的方式包括Email,pagerduty,webhook等

 

prometheus最大的亮點和先進性是他的多維數據模型

 

prometheus核心:多維數據模型

比如要監控容器webapp1的內存使用情況,最傳統和典型的方法是定義一個指標container_memory_usage_bytes_webapp1來記錄webapp1的內存使用數據,加入每一分鍾取樣一次,那么在數據庫里就會有類似下面的記錄

如果現在需求發生了變化,我們需要知道webapp所有容器的內存使用情況,如果還是采用剛才的方法,就不得不增加指標container_memory_usage_bytes_webapp2,container_memory_usage_bytes_webapp3,。。。。。。。

像graphite這類更高級的監控方案采用了更為優雅的層次化數據模型,為了滿足上面的需求,graphite會定義指標:container.memory_usage_butes.webapp1,container.memory_usage_butes.webapp2,container.memory_usage_butes.webapp3,。。。。。。

然后就可以用:container.memory_usage_butes.webapp*獲取所有的webapp內存使用數據

此外graphite還支持sum()等函數對指標進行計算和處理,

比如:sum(container.memory_usage_butes.webapp1*)可以得到所有webapp容器占用的總內存量

 

 

目前為止,問題處理的都很好,但是客戶也許會提出更多得需求:現在不僅按容器得名字統計內存使用量,還要按照鏡像來統計;或者想對比一下某一組容器在生產環境和測試環境中內存使用得不同情況

 

如果按照傳統得方案:只要定義更多得指標就能滿足這些需求,比如:

container.memory_usage_bytes.image1.webapp1,container.memory_usage_bytes.webapp1.prod等

但問題在於我們沒辦法提前預知客戶要用這些數據回答怎樣得問題,所以沒辦法提前定義好所有得指標

 

下面來看一下prometheus解決方案:

 

promethues只需要定義一個全局得指標container_memory_usage_bytes,然后通過添加不同得維度數據來滿足不同得業務需求

比如對於前面的webapp1的三條取樣數據,轉換成prometheus多維數據變成:

 

后面三列container_name,image,env就是數據的三個w維度。

想象一下,如果不同的env(prod,test,dev),不同image的容器,他們的內存使用數據中標注了這三個維度信息,那么就能滿足很多業務需求

比如:

1.計算webapp2的平均內存使用情況:

avg(container_memory_usage_bytes{container_name="webapp2"})

2.計算運行mycom/webapp:1.3鏡像的所有內存使用總量:

sum(container_memory_usage_bytes{image="mycom/webapp:1.3"})

3.統計不同運行環境中webapp容器內存使用總量:

sum(container_memory_usage_bytes{container_name=~"webapp"})by (env)

這只是幾個例子,不過已經說明prometheus數據模型的優勢了:

1.通過維度對數據進行說明,附加更多的業務信息,進而滿足不同業務的需求。同時維度是可以動態添加的,比如再給數據添加一個user維度,就可以按照用戶來統計內存的使用量了。

2.prometheus豐富的查詢語句能夠靈活,充分挖掘數據的價值

 

 

部署prometheus:

環境說明:我們通過prometheus監控兩台docker host,監控host和容器兩個層次的數據

按照架構圖,我們需要運行如下組件:

prometheus server

prometheus server本身也是用容器方式運行

exporter

prometheus有很多現成的exporter,完整的列表請參考官網:

    我們將使用:

1.NODE exporter,負責收集host硬件和操作系統數據,他將以容器的方式運行在所有的host上

2.cadvisor:負責收集容器的數據,他將以容器的方式運行在所有的host上

 

grafana

顯示多維數據,grafana將以容器的方式與prometheus server運行在同一個host上

 

開始部署

1.運行node exporter

在兩個host上運行容器:

 docker run -d -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 :--network host,這樣prometheus server可以直接與node exporter通信

Node exporter啟動后,將通過9100提供host的監控數據。在瀏覽器中通過http://ip:9100/metrics測試一下

兩個host運行cadvisor

docker run -d -p 8080:8080 --network host --name cadvisor -v /:/rootfs:ro -v /var/run:/var/run:rw -v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro google/cadvisor:latest

注意:我們這里的容器也是用的是host網絡,這樣方便cadvisor與prometheus server 進行通信

cadvisor啟動后,將通過8080提供host的監控數據。在瀏覽器中通過:http://ip:8080/metrics測試

在docker2host上運行prometheus server

 docker run -it -p 9090:9090 -v /root/prometheus:/etc/prometheus --name prometheus --network host prom/prometheus

這個prometheus.yml文件是自己創建的

可以在官網上copy,https://prometheus.io/docs/prometheus/latest/getting_started/

最重要的配置是最后兩句:

 

指定從那些exporter上抓取數據,我這里指定了兩台host上的Node exporter和cadvisor

另外,localhost:9090就是prometheus server自己,可見prometheus本身也會收集自己的監控數據。同樣的可以通過http://ip:9090/metrics測試一下

 

 

在這里我們使用的依然是host的網絡,這樣prometheus server可以直接與exporter和grafana進行通信

 

在瀏覽器中打開http://ip:9090,點擊菜單status->targets

 

所有的target的state都是UP,說明Promethues server能夠正常獲取監控數據

 

 

 在prometheus server上運行grafana

 同樣是以容器的方式運行,官網:http://docs.grafana.org/installation/docker/

docker run \
  -d \
  -p 3000:3000 \
  --name=grafana \

--network host \
  -e "GF_SERVER_ROOT_URL=http://grafana.server.name" \
  -e "GF_SECURITY_ADMIN_PASSWORD=secret" \
  grafana/grafana

 

注:這里我們依然使用的是host網絡,這樣grafana可以直接與prometheus server進行通信

-e "GF_SECURITY_ADMIN_PASSWORD=secret" 指定了grafana admin用戶密碼:secret

 

grafana啟動后。在瀏覽器中打開http://ip:3000

 

 登錄后,grafana將引導我們配置Data source

 

 Name為data source命名

例如:prometheus

Type選擇prometheus

Url輸入:prometheus server的地址:http://ip:9090

其他值保持默認,點擊add

 

現在grafana就可以訪問prometheus server中存放的數據了,那么如何讓展示呢?

grafana是通過dashboard展示數據的,在dashboard中需要定義

1.展示prometheus的那些數據?需要給出具體的查詢語句表達式

2.用什么形式展示,比如:二維線性圖,儀表圖,各種坐標的含義

 

可見要做出一個dashboard也是一件不容易的事情。還好,我們可以借助開源社區的力量,直接俄使用現成的dashboard。

訪問:https://grafana.com/dashboards?dataSource=prometheus&search=docker

,將會看到很多用於監控docker的dashboard

 

我們可以下載現成的dashboard,然后import到我們的grafana中就可以直接使用了。

 

比如:下載一個Docker and system monitoring,得到一個json文件

 

 點擊gafana左上角菜單:dashboard->import

導入我們下載得json文件

dashboard將立刻展示出漂亮得圖表

在這個dashboard中,上部分是host數據,我們可以通過Node切換不同得host

 

 Dashboard得下班部分展示的是所有容器監控數據。grafana的dashboard是可以交互的,我們可以在圖表上只顯示指定的容器,選取指定的時間區間,重新組織和排列圖表,調整刷新頻率,功能非常強大!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM