搭建容器监控平台
本节,我们上手搭建容器监控平台。我们监控 Docker 主机上运行的容器状态,并监控 cAdvisor 容器,如果此容器,会触发告警。
创建如下目录结构。
# 全局配置@H__34@
global@H__34@:@H__34@
# 每5s收集一据@H__34@
scrape_interval@H__34@:@H__34@ 5s
# 每5s执行一次告警规则检测@H__34@
evaluation_interval@H__34@:@H__34@ 5s
# @H__34@
external_labels@H__34@:@H__34@
monitor@H__34@:@H__34@ 'monitor'@H__34@
# 告警配置@H__34@
alerting@H__34@:@H__34@
alertmanagers@H__34@:@H__34@
-@H__34@ static_cons@H__34@:@H__34@
-@H__34@ targets@H__34@:@H__34@ [@H__34@'alertmanager:9093'@H__34@]@H__34@
# 指定规则@R__1970@@H__34@
rule_files@H__34@:@H__34@
-@H__34@ rules/*.yml
# 数据抓取配置@H__34@
scrape_cons@H__34@:@H__34@
-@H__34@ job_name@H__34@:@H__34@ 'prometheus'@H__34@
static_cons@H__34@:@H__34@
-@H__34@ targets@H__34@:@H__34@ [@H__34@'prometheus:9090'@H__34@]@H__34@
-@H__34@ job_name@H__34@:@H__34@ 'cadvisor'@H__34@
static_cons@H__34@:@H__34@
-@H__34@ targets@H__34@:@H__34@ [@H__34@'cadvisor:8080'@H__34@]@H__34@
groups@H__34@:@H__34@
-@H__34@ name@H__34@:@H__34@ rule-@H__34@
rules@H__34@:@H__34@
-@H__34@ alert@H__34@:@H__34@ "服务运行告警"@H__34@
expr@H__34@:@H__34@ up{@H__34@job="cadvisor"}@H__34@ < 1
# 告警等待时间@H__34@
for@H__34@:@H__34@ 1m
labels@H__34@:@H__34@
severity@H__34@:@H__34@ warning
annotations@H__34@:@H__34@
summary@H__34@:@H__34@ "服务名@H__34@:@H__34@ {@H__34@{@H__34@$labels.alertname}@H__34@}@H__34@"
description@H__34@:@H__34@ "容器cadvisor已停止"@H__34@
alertmanager 触发告警后会,我们需要先配置邮箱,这里以 QQ 邮箱为例。
邮箱,选择设置:
Tips:
25 端口用于转发,没有考虑认证、加密等问题。587 端口专门被设计用来提交,传输可以加密。这里我们使用 587 端口。
接下来编辑 alertmanager @R__1970@ con.yml:
# 全局配置项@H__34@
global@H__34@:@H__34@
resolve_timeout@H__34@:@H__34@ 5m #处理超时时间,认为5min@H__34@
smtp_smarthost@H__34@:@H__34@ 'smtp.qq.com:@H__34@587' # 邮箱smtp服务器代理,这里以为例@H__34@
smtp_from@H__34@:@H__34@ 'xxx@qq.com' # 发送邮箱@H__34@
smtp_auth_username@H__34@:@H__34@ 'xxx@qq.com' # 邮箱账号@H__34@
smtp_auth_password@H__34@:@H__34@ 'xxxxxxxxxxxx' # 邮箱授权码@H__34@
# 定义模板信息@H__34@
templates@H__34@:@H__34@
-@H__34@ '/etc/alertmanager/templates/*.html'@H__34@
# 定义路由树信息@H__34@
route@H__34@:@H__34@
group_by@H__34@:@H__34@ [@H__34@'alertname'@H__34@]@H__34@ # 报警分组依据@H__34@
group_wait@H__34@:@H__34@ 10s # 最初即第一次等待多久时间发送一组警报的@H__34@
group_interval@H__34@:@H__34@ 10s # 在发送新警报前的等待时间@H__34@
repeat_interval@H__34@:@H__34@ 1m # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于发送太多频繁,被smtp服务器拒绝@H__34@
receiver@H__34@:@H__34@ 'email' # 发送警报的接收者的,以下receivers name的@H__34@
# 定义警报接收者信息@H__34@
receivers@H__34@:@H__34@
-@H__34@ name@H__34@:@H__34@ 'email' # 警报@H__34@
email_cons@H__34@:@H__34@ # 邮箱配置@H__34@
-@H__34@ to@H__34@:@H__34@ 'aaa@xxx.com' # 接收警报的email配置@H__34@
html@H__34@:@H__34@ '{@H__34@{@H__34@ template "alert.html" . }@H__34@}@H__34@' # 设定邮箱的@H__34@
headers@H__34@:@H__34@ {@H__34@ Subject@H__34@:@H__34@ "[WARN] 报警"@H__34@}@H__34@ # 的@H__34@
{{ define "alert.html" }}
<@H__34@table@H__34@ border@H__34@=@H__34@"@H__34@1"@H__34@@H__34@>@H__34@@H__34@
<@H__34@tr@H__34@>@H__34@@H__34@
<@H__34@td@H__34@>@H__34@@H__34@报警项</@H__34@td@H__34@>@H__34@@H__34@
<@H__34@td@H__34@>@H__34@@H__34@实例</@H__34@td@H__34@>@H__34@@H__34@
<@H__34@td@H__34@>@H__34@@H__34@报警</@H__34@td@H__34@>@H__34@@H__34@
<@H__34@td@H__34@>@H__34@@H__34@开始时间</@H__34@td@H__34@>@H__34@@H__34@
</@H__34@tr@H__34@>@H__34@@H__34@
{{ range $i, $alert := .Alerts }}
<@H__34@tr@H__34@>@H__34@@H__34@
<@H__34@td@H__34@>@H__34@@H__34@{{ index $alert.Labels "alertname" }}</@H__34@td@H__34@>@H__34@@H__34@
<@H__34@td@H__34@>@H__34@@H__34@{{ index $alert.Labels "instance" }}</@H__34@td@H__34@>@H__34@@H__34@
<@H__34@td@H__34@>@H__34@@H__34@{{ index $alert.Annotations "description" }}</@H__34@td@H__34@>@H__34@@H__34@
<@H__34@td@H__34@>@H__34@@H__34@{{ $alert.StartsAt }}</@H__34@td@H__34@>@H__34@@H__34@
</@H__34@tr@H__34@>@H__34@@H__34@
{{ end }}
</@H__34@table@H__34@>@H__34@@H__34@
{{ end }}
version@H__34@:@H__34@ "3.8"@H__34@
services@H__34@:@H__34@
cAdvisor@H__34@:@H__34@
image@H__34@:@H__34@ google/cadvisor:@H__34@v0.33.0
container_name@H__34@:@H__34@ cadvisor
restart@H__34@:@H__34@ always
deploy@H__34@:@H__34@
resources@H__34@:@H__34@
limits@H__34@:@H__34@
s@H__34@:@H__34@ '0.20'@H__34@
memory@H__34@:@H__34@ 500M
networks@H__34@:@H__34@
-@H__34@ monitor
volumes@H__34@:@H__34@
-@H__34@ /:@H__34@/rootfs:@H__34@ro
-@H__34@ /var/run:@H__34@/var/run:@H__34@ro
-@H__34@ /sys:@H__34@/sys:@H__34@ro
-@H__34@ /var/lib/docker/:@H__34@/var/lib/docker:@H__34@ro
-@H__34@ /dev/disk/:@H__34@/dev/disk:@H__34@ro
Prometheus@H__34@:@H__34@
image@H__34@:@H__34@ prom/prometheus:@H__34@v2.19.2
container_name@H__34@:@H__34@ prometheus
restart@H__34@:@H__34@ always
deploy@H__34@:@H__34@
resources@H__34@:@H__34@
limits@H__34@:@H__34@
s@H__34@:@H__34@ '0.20'@H__34@
memory@H__34@:@H__34@ 500M
volumes@H__34@:@H__34@
-@H__34@ ./prometheus/conf:@H__34@/etc/prometheus:@H__34@ro
networks@H__34@:@H__34@
-@H__34@ monitor
depends_on@H__34@:@H__34@
-@H__34@ cAdvisor
ports@H__34@:@H__34@
-@H__34@ "9090:9090"@H__34@
alertmanager@H__34@:@H__34@
image@H__34@:@H__34@ prom/alertmanager:@H__34@v0.21.0
container_name@H__34@:@H__34@ alertmanager
restart@H__34@:@H__34@ always
deploy@H__34@:@H__34@
resources@H__34@:@H__34@
limits@H__34@:@H__34@
s@H__34@:@H__34@ '0.20'@H__34@
memory@H__34@:@H__34@ 500M
networks@H__34@:@H__34@
-@H__34@ monitor
ports@H__34@:@H__34@
-@H__34@ "9093:9093"@H__34@
depends_on@H__34@:@H__34@
-@H__34@ Prometheus
volumes@H__34@:@H__34@
-@H__34@ ./alertmanager/conf/con.yml:@H__34@/etc/alertmanager/con.yml
-@H__34@ ./alertmanager/templates:@H__34@/etc/alertmanager/templates
command@H__34@:@H__34@
-@H__34@ '--con.file=/etc/alertmanager/con.yml'@H__34@
-@H__34@ '--storage.path=/alertmanager'@H__34@
-@H__34@ '--log.level=info'@H__34@
Grafana@H__34@:@H__34@
image@H__34@:@H__34@ grafana/grafana:@H__34@7.0.5
container_name@H__34@:@H__34@ grafana
restart@H__34@:@H__34@ always
deploy@H__34@:@H__34@
resources@H__34@:@H__34@
limits@H__34@:@H__34@
s@H__34@:@H__34@ '0.20'@H__34@
memory@H__34@:@H__34@ 500M
networks@H__34@:@H__34@
-@H__34@ monitor
environment@H__34@:@H__34@
-@H__34@ GF_S_ADMIN_PASSWORD=123456
depends_on@H__34@:@H__34@
-@H__34@ Prometheus
ports@H__34@:@H__34@
-@H__34@ "3000:3000"@H__34@
networks@H__34@:@H__34@
monitor@H__34@:@H__34@
name@H__34@:@H__34@ monitornet
driver@H__34@:@H__34@ bridge
在 compose @R__1970@中,我们配置了容器的 和内存限制:
...@H__34@
deploy@H__34@:@H__34@
resources@H__34@:@H__34@
limits@H__34@:@H__34@
# 最多使用20%@H__34@
s@H__34@:@H__34@ '0.20'@H__34@
# 内存最多使用500M@H__34@
memory@H__34@:@H__34@ 500M
...@H__34@
需要使用--compatibility
兼容模式使它生效。
# 启动@H__34@
docker-@H__34@compose -@H__34@-@H__34@compatibility up -@H__34@d
# 移除@H__34@
docker-@H__34@compose -@H__34@-@H__34@compatibility down
# 重启@H__34@
docker-@H__34@compose -@H__34@-@H__34@compatibility restart
docker-compose --compatibility up -d
启动之后,使用浏览器打开 , 即可访问 grafana Web 。
使用admin
和 123456
密码(GF_S_ADMIN_PASSWORD
指定)。
成功后,。
选择 Prometheus 数据源:
填写 Prometheus 地址:
保存配置:
选择导入 Dashboard:
回到 Grafana ,将下载的 json 导入:
打开 prometheus web UI ,点击 alert 页,查看监控告警状态:
docker stop cadvisor
几秒后刷新,发现告警进入 Pending 暂挂状态:
一分钟后(rule_1.yml 中 for = 1m 配置)告警进入 firing 状态。
查收告警:
修复故障后恢复正常:
docker start cadvisor
本节构建了具有告警的容器监控平台,由于篇幅有限,仅能在@R__1970@中,对一些基本常用的配置进行解释,还有其他更多更全的强大配置,需要读者自行参考各个服务的官方文档。