使用 docker-compose 搭建 prometheus 監控系統

Prometheus 是當前一套非常流行的開源監控和報警系統,於 2016 年加入了 Clound Native Computing Foundation,是繼 kubernates 之後的第二個託管項目。

本文講述如何使用 docker 快速搭建 prometheus 監控系統。

概覽

本文的實驗環境爲 Mac OS,監控系統主要是用來監控兩臺 CentOS 主機資源使用情況。搭建的監控系統包括以下軟件:

  • prometheus:負責收集和存儲時間序列數據
  • node-exporter:負責暴露主機 metrics 數據給 prometheus
  • grafana:負責展示數據

它們的關係如下圖所示:

node-exporter

爲方便操作,我們先創建 prometheus 目錄,用於存放此次實驗的文件,例如,筆者創建的目錄爲 ~/code/docker/prometheus

Node-exporter (下文簡稱 exporter)官方文檔不建議使用 docker 來安裝 exporter,本文爲了實驗的便捷,通過在一個 centos 容器運行 exporter 來驗證其使用方法。
生產環境下,可以直接在主機上安裝 exporter。

從鏈接 https://prometheus.io/download/#node_exporter 下載 exporter,解壓,文件夾改名爲 node_exporter ,並放置在 prometheus 目錄下。

爲使用 docker 運行 exporter,需要安裝好 docker 和 docker-compose。

運行 exporter 的 docker-compose.yml 文件如下:

version: '3'
services:
  centos1:
    image: centos
    container_name: centos1
    restart: always
    ports:
      - "9101:9100"
    volumes:
      - ~/code/docker/prometheus/node_exporter:/root
    command: /root/node_exporter

  centos2:
    image: centos
    container_name: centos2
    restart: always
    ports:
      - "9102:9100"
    volumes:
      - ~/code/docker/prometheus/node_exporter:/root
    command: /root/node_exporter

啓動兩個 centos 容器,每個容器都運行 exporter,用於生成 prometheus 所需要主機 metrics。

exporter 啓動的默認端口是 9100,爲了在外部訪問,我們將其分別映射爲 9101 和 9102 端口。

爲了在 centos 容器內部執行 exporter,我們使用 bind mount 的方式,並使用 command 來執行 exporter。

執行 docker-compose up -d ,成功啓動容器 centos1centos2 ,打開瀏覽器,輸入地址 http://127.0.0.1:9101/metricshttp://127.0.0.1:9102/metrics 可以看到 metrics 輸出。

prometheus

prometheus 目錄下創建 prometheus 目錄,用於存放 prometheus 的配置文件 prometheus.yml。創建 prometheus.yml 文件如下:

global:
  scrape_interval: 5s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['prometheus:9090']
  - job_name: 'linux-exporter'
    metrics_path: /metrics
    static_configs:
      - targets: ['centos1:9100', 'centos2:9100']

global 是全局的配置,scrape_interval 用於設置每次數據收集的間隔爲 5 秒。
scrape_configs 用於配置數據收集的信息,這裏我們配置了兩個 job,一個用於收集 prometheus 自身的 metrics,一個用於收集上面我們啓動的兩個 centos 容器的 metrics。

在配置 targets 地址時,我們需要使用 docker-compose.yml 中容器名稱來代替相應的 ip 地址,這種使用方式也在文章《Docker Compose 入門教程》中使用過。

添加上 prometheus 的 docker-compose.yml 文件如下:

version: '3'
services:
  centos1:
    image: centos
    container_name: centos1
    restart: always
    ports:
      - "9101:9100"
    volumes:
      - ~/code/docker/prometheus/node_exporter:/root
    command: /root/node_exporter

  centos2:
    image: centos
    container_name: centos2
    restart: always
    ports:
      - "9102:9100"
    volumes:
      - ~/code/docker/prometheus/node_exporter:/root
    command: /root/node_exporter

  prometheus:
    image: prom/prometheus
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ~/code/docker/prometheus/prometheus:/etc/prometheus
      - ~/code/docker/prometheus/prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'

爲了退出容器後可以保存數據,我們使用了 bind mount 的方式,將 prometheus 保存 TSDB 目錄映射到本地的 prometheus_data 目錄。

執行 docker-compose up -d 後,打開瀏覽器,輸入地址 http://127.0.0.1:9090/targets ,可以看到 兩個 centos 容器 targets 的狀態都爲 UP 狀態,說明 prometheus 可以正常獲取 exporter 的數據。

grafana

prometheus 目錄下創建 grafana_data 目錄,用於保存 grafana 的數據。本實驗完整的目錄結構如下圖所示:

添加上 grafana 的 docker-compose.yml 文件如下:

version: '3'
services:
  centos1:
    image: centos
    container_name: centos1
    restart: always
    ports:
      - "9101:9100"
    volumes:
      - ~/code/docker/prometheus/node_exporter:/root
    command: /root/node_exporter

  centos2:
    image: centos
    container_name: centos2
    restart: always
    ports:
      - "9102:9100"
    volumes:
      - ~/code/docker/prometheus/node_exporter:/root
    command: /root/node_exporter

  prometheus:
    image: prom/prometheus
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ~/code/docker/prometheus/prometheus:/etc/prometheus
      - ~/code/docker/prometheus/prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'

  grafana:
    image: grafana/grafana
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - ~/code/docker/prometheus/grafana_data:/var/lib/grafana

啓動 docker-compose 後,打開瀏覽器,輸入地址 http://127.0.0.1:3000 ,輸入用戶名 admin 和密碼 admin,登錄進 grafana。

我們先添加 data source:

注意輸入的 prometheus 地址爲 http://prometheus:9090

接下來可以創建新的 dashboard,例如,我們創建一個顯示5 分鐘內負載的 dashboard:

編輯完成,保存,顯示效果:

除了自己創建 dashboard,也可以利用別人已完成的 dashborad。

在地址 https://grafana.com/grafana/dashboards 可以看到可以使用的 dashboard。這裏我們選擇 dashboard id 爲 8918 的 dashboard,並導入到 grafana:

輸入 8919,保存後,可以看到顯示效果:

參考資料

  • https://github.com/prometheus/prometheus
  • https://juejin.im/post/5d54bc80f265da03a6531063
  • https://www.cnblogs.com/xiao987334176/p/9930517.html
  • https://prometheus.io/docs/prometheus/latest/installation/
  • https://github.com/vegasbrianc/prometheus/blob/master/docker-compose.yml
  • https://juejin.im/post/5c9dc0b06fb9a070ae3da6e7
  • https://prometheus.fuckcloudnative.io/di-san-zhang-prometheus/storage
  • https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-prometheus-getting-started-and-practice/index.html
發佈了193 篇原創文章 · 獲贊 443 · 訪問量 123萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章