1. 程式人生 > 實用技巧 >PROMETHEUS的優勢特點 docker方式 安裝部署 和監控docker

PROMETHEUS的優勢特點 docker方式 安裝部署 和監控docker

原文 https://blog.csdn.net/cojn52/article/details/105766464

Prometheus 是一個非常優秀的監控工具。準確的說,應該是監控方案。Prometheus 提供了監控資料蒐集、儲存、處理、視覺化和告警一套完整的解決方案。

一 、PROMETHEUS架構
Prometheus 重要元件的架構如下:

官網上的原始架構圖比上面這張要複雜一些,只保留了最重要的元件。

Prometheus Server
負責從Exporter拉取和儲存監控資料,並提供一套靈活的查詢語言(PromQL)工使用者使用
Exporter
負責收集目標物件(host、container)的效能資料,並通過HTTP介面供 Prometheus Server 獲取
視覺化元件
監控資料的視覺化展示對於監控方案至關重要。以前Prometheus自己開發了一套工具,不夠後來放棄了,因為開源社群出現了更為優秀的產品 Grafana。Grafana能夠與 Prometheus無縫整合,提供完美的資料展示能力。
Alertmanager
使用者可以定義基於監控資料的告警規則,規則會觸發告警。一旦Alertmanager收到告警,會通過預定義的方式發出告警通知。支援的方式包括 email、PagerDuty、Webhook等
Prometheus 與 其他監控工具(zabbix、graphite、nagios等)相比,最大的亮點和先進性是他的多維資料模型。

二 、PROMETHEUS的優勢特點
比如要監控容器 webapp1 的記憶體使用情況,最傳統和典型的方法是定義一個指標 container_memory_usage_bytes_webapp1 來記錄 webapp1 的記憶體使用資料。假如每1分鐘取一次樣,那麼在資料庫裡就會有類似下面的記錄。

好,現在需求發生了點變化,我們需要知道所有 webapp 容器的記憶體使用情況。如果還是採用前面的方法,就不得不增加新的指標 container_memory_usage_bytes_webapp2、container_memory_usage_bytes_webapp3…

像 Graphite 這類更高階的監控方案採用了更為優雅的層次化資料模型。為了滿足上面的需求,Graphite 會定義指標 container.memory_usage_bytes.webapp1、container.memory_usage_bytes.webapp2、container.memory_usage_bytes.webapp3…

然後就可以用 container.memory_usage_bytes.webapp* 獲取所有的 webapp 的記憶體使用資料。

此外,Graphite 還支援 sum() 等函式對指標進行計算和處理,比如 sum(container.memory_usage_bytes.webapp*) 可以得到所有 webapp 容器佔用的總記憶體量。

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

當然你可以說:只要定義更多的指標就能滿足這些需求。比如 container.memory_usage_bytes.image1.webapp1、container.memory_usage_bytes.webapp1.prod等。

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

下面來看看 Prometheus 的解決方案。
Prometheus 只需要定義一個全域性的指標 container_memory_usage_bytes,然後通過新增不同的維度資料來滿足不同的業務需求。
比如對於前面 webapp1 的三條取樣資料,轉換成 Prometheus 多維資料將變成:

後面三列 container_name、image、env 就是資料的三個維度。想象一下,如果不同 env(prod、test、dev),不同 image(mycom/webapp:1.2、mycom/webapp:1.3)的容器,它們的記憶體使用資料中標註了這三個維度資訊,那麼將能滿足很多業務需求,比如:

計算 webapp2 的平均記憶體使用情況:avg(container_memory_usage_bytes{container_name=“webapp2”})

計算執行 mycom/webapp:1.3 映象的所有容器記憶體使用總量:sum(container_memory_usage_bytes{image=“mycom/webapp:1.3”})

統計不同執行環境中 webapp 容器記憶體使用總量:sum(container_memory_usage_bytes{container_name=~“webapp”}) by (env)

這裡只列了幾個例子,不過已經能夠說明 Prometheus 資料模型的優勢了:

通過維度對資料進行說明,附加更多的業務資訊,進而滿足不同業務的需求。同時維度是可以動態新增的,比如再給資料加上一個 user 維度,就可以按使用者來統計容器記憶體使用量了。

Prometheus 豐富的查詢語言能夠靈活、充分地挖掘資料的價值。前面示例中的 avg、sum、by 只是查詢語言中很小的一部分功能,已經為我們展現了 Prometheus 對多維資料進行分片、聚合的強大能力。

安裝部署

Docker Host:192.168.56.102 和 192.168.56.103,監控 host 和容器兩個層次的資料。

按照架構圖,我們需要執行如下元件:
Prometheus Server
Prometheus Server 本身也將以容器的方式執行在 host 192.168.56.103 上。
Exporter
Prometheus 有很多現成的 Exporter,完整列表請參考 https://prometheus.io/docs/instrumenting/exporters/
我們將使用:
Node Exporter,負責收集 host 硬體和作業系統資料。它將以容器方式執行在所有 host 上。
cAdvisor,負責收集容器資料。它將以容器方式執行在所有 host 上。
Grafana
顯示多維資料,Grafana 本身也將以容器方式執行在 host 192.168.56.103 上
執行 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|etc)($|/)"

注意,這裡我們使用了 --net=host,這樣 Prometheus Server 可以直接與 Node Exporter 通訊。

Node Exporter 啟動後,將通過 9100 提供 host 的監控資料。在瀏覽器中通過 http://192.168.56.102:9100/metrics 測試一下。

執行 cAdvisor

在兩個 host 上執行如下命令:

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

注意,這裡我們使用了 --net=host,這樣 Prometheus Server 可以直接與 cAdvisor 通訊。

cAdvisor 啟動後,將通過 8080 提供 host 的監控資料。在瀏覽器中通過 http://192.168.56.102:8080/metrics 測試一下。

執行 Prometheus Server

在 host 192.168.56.103 上執行如下命令:

docker run -d -p 9090:9090 \
  -v /root/prometheus.yml:/etc/prometheus/prometheus.yml \
  --name prometheus \
  --net=host \
  prom/prometheus

注意,這裡我們使用了
--net=host
,這樣 Prometheus Server 可以直接與 Exporter 和 Grafana 通訊。
prometheus.yml 是 Prometheus Server 的配置檔案。

最重要的配置是:

static_configs:
  - targets: ['localhost:9090','localhost:8080','localhost:9100','192.168.56.102:8080','192.168.56.102:9100']

指定從哪些 exporter 抓取資料。這裡指定了兩臺 host 上的 Node Exporter 和 cAdvisor。

另外 localhost:9090 就是 Prometheus Server 自己,可見 Prometheus 本身也會收集自己的監控資料。同樣地,我們也可以通過 http://192.168.56.103:9090/metrics 測試一下。

在瀏覽器中開啟 http://192.168.56.103:9090 ,點選選單 Status -> Targets。

如下圖所示:

所有 Target 的 State 都是 UP,說明 Prometheus Server 能夠正常獲取監控資料

執行 Grafana

在 host 192.168.56.103 上執行如下命令:

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

注意,這裡我們使用了 --net=host,這樣 Grafana 可以直接與 Prometheus Server 通訊。

-e "GF_SECURITY_ADMIN_PASSWORD=secret 指定了 Grafana admin使用者密碼 secret。

Grafana 啟動後。在瀏覽器中開啟 http://192.168.56.103:3000/

登入後,Grafana 將引導我們配置 Data Source。

Name 為 Data Source 命名,例如 prometheus。

Type 選擇 Prometheus。

Url 輸入 Prometheus Server 的地址 http://192.168.56.103:9090

其他保持預設值,點選 Add。

如果一切順利,Grafana 應該已經能夠訪問 Prometheus 中存放的監控資料了,那麼如何展示呢?

Grafana 是通過 Dashboard 展示資料的,在 Dashboard 中需要定義:

展示 Prometheus 的哪些多維資料?需要給出具體的查詢語言表示式。

用什麼形式展示,比如二維線性圖,儀表圖,各種座標的含義等。

可見,要做出一個 Dashboard 也不是件容易的事情。幸運的是,我們可以藉助開源社群的力量,直接使用現成的 Dashboard。

訪問 https://grafana.com/dashboards?dataSource=prometheus&search=docker,將會看到很多用於監控 Docker 的 Dashboard。

我們可以下載這些現成的 Dashboard,然後 import 到我們的 Grafana 中就可以直接使用了。

比如下載 Docker and system monitoring,得到一個 json 檔案,然後點選 Grafana 左上角選單 Dashboards -> Import。

匯入我們下載的 json 檔案。

Dashboard 將立刻展示出漂亮的圖表。

在這個 Dashboard 中,上部分是 host 的資料,我們可以通過 Node 切換不同的 host。

Dashboard 的下半部分展示的是所有的容器監控資料。Grafana 的 Dashboard 是可互動的,我們可以在圖表上只顯示指定的容器、選取指定的時間區間、重新組織和排列圖表、調整重新整理頻率,功能非常強大。

DOCKER啟動的時候提示WARNING: IPV4 FORWARDING IS DISABLED. NETWORKING WILL NOT WORK.

修改配置檔案:

vim /usr/lib/sysctl.d/00-system.conf

追加

 net.ipv4.ip_forward=1

接著重啟網路

[root@localhost mytomcat]# systemctl restart network