搭建容器监控平台
本节,我们上手搭建容器监控平台。我们监控 Docker 主机上运行的容器状态,并监控 cAdvisor 容器,如果此容器关闭,会触发邮件告警。
1. 实战
1.1. 新建目录
创建如下目录结构。

1.2 编写 prometheus 的配置文件 prometheus.yml
global:
scrape_interval: 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
smtp_smarthost: 'smtp.qq.com:587'
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
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'aaa@xxx.com'
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:
cpus: '0.20'
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
使用admin
和 123456
密码(GF_SECURITY_ADMIN_PASSWORD
指定)登录。
登录成功后,配置数据源。

选择 Prometheus 数据源:

填写 Prometheus 地址:

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

选择 Prometheus 数据源:

import 导入即可看到容器监控页面。
2. 告警测试
几秒后刷新页面,发现告警进入 Pending 暂挂状态:

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

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