Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

本文详细介绍Prometheus监控系统的搭建过程,包括环境配置、组件说明、Docker部署、Grafana配置及钉钉告警集成,适用于希望深入了解Prometheus监控原理与实践的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境说明:

主机名Docker版本Prometheus版本Node exporter版本cAdvisor版本Grafana版本ip地址
docker0118.09.22.9.20.18.0v0.32.0v6.1.6172.27.9.71
docker0218.09.2/0.18.0v0.32.0/172.27.9.75

ubuntu安装详见:Ubuntu16.04.5以lvm方式安装全记录
docker安装详见:Ubuntu16.04安装Docker
docker-compose安装详见:Docker Compose实践

一、Prometheus简介

    Prometheus是一套开源的系统监控报警框架,提供了监控数据搜集、存储、处理、可视化和告警一套完整的解决方案,该项目于2012年在SoundCloud上创建,拥有非常活跃的开发人员和用户社区,许多公司和组织都采用了Prometheus。作为一个独立的开源项目,Prometheus于2016年正式加入Cloud Native Computing Foundation,成为受欢迎度仅次于Kubernetes的项目。

Prometheus特点:

  • 多维数据模型,其中时间序列数据通过metric名和键值对来区分。
  • 灵活而强大的查询语句(PromQL)
  • 不依赖分布式存储,可直接在本地工作
  • 通过HTTP使用pull模式采集时间序列数据
  • 可以采用push gateway的方式把时间序列数据推送至 Prometheus server 端
  • 可以通过服务发现或者静态配置去获取监控的 targets
  • 支持多种图形和仪表盘模式

二、Prometheus架构

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

组件:
Prometheus生态圈由多个组件组成,其中许多是可选的:

  • Prometheus Server: 用于抓取和存储时间序列数据。
  • Client Library:为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。
  • Push Gateway:主要用于短期的jobs。
  • Exporters: 用于暴露已有的第三方服务的metrics给Prometheus。
  • Alertmanager: 用于处理告警。
  • 其他的支持工具。

大多数普罗米修斯组件都是用go编写的,这使得它们很容易作为静态二进制文件进行构建和部署。

工作流程:

1. Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
2. Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
3. Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
4. 在图形界面中,可视化采集数据。

三、Prometheus搭建

1. 环境说明

主机名Prometheus ServerNode ExportercAdvisorGrafana
docker01
docker02××

通过Prometheus监控docker01和docker02,其中Node Exporter用于监控host,cAdvisor用于监控容器,这两个监控软件两个节点都部署。Prometheus Server和Grafana只在docker01上部署,充当监控监控服务器。

2. 监控主机部署

2.1 docker-compose.yml配置

root@docker02:~# more docker-compose.yml 
version: '3.7'

services:
  node-exporter:
    image: prom/node-exporter:latest
    network_mode: 'host'
    container_name: node-exporter
    restart: unless-stopped
    ports:
      - '9100:9100'
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
    volumes:
      - /proc:/host/proc
      - /sys:/host/sys
      - /:/rootfs

  cadvisor:
    image: google/cadvisor:latest
    network_mode: 'host'
    container_name: cadvisor
    restart: unless-stopped
    ports:
      - '8080:8080'
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

2.2 运行docker-compose

root@docker02:~# docker-compose up -d 

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

2.3 查看Node Exporter监控数据

http://172.27.9.75:8080/metrics

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

2.4 查看cAdvisor监控数据

http://172.27.9.75:8080/metrics

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3. 监控服务器部署

3.1 prometheus.yml配置

root@docker01:~# more prometheus.yml 
global:             # 全局设置,可以被覆盖
  scrape_interval: 15s              # 抓取采样数据的时间间隔,每15秒去被监控机上采样,即数据采集频率
  evaluation_interval: 15s          # 监控数据规则的评估频率,比如设置文件系统使用率>75%发出告警则每15秒执行一次该规则,进行文件系统检查
  external_labels:              # 与外部通信时用的外部标签
    monitor: 'nodecontainer-monitor'

scrape_configs:             # 抓取配置
  - job_name: 'prometheus'              # 任务名,全局唯一
    scrape_interval: 5s             # 本任务的抓取间隔,覆盖全局配置
    static_configs:             # 静态目标配置
      # 抓取地址,路径为默认的/metrics
      - targets: ['localhost:9090','localhost:8080','localhost:9100','172.27.9.75:8080','172.27.9.75:9100']

3.2 docker-compose.yml配置

root@docker01:~# more docker-compose.yml 
version: '3.7'

services:
  prometheus:
    image: prom/prometheus:latest
    network_mode: 'host'
    container_name: prometheus
    restart: unless-stopped
    ports:
      - '9090:9090'
    volumes:
      - /root/prometheus.yml:/etc/prometheus/prometheus.yml
    depends_on:
      - cadvisor

  node-exporter:
    image: prom/node-exporter:latest
    network_mode: 'host'
    container_name: node-exporter
    restart: unless-stopped
    ports:
      - '9100:9100'
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
    volumes:
      - /proc:/host/proc
      - /sys:/host/sys
      - /:/rootfs

  cadvisor:
    image: google/cadvisor:latest
    network_mode: 'host'
    container_name: cadvisor
    restart: unless-stopped
    ports:
      - '8080:8080'
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

  grafana:
    image: grafana/grafana:latest
    network_mode: 'host'
    container_name: grafana
    restart: unless-stopped
    ports:
      - '3000:3000'
    user: '0'
    volumes:
      - ./data/grafana:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_SERVER_ROOT_URL=http://172.27.9.71:3000

grafana登陆地址为http://172.27.9.71:3000 ,密码为admin,容器grafana要以root用户执行,否则会报权限错误。

3.3 运行docker-compose

root@docker01:~# docker-compose up -d

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3.4 查看Prometheus监控数据

3.4.1 配置文件查看

http://172.27.9.71:9090/config
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3.4.2 监控信息查看

http://172.27.9.71:9090/metrics
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3.4.3 查看指定监控项

http://172.27.9.71:9090
比如查看cpu五分钟负载
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

四、Grafana配置

1. 登陆grafana

http://172.27.9.71:3000

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

2. 添加DataSource

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
选择Prometheus
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
配置DataSource

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3. Dashboards配置

3.1 下载Dashboards

下载链接:https://grafana.com/dashboards?dataSource=prometheus&category=docker
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3.2 导入 Dashboards

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
分别导入docker-monitoring_rev1.json和node-exporter-full_rev13.json用于展示container和host的监控
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

4. Grafana监控展示

4.1 容器监控展示

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

4.2 host监控展示

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

五、钉钉告警配置

1. 钉钉添加机器人

钉钉通过机器人来接收告警信息
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
选择自定义
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

添加
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
机器人名称自定义为:loong576,添加到工作通知loong576,也可以添加到群
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
复制webhook,完成机器人添加

2. Grafana新增告警项

新增告警通道DingDing
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
Name为自定义Ding-Alerts,Type选择DingDing,url为之前复制的webhook,测试正常,保存
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3. 新增告警项

本文以监控容器内存使用率为例介绍grafana如何通过钉钉机器人发送告警信息

3.1 编辑Memory Usage

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3.2 创建Alert

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3.3 Alert配置

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
当容器内存使用率大于150M时发送告警信息

3.4 验证告警配置

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3.5 保存告警配置

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

3.6 告警信息查看

Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

手机端也会同步收到告警信息
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统

至此完成钉钉告警信息的发送,当然,也可以新增dashboard,选择Graph方式自定义展示和告警项
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
Docker实践(八):Prometheus + Grafana + 钉钉搭建监控告警系统
目前Grafana只支持Graph添加报警规则,有一定局限性。
 
 
 
docker-compose和prometheus配置文件已上传github:https://github.com/loong576/prometheus.git
 
 
本文参考:
1.https://grafana.com/docs/features/datasources/prometheus/
2.https://prometheus.io/docs/introduction/overview/
3.https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq
4.https://docs.docker.com/compose/reference/overview/

转载于:https://blog.51cto.com/3241766/2394283

<think>我们正在讨论Kubernetes监控架构,特别是PrometheusGrafana和Alertmanager的连接方式和运行原理。根据引用内容,我们可以这样描述:1.**整体流程**(参考引用[1]):-各种exporter(如NodeExporter、cAdvisor)采集监控指标,并通过`/metrics`端点暴露数据。-Prometheus定期pull这些指标数据(Pull模式)。-GrafanaPrometheus获取数据并进行可视化展示。-Alertmanager负责处理告警,接收Prometheus发出的警报,经过分组、去重后发送给不同的接收器(如企业微信、Email等)。2.**Alertmanager的角色**(参考引用[2][3]):-Alertmanager是一个独立的模块,接收来自Prometheus的警报。-处理过程包括:去重、分组、路由,然后发送到正确的接收器。-支持多种告警方式,包括Email、Slack,还可以通过Webhook接入钉钉等。现在,针对用户的问题,我们需要详细说明这三个组件之间的连接方式和运行原理。###组件连接方式及运行原理####1.**Prometheus数据采集**-**部署形态**:在Kubernetes集群中,Prometheus通常以StatefulSet部署,确保有持久化存储(TSDB)[^1]。-**采集原理**:-Prometheus通过服务发现(如ServiceMonitor)自动发现exporter目标(如NodeExporter、cAdvisor)[^1]。-默认每15秒从目标的`/metrics`端点拉取一次监控数据,数据被存储到本地TSDB中。-同时,Prometheus根据配置的告警规则(`rules.yml`)定期评估指标,如果满足触发条件,就会生成一条警报并发送给Alertmanager[^2]。-**关键公式**:采集间隔为$\Deltat=15\text{s}$(默认值)[^1]。####2.**Alertmanager告警处理**-**部署形态**:Alertmanager通常以Deployment部署[^1]。-**连接方式**:Prometheus配置中需要指定Alertmanager的地址(如通过Kubernetes服务发现),通过HTTP将警报发送到Alertmanager[^2]。-**处理原理**:-Alertmanager接收到警报后,会进行以下处理:-**分组(Grouping)**:将相同标签(如`alertname=HighCPU`)的警报合并为一组,避免多个警报同时发送。-**抑制(Inhibition)**:如果某些警报已经发生,则抑制其他相关警报(如当整个集群宕机时,不发送单节点宕机警报)[^3]。-**静默(Silence)**:根据标签匹配,暂时屏蔽某些警报(如维护期间)[^3]。-处理后的警报根据路由规则发送到对应的接收器,例如:-紧急警报(severity=critical)发送到值班电话。-警告警报(severity=warning)发送到企业微信群[^2][^3]。-**告警流程示例**:-Prometheus检测到Pod状态为`CrashLoopBackOff`,生成警报。-Alertmanager收到该警报,根据标签`severity=critical`和`namespace=production`路由到生产运维团队的企业微信机器人[^2]。####3.**Grafana可视化**-**部署形态**:Grafana通常以Deployment部署[^1]。-**连接方式**:在Grafana的数据源配置中添加Prometheus的URL(如`http://prometheus-service:9090`)[^1]。-**运行原理**:-Grafana通过PromQL查询Prometheus获取指标数据(如`sum(rate(http_requests_total[5m]))`)[^1]。-利用`$__interval`变量动态调整查询精度,例如在时间范围较大时自动降低采样频率以提高性能[^1]。-仪表盘支持变量过滤(如`namespace`下拉菜单),实现动态数据筛选[^1]。-**指标计算示例**:CPU利用率公式为$\text{CPU利用率}=\frac{\text{container\_cpu\_usage}}{\text{machine\_cores}}\times100\%$。###组件间数据流向总结|组件|数据流向|通信协议|功能||------|----------|----------|------||**Exporters→Prometheus**|单向(PrometheusPull)|HTTP|采集指标||**Prometheus→Alertmanager**|单向(Prometheus主动推送)|HTTP|触发告警||**PrometheusGrafana**|双向(Grafana查询,Prometheus响应)|HTTP|数据可视化|###部署关系图(Mermaid语法)```mermaidgraphLRsubgraphKubernetes集群Exporter[Exporters]-->|暴露/metrics|PrometheusPrometheus[PrometheusServer]-->|推送警报|AlertmanagerGrafana-->|查询数据|PrometheusendAlertmanager-->|通知|企业微信Alertmanager-->|通知|EmailAlertmanager-->|通知|Slack```###常见问题解答1.**如何配置Prometheus自动发现ServiceMonitor?**在Prometheus的配置文件中启用`serviceMonitorSelector`,例如:```yamlprometheus.yaml:serviceMonitorSelector:matchLabels:release:prometheus```这样Prometheus会自动发现带有标签`release:prometheus`的ServiceMonitor对象[^1]。2.**如何设置Alertmanager的静默规则?**通过Alertmanager的WebUI或API创建静默规则,指定匹配标签(如`alertname=HighCPU`)和时间范围,该时间段内符合条件的警报将被屏蔽[^3]。3.**Grafana的`$__interval`变量如何优化查询?**`$__interval`根据仪表盘的时间范围自动调整查询步长(Step),例如当查询24小时数据时,步长自动设为1分钟,避免返回过多数据点导致性能问题[^1]。4.**如何减少Prometheus磁盘占用?**-调整TSDB保留时间(`--storage.tsdb.retention.time`)-启用数据压缩(`--storage.tsdb.retention.size`)-使用远程存储(如Thanos)长期保存历史数据[^1]。###相关问题1.Prometheus如何实现对Kubernetes资源的动态服务发现?2.如何在Alertmanager中配置基于标签的路由规则?3.Grafana如何创建多数据源仪表盘(如同时展示MySQL和Prometheus数据)?4.如何利用Prometheus的recordingrules提升查询效率?5.怎样通过自定义exporter暴露应用特定指标?>注:以上回答基于主流实现方案,具体部署细节可能因版本而异。部署实例可参考引用[2]中的Docker集成方案[^2]。[^1]:主流监控方案流程说明,包括exporter采集、Prometheus拉取和Grafana展示[1]。[^2]:Alertmanager的核心功能与告警处理逻辑[2][3]。[^3]:Alertmanager的告警路由和静默机制详解[3]。</think> ### Kubernetes 监控组件连接方式与运行原理 #### **一、组件间数据流架构** ```mermaid graph LR subgraph K8s集群 A[Exporter]-->|暴露/metrics| B[Prometheus] end B-->|推送告警| C[Alertmanager] B-->|提供数据| D[Grafana] C-->|发送通知| E[邮件/企业微信/Slack] D-->|可视化展示| F[监控仪表盘] ``` #### **二、组件连接细节与原理 1. **Prometheus 服务器部署** - **采集机制**: - 通过 `ServiceMonitor` 自动发现监控目标(Exporter/Kube组件)[^1] - 每 **15秒** 主动拉取(Pull)目标的 `/metrics` 端点数据 - 存储到本地 **TSDB**(时间序列数据库) - **告警触发**: ```yaml # 示例告警规则 rules: - alert: NodeDown expr: up{job="kubelet"} == 0 # PromQL表达式 for: 5m ``` 当规则条件$(\text{up}\{job="kubelet"\} == 0)$持续5分钟时,生成告警并推送至Alertmanager[^2] 2. **Grafana 可视化定制** - **数据连接**: - 配置 Prometheus 为数据源:`http://prometheus:9090` - 使用 **PromQL** 进行查询: $$ \text{CPU使用率} = \frac{\text{sum(rate(node_cpu_seconds_total[5m]))}}{\text{count(node_cpu_seconds_total)}} \times 100 $$ - **动态变量**: - `$__interval` 自动优化查询时间粒度[^1] - 支持按命名空间(`namespace`)、节点(`node`)等维度过滤 3. **Alertmanager 告警处理** - **告警流程**: ```mermaid graph TB A[Prometheus告警] --> B[分组Grouping] B --> C[去重Deduplicating] C --> D[静默Silencing] D --> E[路由Routing] E --> F{接收器} F --> G[邮件] F --> H[企业微信] ``` - **关键配置**: - **路由规则**(基于标签路由): ```yaml routes: - receiver: 'critical-team' match: severity: critical ``` - **企业微信集成**: ```yaml receivers: - name: 'wechat-alert' wechat_configs: - api_secret: $WECHAT_KEY corp_id: $CORP_ID ```[^2][^3] #### **三、组件协作时序** ```mermaid sequenceDiagram participant Exporter participant Prometheus participant Alertmanager participant Grafana Exporter->>Prometheus: 暴露/metrics (HTTP) loop 每15秒 Prometheus->>Exporter: GET /metrics Exporter-->>Prometheus: 返回指标数据 end Prometheus->>Prometheus: 规则评估 alt 触发告警 Prometheus->>Alertmanager: POST /alerts (HTTP) Alertmanager->>Alertmanager: 分组/去重 Alertmanager->>外部系统: 发送告警通知 end Grafana->>Prometheus: PromQL查询 Prometheus-->>Grafana: 返回指标数据 ``` #### **四、性能优化建议** 1. **TSDB压缩**: - 启用 `--storage.tsdb.retention.time=30d` 限制存储周期 - 使用 `--storage.tsdb.wal-compression` 减少磁盘占用[^1] 2. **查询优化**: - 使用 `recording_rules` 预计算复杂查询: ``` groups: - name: cpu_usage_rules rules: - record: instance:node_cpu:ratio expr: | sum(rate(node_cpu_seconds_total[5m])) / count(node_cpu_seconds_total) ``` ### 相关问题 1. 如何在 Kubernetes 中配置 Prometheus 的持久化存储? 2. Grafana 如何实现基于角色的仪表盘权限控制? 3. Alertmanager 如何实现告警分级路由(如开发/生产环境分离)? 4. 如何利用 Prometheus 的 `remote_write` 集成长期存储方案? 5. 怎样验证 Exporter 暴露的指标格式是否符合 Prometheus 规范? [^1]: 主流监控方案流程说明 [1] [^2]: Alertmanager 的企业微信集成方式 [2] [^3]: Alertmanager 的告警路由处理逻辑 [3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值