章节索引 :

搭建容器监控平台

本节,我们上手搭建容器监控平台。我们监控 Docker 主机上运行的容器状态,并监控 cAdvisor 容器,如果此容器关闭,会触发邮件告警。

1. 实战

1.1. 新建目录

创建如下目录结构。
图片描述

1.2 编写 prometheus 的配置文件 prometheus.yml

# 全局配置
global:
    # 每5s收集一次数据
    scrape_interval: 5s
    # 每5s执行一次告警规则检测
    evaluation_interval: 5s
    # 标记标签
    external_labels:
        monitor: 'monitor'
# 告警配置
alerting:
    alertmanagers:
        - static_configs:
            - targets: ['alertmanager:9093']
# 指定规则配置文件
rule_files:
    - rules/*.yml
# 数据抓取配置
scrape_configs:
    - job_name: 'prometheus'
      static_configs:
          - targets: ['prometheus:9090']
    - job_name: 'cadvisor'
      static_configs:
          - targets: ['cadvisor:8080']

1.3 编写 Prometheus 的告警规则 rule_1.yml

groups:
    - name: rule-1
      rules:
          - alert: "服务运行告警"
            expr: up{job="cadvisor"} < 1
            # 告警等待时间
            for: 1m
            labels:
                severity: warning
            annotations:
                summary: "服务名: {{$labels.alertname}}"
                description: "容器cadvisor已停止"

1.4 编辑 alertmanager 配置文件 config.yml

alertmanager 触发告警后会发送邮件,我们需要先配置邮箱,这里以 QQ 邮箱为例。
登录邮箱,选择设置:
图片描述
获取邮箱授权码:
图片描述

Tips:
25 端口用于转发邮件,没有考虑认证、加密等问题。587 端口专门被设计用来提交邮件,传输可以加密。这里我们使用 587 端口。

接下来编辑 alertmanager 配置文件 config.yml:

# 全局配置项
 global:
   resolve_timeout: 5m  #处理超时时间,默认为5min
   smtp_smarthost: 'smtp.qq.com:587'  # 邮箱smtp服务器代理,这里以qq邮箱为例
   smtp_from: 'xxx@qq.com'  # 发送邮箱名称
   smtp_auth_username: 'xxx@qq.com'  # 邮箱账号
   smtp_auth_password: 'xxxxxxxxxxxx'  # 邮箱授权码

# 定义模板信息
 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: 'aaa@xxx.com'  # 接收警报的email配置
       html: '{{ template "alert.html" . }}' # 设定邮箱的内容模板
       headers: { Subject: "[WARN] 报警邮件"} # 接收邮件的标题

1.5 编辑告警邮件模板 alert.html

{{ define "alert.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 }}

1.6 编写 DockerCompose.yml

version: "3.8"
services:
    cAdvisor:
      image: google/cadvisor:v0.33.0
      container_name: cadvisor
      restart: always
      deploy:
          resources:
              limits:
                  cpus: '0.20'
                  memory: 500M
      networks:
          - monitor
      volumes:
          - /:/rootfs:ro
          - /var/run:/var/run:ro
          - /sys:/sys:ro
          - /var/lib/docker/:/var/lib/docker:ro
          - /dev/disk/:/dev/disk:ro

    Prometheus:
      image: prom/prometheus:v2.19.2
      container_name: prometheus
      restart: always
      deploy:
          resources:
              limits:
                  cpus: '0.20'
                  memory: 500M
      volumes:
          - ./prometheus/conf:/etc/prometheus:ro
      networks:
          - monitor
      depends_on:
          - cAdvisor
      ports:
          - "9090:9090"


    alertmanager:
      image: prom/alertmanager:v0.21.0
      container_name: alertmanager
      restart: always
      deploy:
          resources:
              limits:
                  cpus: '0.20'
                  memory: 500M
      networks:
          - monitor
      ports:
          - "9093:9093"
      depends_on:
          - Prometheus
      volumes:
          - ./alertmanager/conf/config.yml:/etc/alertmanager/config.yml
          - ./alertmanager/templates:/etc/alertmanager/templates
      command:
          - '--config.file=/etc/alertmanager/config.yml'
          - '--storage.path=/alertmanager'
          - '--log.level=info'

    Grafana:
      image: grafana/grafana:7.0.5
      container_name: grafana
      restart: always
      deploy:
          resources:
              limits:
                  cpus: '0.20'
                  memory: 500M
      networks:
          - monitor
      environment:
          - GF_SECURITY_ADMIN_PASSWORD=123456
      depends_on:
          - Prometheus
      ports:
          - "3000:3000"

networks:
  monitor:
    name: monitornet
    driver: bridge

在 compose 配置文件中,我们配置了容器的 cpu 和内存限制:

...
      deploy:
          resources:
              limits:
                  # cpu最多使用20%
                  cpus: '0.20'
                  # 内存最多使用500M
                  memory: 500M
...

需要使用--compatibility兼容模式使它生效。

# 启动
docker-compose --compatibility up -d
# 移除
docker-compose --compatibility down
# 重启
docker-compose --compatibility restart

1.7 配置 Grafana Dashboard 页

docker-compose --compatibility up -d

启动之后,使用浏览器打开 http://127.0.0.1:3000, 即可访问 grafana Web 页面。

使用admin123456 密码(GF_SECURITY_ADMIN_PASSWORD指定)登录。

登录成功后,配置数据源。
图片描述

选择 Prometheus 数据源:
图片描述

填写 Prometheus 地址:
图片描述

保存配置:

图片描述

选择导入 Dashboard:
图片描述
打开Grafana的官方Dashboard仓库,找一个合适的样式,下载下来。这里我们选择了这个
图片描述

回到 Grafana 管理页面,将下载的 json 文件导入:

图片描述
选择 Prometheus 数据源:

图片描述
import 导入即可看到容器监控页面。

图片描述

2. 告警测试

打开 prometheus web UI 页面 http://127.0.0.1:9090,点击 alert 标签页,查看监控告警状态:
图片描述
我们将监控的容器 cadvisor 关掉。

docker stop cadvisor

几秒后刷新页面,发现告警进入 Pending 暂挂状态:
图片描述

一分钟后(rule_1.yml 中 for = 1m 配置)告警进入 firing 状态。
图片描述

查收告警邮件:

图片描述

修复故障后恢复正常:

docker start cadvisor

3. 小结

本节构建了一个具有邮件告警功能的容器监控平台,由于篇幅有限,仅能在配置文件中,对一些基本常用的配置进行解释,还有其他更多更全的强大配置功能,需要读者自行参考各个服务的官方文档。