Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警

文章目录

一、Prometheus 监控容器

prometheus是一款面向云原生应用程序的开源监控工具,作为第一个从CNCF毕业的监控工具而言,开发者对于Prometheus寄予了巨大的希望。 在Kubernetes社区中,很多人认为Prometheus是容器场景中监控的第一方案,成为容器监控标准的制定者。

二、什么是 cAdvisor

cAdvisor (Container Advisor) 是 Google 开源的一个容器监控工具,可用于对容器资源的使用情况和性能进行监控。它以守护进程方式运行,用于收集、聚合、处理和导出正在运行容器的有关信息。具体来说,该组件对每个容器都会记录其资源隔离参数、历史资源使用情况、完整历史资源使用情况的直方图和网络统计信息。

cAdvisor 本身就对 Docker 容器支持,并且还对其它类型的容器尽可能的提供支持,力求兼容与适配所有类型的容器。

由以上介绍我们可以知道,cAdvisor 是用于监控容器引擎的。由于其监控的实用性,Kubernetes 已经默认将其与 Kubelet 融合,所以我们无需再单独部署 cAdvisor 组件来暴露节点中容器运行的信息,直接使用 Kubelet 组件提供的指标采集地址即可。

Cadvisor 进行收集,通过 Prometheus 作为数据源,利用 Grafana 进行展示。

环境准备:

主机名 IP 所需软件
master 192.168.91.138 docker-ce、prometheus、grafan
node1 192.168.91.137 docker-ce、node_exporter

Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警

三、node1 节点部署cAdvisor

在client主机上拉取google/cadvisor官方镜像

[root@node1 ~]# docker pull google/cadvisor

运行cadvisor容器

[root@node1 ~]# docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
google/cadvisor

aaaadb87f18c11448e7be4a77b329372d5b90e300687f21709badacb384bfdb7

[root@node1 ~]# docker images | grep cadvisor
google/cadvisor                                      latest    eb1210707573   3 years ago    69.6MB

页面访问
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
像下翻看
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
查看所在节点的容器详细信息
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
可以看见容器名、docker版本、使用系统、节点主机名、容器根目录等信息
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警

在 master 主机上配置prometheus.yml文件
使prometheus能够接受到cadvisor采集的信息从而实现对cadvisor所处主机的监控

[root@master ~]# vim /opt/prometheus.yml 
  - job_name: "prometheus"

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

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: amu_node1
    static_configs:
      - targets: ["192.168.91.137:9100"]

  - job_name: "cadvisor"			// 添加任务名字
    static_configs:
      - targets: ["192.168.91.137:8080"]	// 添加访问IP

// 重启prometheus容器
[root@master ~]# docker restart prometheus
prometheus

[root@master ~]# docker ps | grep prometheus
d8b1bac0d5ff   prom/prometheus                                     "/bin/prometheus --c…"   29 hours ago     Up 9 seconds    0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   prometheus

网页访问
查看监控情况
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警

启动grafana容器

[root@master ~]# docker images | grep gra
grafana/grafana                                                   latest    9b957e098315   2 weeks ago    275MB

[root@master ~]# docker run -dit --name grafan -p 3000:3000 grafana/grafana
af898dfa5134c1a27784e19d8813a1293719193ecded58f7af0fef64be94a412

[root@master ~]# docker ps | grep grafan
af898dfa5134   grafana/grafana                                     "/run.sh"                13 seconds ago   Up 12 seconds   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   grafan

Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警

添加访问地址
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
添加 IP 然后保存
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警

导入模板
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警

Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
选择数据源
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警

四、node-exporter监控容器

在 node1 主机上拉取 prom/node-exporter镜像

[root@node1 ~]# docker pull prom/node-exporter

[root@node1 ~]# docker images | grep prom/node-exporter
prom/node-exporter                                   latest    1dbe0e931976   3 weeks ago    20.9MB

运行 node-exporter容器

[root@node1 ~]# docker run --name node-exporter -d -p 9100:9100 prom/node-exporter

页面访问
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
接下来,我们需要将 node-exporter 信息配置到 Prometheus 中,来让 Prometheus 定期获取 exporter 采集的信息,那么就需要在 master 修改 prometheus.yml 配置文件,在 scrape_configs 下新增一个 job,配置如下:

[root@master ~]# vim /opt/prometheus.yml
  - job_name: "prometheus"

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

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: amu_node1		// 添加此处
    static_configs:
      - targets: ["192.168.91.137:9100"]	// 添加访问 IP

  - job_name: "cadvisor"
    static_configs:
      - targets: ["192.168.91.137:8080"]


// 重启prometheus容器
[root@master ~]# docker restart prometheus
prometheus

// 查看prometheus容器状态
[root@master ~]# docker ps | grep prometheus
d8b1bac0d5ff   prom/prometheus                                     "/bin/prometheus --c…"   30 hours ago     Up 24 minutes   0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   prometheus

页面访问
.查看监控节点情况
Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警

在 node1主机上部署AlertManager
拉取 prom/alertmanager官方镜像

[root@node1 ~]# docker pull prom/alertmanager

[root@node1 ~]# docker images | grep alertmanager
prom/alertmanager                                    latest    ba2b418f427c   4 months ago   57.5MB

在 node1节点主机上运行 alertmanager 容器并进行端口映射

// 运行容器
[root@node1 ~]# docker run --name alertmanager -d -p 9093:9093 prom/alertmanager
5e1e3d285084f64d44284497e2aeca1789d81b2b9b88b4cae8962f3d8266897e

[root@node1 ~]# docker ps | grep alertmanager
5e1e3d285084   prom/alertmanager                                   "/bin/alertmanager -…"   19 seconds ago   Up 17 seconds   0.0.0.0:9093->9093/tcp, :::9093->9093/tcp   alertmanager

页面访问
AlertManager 默认启动的端口为 9093,启动完成后,浏览器访问 http://:9093 可以看到默认提供的 UI 页面,不过现在是没有任何告警信息的,因为我们还没有配置报警规则来触发报警。

Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警

五、AlertManager 配置邮件告警

AlertManager 默认配置文件为 alertmanager.yml,在容器内路径为 /etc/alertmanager/alertmanager.yml,默认配置如下:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

简单介绍一下主要配置的作用:

  • global: 全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
  • route: 用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配。
  • receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
  • inhibit_rules: 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。

那么,我们就来配置一下使用 Email 方式通知报警信息,这里以 网易 邮箱为例,配置如下:

[root@node1 ~]# vi alertmanager.yml
global:
  resolve_timeout: 6m
  smtp_from: 'amuxc159@163.com'
  smtp_smarthost: 'smtp.163.com:465'
  smtp_auth_username: 'amuxc159@163.com'
  smtp_auth_password: 'AMUXINGCHEN'
  smtp_require_tls: false
  smtp_hello: 'qq.com'
route:
  group_by: ['alertname']
  group_wait: 6s
  group_interval: 6s
  repeat_interval: 6m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: '2781551316@qq.com'
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
  • smtp_smarthost: 这里为 QQ 邮箱 SMTP 服务地址,官方地址为 smtp.qq.com 端口为 465 或 587,同时要设置开启 POP3/SMTP 服务。
  • smtp_auth_password: 这里为第三方登录 QQ 邮箱的授权码,非 QQ 账户登录密码,否则会报错,获取方式在 QQ 邮箱服务端设置开启 POP3/SMTP 服务时会提示。
  • smtp_require_tls: 是否使用 tls,根据环境不同,来选择开启和关闭。如果提示报错 email.loginAuth failed: 530 Must issue a STARTTLS command first,那么就需要设置为 true。着重说明一下,如果开启了 tls,提示报错 starttls failed: x509: certificate signed by unknown authority,需要在 email_configs 下配置 - - insecure_skip_verify: true 来跳过 tls 验证。

创建alertmanager容器,将配置文件 copy 到 node1 主机上

[root@node1 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml /root/alertmanager.yml

[root@node1 ~]# mkdir prometheus
[root@node1 ~]# mv alertmanager.yml prometheus
[root@node1 ~]# cd prometheus
[root@node1 prometheus]# ls
alertmanager.yml

修改 AlertManager 启动命令,将本地 alertmanager.yml 文件挂载到容器内指定位置。

[root@node1 ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/prometheus/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager
3b32978a4d39bae1a2a946802551b70b8e05b04ae2ed01d5f55795170f980b9a

[root@node1 ~]# docker ps | grep alertmanager
3b32978a4d39   prom/alertmanager                                   "/bin/alertmanager -…"   26 seconds ago   Up 24 seconds   0.0.0.0:9093->9093/tcp, :::9093->9093/tcp   alertmanager

Prometheus 配置 AlertManager 告警规则(master端)
接下来,我们需要在 Prometheus 配置 AlertManager 服务地址以及告警规则,新建报警规则文件 node-up.rules 如下:

$ mkdir -p /opt/prometheus/rules && cd /opt/prometheus/rules/
$ vim node-up.rules
groups:
- name: node-up
  rules:
  - alert: node-up
    expr: up{job="node-exporter"} == 0
    for: 15s
    labels:
      severity: 1
      team: node
    annotations:
      summary: "192.168.91.137 已停止运行超过 15s!"

说明一下:该 rules 目的是监测 node 是否存活,expr 为 PromQL 表达式验证特定节点 job=“node-exporter” 是否活着,for 表示报警状态为 Pending 后等待 15s 变成 Firing 状态,一旦变成 Firing 状态则将报警发送到 AlertManager。

然后,修改 prometheus.yml 配置文件,添加 rules 规则文件。

[root@master ~]# vim /opt/prometheus.yml 
# 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.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 192.168.91.137:9093		// 修改此行
          
rule_files:							// 添加两行
  - "/usr/local/prometheus/rules/*.rules"

注意: 这里 rule_files 为容器内路径,需要将本地 node-up.rules 文件挂载到容器内指定路径,修改 Prometheus 启动命令如下,并重启服务。

[root@master rules]# docker run --name prometheus -d -p 9090:9090 \
> -v /opt/prometheus.yml:/etc/prometheus/prometheus.yml:ro \
> -v /root/prometheus/rules/:/usr/local/prometheus/rules/ \
> prom/prometheus
f776b1859f86f1991c314333a6256c8a8e0da426511285e9b3a41ebe1207b48c

// 服务异常无法启动
[root@master rules]# docker ps -a| grep prometheus
f776b1859f86   prom/prometheus                                     "/bin/prometheus --c…"   45 seconds ago   Exited (2) 44 seconds ago                                               prometheus

Prometheus容器化详细部署请点击这里:Prometheus容器化部署

上一篇:监控prometheus+alertmanager+PrometheusAlert


下一篇:Photoshop打造盛有红酒的玻璃酒杯