1. 程式人生 > >基於Prometheus做多維度的容器監控

基於Prometheus做多維度的容器監控

什麼是prometheus?

prometheus從官方介紹來說,他是一個開源的系統監控和報警工具,最初由SoundCloud推出。自2012成立以來,許多公司和組織都採用了prometheus,專案有一個非常活躍的開發者和使用者社群。它現在是一個獨立的開源專案,並獨立於任何公司。 

它具有以下特性:

1. 多維度資料模型(由鍵/值對確定的時間序列資料模型)
2. 具有一個靈活的查詢語言來利用這些維度
3. 不依賴分散式儲存;單個伺服器節點工作。
4. 時間序列的採集是通過HTTP pull的形式,解決很多push架構的問題。
5. 通過中介閘道器支援短時間序列資料的收集
6. 監控目標是通過服務發現或靜態配置
7. 多種資料展示面板支援,例如grafana

怎麼使用prometheus監控容器

prometheus監控不同的目標服務需要實現不同的exporter外掛,早期的時候,官方出了container-exporter專案,但是現在專案已經停止。推薦使用谷歌的cAdvisor專案作為prometheus的exporter。cAdvisor作為一個監控單機容器的專案,資料較為全面,但是也有很大的問題,例如io等資料沒有等等。結合prometheus後就能在整個叢集監控查詢容器。舉個例子,你有一個專案有3個容器分佈在三臺機器,你怎麼監控整個專案的流量,記憶體量,負載量的實時資料。這就是prometheus的多維度查詢解決的問題,資料從3臺機器的cadvisor得到每個容器的資料,它的多維度查詢語法就能讓你得到你想要的資料。

這裡假設你有10臺機器部署了容器需要監控,你在10臺機器上分別部署cAdvisor容器
sudo 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 \
  google/cadvisor:latest

找一臺機器部署prometheus服務,這裡依然使用容器部署:

docker run \
-p 9090:9090 \
--log-driver none \
-v /hdd1/prometheus/etc/:/etc/prometheus/ \ -v /hdd1/prometheus/data/:/prometheus/ \ -v /etc/localtime:/etc/localtime \ --name prometheus \ prom/prometheus

建立/hdd1/prometheus/etc/prometheus.yml配置檔案

 my global config
global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.
  evaluation_interval: 15s # By default, scrape targets every 15 seconds.
  # scrape_timeout is set to the global default (10s).
  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'container-monitor'
# Load and evaluate rules in this file every 'evaluation_interval' seconds.
rule_files:
   - "/etc/prometheus/rules/common.rules"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'container'
    static_configs:
    - targets: ['10.12.1.129:9090','10.12.1.130:9090','10.50.1.92:9090','10.50.1.93:9090','10.50.1.119:9090']
配置檔案中 -targets中的端點填寫你的實際cadvisor所在的ip和暴露的埠.正確啟動後訪問ip:9090就能查詢資料了哦。

prometheus缺點

1. 單機缺點,單機下儲存量有限,根據你的監控量侷限你的儲存時間。
2. 記憶體佔用率大,prometheus集成了leveldb,一個能高效插入資料的資料庫,在ssd盤下io佔用比較高。同時可能會有大量資料堆積記憶體。但是這是可以配置的。

prometheus適用於監控所有時間序列的專案

目前其生態中已經有很多exporter實現,例如:
Node/system metrics exporter
AWS CloudWatch exporter
Blackbox exporter
Collectd exporter
Consul exporter
Graphite exporter
HAProxy exporter
InfluxDB exporter
JMX exporter
Memcached exporter
Mesos task exporter
MySQL server exporter
SNMP exporter
StatsD exporter
你也可以根據你的需要自己實現exporter,完成你需要的監控任務。