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

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

Prometheus架構如盜圖:web

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

Prometheus server數據庫

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

exporter:瀏覽器

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

 

可視化組件:架構

監控數據的可視化展現對於監控方案相當重要。以前prometheus本身開發了一套工具,不事後來廢棄了,由於開源社區出現了更優秀的產品:Grafana。Grafana可以與Prometheus無縫集成,提供完美的數據展現功能。app

 

Alertmanagerwebapp

用戶能夠定義基於數據監控的告警規則,規則會觸發告警,會經過預約義的方式發出告警通知。支持的方式包括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是能夠交互的,咱們能夠在圖表上只顯示指定的容器,選取指定的時間區間,從新組織和排列圖表,調整刷新頻率,功能很是強大!

相關文章
相關標籤/搜索