容器監控告警方案(cAdvisor + nodeExporter + alertmanager + prometheus +grafana)

1、prometheus基本架構php

Prometheus 是一套開源的系統監控報警框架。它啓發於 Google 的 borgmon 監控系統,由工做在 SoundCloud 的 google 前員工在 2012 年建立,做爲社區開源項目進行開發,並於 2015 年正式發佈。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成爲受歡迎度僅次於 Kubernetes 的項目。做爲新一代的監控框架,Prometheus 具備如下特色:html

  • 多維數據模型(時序列數據由metric名和一組key/value組成)
  • 在多維度上靈活的查詢語言(PromQl)
  • 不依賴分佈式存儲,單主節點工做.
  • 經過基於HTTP的pull方式採集時序數據
  • 能夠經過push gateway進行時序列數據推送(pushing)
  • 能夠經過服務發現或者靜態配置去獲取要採集的目標服務器
  • 多種可視化圖表及儀表盤支持

 

 

  • Prometheus server 主要負責數據採集和存儲,按期從靜態配置的 targets 或者服務發現(主要是DNS、consul、k8s、mesos等)的 targets 拉取數據,提供PromQL查詢語言的支持
  • 客戶端sdk 官方提供的客戶端類庫有go、java、scala、python、ruby,其餘還有不少第三方開發的類庫,支持nodejs、php、erlang等
  • Push Gateway 支持臨時性Job主動推送指標的中間網關
  • exporters 支持其餘數據源的指標導入到Prometheus,支持數據庫、硬件、消息中間件、存儲系統、http服務器、jmx等java

  • alertmanager 實驗性組件、用來進行報警node

  • 主要經過grafana來實現webui展現

 

2、手動實驗python

環境準備:172.16.101.250、172.16.101.251 都已安裝了docker和docker-compose服務,須要機器連網,要否則docker鏡像不能自動下載。mysql

部署規劃:web

機器 部署服務
172.16.101.250

prometheussql

cAdvisordocker

Node Exporter數據庫

grafana

172.16.101.251

cAdvisor

Node Exporter

 

 

 

 

 

 

 

 

 

一、在2臺機器上部署Node Exporter和cAdvisor

  • Node Exporter,負責收集 host 硬件和操做系統數據。它將以容器方式運行在全部 host 上。

  • cAdvisor,負責收集容器數據。它將以容器方式運行在全部 host 上。

   1)新建  /opt/container-monitor/nodeexporter-cadvisor/docker-compose.yml

version: '2.1'
services:
  node-exporter:
    image: prom/node-exporter
    container_name: prometheus_node-exporter
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"
    ports:
      - 9100:9100
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/devicemapper|rootfs/var/lib/docker/aufs)($$|/)'
  cadvisor:
    image: google/cadvisor
    container_name: prometheus_cadvisor
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"
    ports:
      - 9101:8080
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

 

   2) 運行容器

cd /opt/container-monitor/nodeexporter-cadvisor
docker-compose up -d

瀏覽器輸入:http://172.16.101.250:9100/metrics  能夠看到node exporter採集的host的數據

 

 瀏覽器輸入:http://172.16.101.250:9101/metrics  能夠看到cAdvisor採集的container的數據

 

 

 

二、只在172.16.101.250機器上部署alertmanager

 Alertmanager處理由相似Prometheus服務器等客戶端發來的警報,以後須要刪除重複、分組,並將它們經過路由發送到正確的接收器,好比電子郵件、Slack等。Alertmanager還支持沉默和警報抑制的機制。

  1)新建  /opt/container-monitor/alertmanager/config.yml 

# 全局配置項
 global: 
   resolve_timeout: 5m  #處理超時時間,默認爲5min
   smtp_smarthost: 'smtp.163.com:25'  # 郵箱smtp服務器代理
   smtp_from: 'xxx@163.com'  # 發送郵箱名稱
   smtp_auth_username: 'xxx@163.com'  # 郵箱名稱
   smtp_auth_password: 'xxx'  #郵箱密碼

# 定義模板信心
 templates:
   - '/etc/alertmanager/templates/*.html'

# 定義路由樹信息
 route:
   group_by: ['alertname'] # 報警分組依據
   group_wait: 10s # 最初即第一次等待多久時間發送一組警報的通知
   group_interval: 10s # 在發送新警報前的等待時間
   repeat_interval: 1m # 發送重複警報的週期 對於email配置中,此項不能夠設置太低,不然將會因爲郵件發送太多頻繁,被smtp服務器拒絕
   receiver: 'email' # 發送警報的接收者的名稱,如下receivers name的名稱

# 定義警報接收者信息
 receivers:
   - name: 'email' # 警報
     email_configs: # 郵箱配置
     - to: 'xxxx@qq.com'  # 接收警報的email配置
       html: '{{ template "test.html" . }}' # 設定郵箱的內容模板
       headers: { Subject: "[WARN] 報警郵件"} # 接收郵件的標題
     webhook_configs: # webhook配置
     - url: 'http://127.0.0.1:5001'

   2)新建  /opt/container-monitor/alertmanager/docker-compose.yml 

version: '2.1'
services:
  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    restart: always
    network_mode: "host"
    ports:
      - 9093:9093
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"
    volumes:
      - ./config.yml:/etc/alertmanager/config.yml
      - ./test.html:/etc/alertmanager/templates/test.html
    command:
      - '--config.file=/etc/alertmanager/config.yml'
      - '--storage.path=/alertmanager'
      - '--log.level=debug'

   3)新建  /opt/container-monitor/alertmanager/test.html

{{ define "test.html" }}
<table border="1">
        <tr>
                <td>報警項</td>
                <td>實例</td>
                <td>報警內容</td>
                <td>開始時間</td>
        </tr>
        {{ range $i, $alert := .Alerts }}
                <tr>
                        <td>{{ index $alert.Labels "alertname" }}</td>
                        <td>{{ index $alert.Labels "instance" }}</td>
                        <td>{{ index $alert.Annotations "description" }}</td>
                        <td>{{ $alert.StartsAt }}</td>
                </tr>
        {{ end }}
</table>
{{ end }}

test.html是用來展現,告警消息的界面,展現在接收的郵箱上。

  4)運行alertmanager容器

cd /opt/container-monitor/alertmanager
docker-compose up -d

 

 

 

三、只在172.16.101.250機器上部署prometheus

  1)新建  /opt/container-monitor/prometheus/running-rule.yml  ,該配置文件是prometheus中觸發告警的配置文件

groups:
- name: test-rule
  rules:
  - alert: "服務運行"
    expr: container_tasks_state{name="mysql",state="running"} == 0
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "服務名:{{$labels.alertname}}"
      description: "容器: {{ $labels.name }} 處於運行中"

  2)新建  /opt/container-monitor/prometheus/prometheus.yml,prometheus的主配置文件

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  external_labels:
      monitor: 'codelab-monitor'
# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets: - 172.16.101.250:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
   - running-rule.yml

# 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: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['172.16.101.250:9090','172.16.101.250:9100','172.16.101.250:9101','172.16.101.251:9100','172.16.101.251:9101']

上面紅色的部分:指定從哪些 exporter 抓取數據。這裏指定了兩臺 host 上的 Node Exporter 和 cAdvisor。開頭的  172.16.101.251:9090 表示會收集本身的監控數據

更多的配置能夠看:  https://prometheus.io/docs/prometheus/latest/configuration/configuration/

 

3)新建  /opt/container-monitor/prometheus/docker-compose.yml

version: '2.1'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    restart: always
    network_mode: "host"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"
    volumes:
      - ./running-rule.yml:/etc/prometheus/running-rule.yml:z
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:z

4)運行prometheus容器

cd /opt/container-monitor/prometheus
docker-compose up -d

瀏覽輸入: http://172.16.101.250:9090,能夠看到promethues的數據

 

  打開"Alerts",告警觸發前:

   打開"Alerts",告警觸發後:

   

     查看接收告警消息的qq郵箱:

    

 

 

四、只在172.16.101.250機器上部署grafana

Grafana是一個開源的度量分析與可視化套件。常常被用做基礎設施的時間序列數據和應用程序分析的可視化,它在其餘領域也被普遍的使用包括工業傳感器、家庭自動化、天氣和過程控制等。

Grafana支持許多不一樣的數據源。每一個數據源都有一個特定的查詢編輯器,該編輯器定製的特性和功能是公開的特定數據來源。

官方支持如下數據源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。

每一個數據源的查詢語言和能力都是不一樣的。你能夠把來自多個數據源的數據組合到一個儀表板,但每個面板被綁定到一個特定的數據源,它就屬於一個特定的組織。
 

 1)新建  /opt/container-monitor/grafana/docker-compose.yml

version: '2.1'
services:
  grafana:
    image: grafana/grafana
    container_name: grafana
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"
    ports:
      - 3000:3000
    environment:
      - GF_SERVER_ROOT_URL=http://grafana.server.name
      - GF_SECURITY_ADMIN_PASSWORD=123456

其中:GF_SECURITY_ADMIN_PASSWORD=secret 指定了admin用戶的密碼爲123456

 2)運行grafana容器

cd /opt/container-monitor/grafana
docker-compose up -d

瀏覽輸入: http://172.16.101.250:3000,能夠看到grafana登陸界面,輸入admin/123456

  3) 在grafana中添加prometheus數據源

 

 ( 注意:通過屢次測試發現,name若是寫成其餘的好像不行,必須寫Prometheus才能顯示,不知道是否是一個BUG)

    4) 定製用於顯示prometheus監控數據的dashboard,Grafana 是經過 Dashboard 展現數據的,在 Dashboard 中須要定義:

  1. 展現 Prometheus 的哪些多維數據?須要給出具體的查詢語言表達式。

  2. 用什麼形式展現,好比二維線性圖,儀表圖,各類座標的含義等。

    能夠從:https://grafana.com/dashboards?dataSource=prometheus&search=docker     下載官網定製好的一些dashboard

點擊:Download JSON 能夠下載到一個   docker-prometheus-monitoring_rev7.json 文件。下面將該json導入dashboard

 

最終效果以下圖所示,分爲Host Info 和Container Performance

相關文章
相關標籤/搜索