1.在Docker中部署cAdvisor
如果想监控Docker容器,可以安装cAdvisor
docker run -v /:/rootfs:ro \
-v /var/run:/var/run:rw \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
-p 8080:8090 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
访问http://XXX:8090可以看container的详细信息(打开过程可能会比较慢)
2.在Docker中部署Prometheus
#先把镜像拉下来启动起来,进去把配置文件copy到宿主机
docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
sudo mkdir /home/prometheus
sudo chmod 777 /home/prometheus
sudo docker cp prometheus:/etc/prometheus/prometheus.yml /home/prometheus/prometheus.yml
docker rm -f prometheus
#这里因为prometheus启动有时候会报错,所以需要输入以下两条指令
sudo mount -o remount,rw '/sys/fs/cgroup'
sudo ln -s /sys/fs/cgroup/cpu,cpuacct /sys/fs/cgroup/cpuacct,cpu#这里先不改配置文件启动,挂载的报警触发规则文件alert.yml可以先不要
docker run -d -p 9090:9090 \
-v /home/prometheus/:/etc/prometheus/ \
##这里可以先不配置 -v /home/alertmanager/:/etc/prometheus/ \
--name prometheus --net=host --restart=always \
prom/prometheus --config.file=/etc/prometheus/prometheus.yml \
--web.enable-lifecycle#在浏览器打开http://IP:9090打开Prometheus的UI,点击status--targets这里能够查看到我们各个监控项,默认暂时只监控自己,也在graph选项通过promQL查询监控数据。#关于热加载
容器启动增加参数--web.enable-lifecycle,配置在最后,必须同时指定--config.file,发送post请求进行触发热加载: curl -XPOST localhost:9090/-/reload
解释一下prometheus.yml
cat /home/prometheus/prometheus.yml# my global config
global:scrape_interval: 15s # 多久 收集 一次数据 evaluation_interval: 15s # 多久评估一次 规则# Alertmanager相关的配置
alerting:alertmanagers:- static_configs:- targets:# - alertmanager:9093# 规则文件, 可以使用通配符
rule_files:# - "first_rules.yml"# - "second_rules.yml"# 收集数据 配置 列表
scrape_configs:# 必须配置, 自动附加的job labels, 必须唯一- job_name: 'prometheus'# metrics_path defaults to '/metrics'# scheme defaults to 'http'.# 使用job名作为label的 静态配置目录的列表 默认是http 后缀默认是/metricsstatic_configs:- targets: ['localhost:9090']
打开 http://XXXX:9090/targets 查看prometheus是否启动成功
修改prometheus.yml,添加cAdvisor监控
- job_name: cadvisor1static_configs:- targets: ['XXXX:8090'] #XXXX最好用真实的IP,不然可能会出问题
使用热部署更新curl -XPOST localhost:9090/-/reload,然后查看
3.在Docker中部署Grafana
docker run -d -p 3000:3000 --name=grafana grafana/grafana
打开Grafana控制台 http://XXXX:3000 账号密码都是admin ,需要登录两次,不知道为啥
添加prometheus数据源
然后添加模板,这里我们用网站自动获取的,需要填入id就行了,具体可以去https://grafana.com/dashboards 查看
最后效果图就出来拉
4.在Docker中部署Alertmanager
利用Alertmanager 来接受 Prometheus 发送过来的报警信息,并执行各种方式的告警。同样以 Docker 方式启动AlertManager,最简单的启动命令如下:
//随便运行一个容器,其目的就是将容器中服务的配置文件拿到本地
docker run -d --name alertmanager -p 9093:9093 prom/alertmanager
//创建本地目录并给与权限
sudo mkdir /home/alertmanager
sudo chmod 777 alertmanager/
//将docker里面的yml文件拷贝到本机目录中,便于以后修改配置
docker cp alertmanager:/etc/alertmanager/alertmanager.yml /home/alertmanager
docker rm -f alertmanager
vim /home/alertmanager/alertmanager.yml global:resolve_timeout: 5msmtp_from: 'xxx@163.com' #邮箱账号smtp_smarthost: 'smtp.163.com:25' smtp_auth_username: 'darrytao@163.com' #邮箱账号smtp_auth_password: 'xxxxxxxx' #邮箱授权码,获取方法这里不做演示,可以百度一下,很简单的smtp_hello: '163.com'smtp_require_tls: false
route:group_by: ['alertname']group_wait: 5sgroup_interval: 5srepeat_interval: 5mreceiver: 'email'
receivers:
- name: 'email'email_configs:- to: '546473731@qq.com' #触发条件时发送的邮箱地址,也就是收件人send_resolved: true
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']
上面vim保存配置可能会报个错误,Enter键确认就行了
简单说明一下配置:
- global: 全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
- route: 用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配。
- receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
- inhibit_rules: 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。
//重新启动alertmanager,挂载目录文件
docker run -d --name alertmanager -p 9093:9093 -v /home/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager
访问http://192.168.52.132:9093/#/status看看是否成功,不成功的话可能是你配置文件哪里写错了,检查一下
这里他是需要配合Prometheus使用,所以我们需要配置Prometheus的规则文件
mkdir -p /home/prometheus/rules
> sudo vim /home/prometheus/rules/node-up.rules //编写规则
groups:
- name: node-up ##自定义名称rules:- alert: node-upexpr: up{
job="prometheus"} == 0
## job的名称必须和prometheus配置文件中的 - job_name: 'prometheus'对应for: 15s ##15秒没有心跳就触发labels:severity: 1team: nodeannotations:summary: "{
{ $labels.instance }} 已停止运行超过 15s!"
> sudo vim /home/prometheus/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.52.132:9093 ####这里写上你自己的alertmanager地址端口# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:- "rules/*.rules" #######这里写上规则文件的位置,如果按我上面的来,可以不改# - "first_rules.yml"# - "second_rules.yml"# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: 'prometheus'# metrics_path defaults to '/metrics'# scheme defaults to 'http'.static_configs:- targets: ['localhost:9090','192.168.52.132:8090'] ####为了测试,我把cadvisor地址也加上去了,等会会关闭- job_name: cadvisor1static_configs:- targets: ['192.168.52.132:8090'] #XXXX最好用真实的IP,不然可能会出问题
//刷新配置
curl -X POST localhost:9090/-/reload
访问http://192.168.52.132:9090/alerts看效果
//接下来我们把cadvisor关闭,过一阵子(大于十五秒)看看效果
docker rm -f cadvisor
访问http://192.168.52.132:9090/alerts 和http://192.168.52.132:9093/#/alerts
这里触发了,所以只要邮箱没有配置错误,就应该收到邮件了。
qq邮箱的话有时候有点问题,本人是公司网络不允许,所以大家可以试试
最后特别提醒,记得关闭alertmanager哦,不然邮箱一直收到邮件…