说起当下很火的云原生,就不得不提docker和k8s,docker也是现在很多企业都要求会的技术,那么多docker容器怎么知道出没出问题呢?怎么对他们进行监控呢?Prometheus可以较好的解决这些问题,为什么不用zabbix或者其他监控系统呢?至于为什么请往下看
Prometheus是一款开源的监控系统,他的诞生的灵感来自于Google的监控系统Brogmon,这里也说一下我们熟悉的kubernetes(k8s)也是从Google的Brog系统演变而来,早在2012年开始Google就在Soundcloud以开源软件的形式进行研发了,并在2015年对外发布早期版本,在2016年的5月继kubernetes之后第二个加入CNCF基金会的项目,在同年六月发布了1.0版本
metric数据指的是从服务端上获取到的指标数据的统称。metrics指标为时间序列数据,这些数据按相同的时序,以时间维度来存储连续数据的集合。
metric的时序数据分为gauge(仪表盘),counter(计数器),histogram(直方图)。
说一下下图的主要组件:
Prometheus为什么适合监控容器
首先Prometheus的可扩展性很强,从上面的架构图也可以看出来,Prometheus拥有很多的组件,而Prometheus的原理是通过HTTP协议进行周期性抓取被监控组件的状态,这样就表示只要组件提供HTTP接口就可以接入监控系统,其次Prometheus是pull模型采集的也就是Prometheus服务端主动取拉取数据,各个被监控的源只需要将自身指标暴露在本地http端口即可,这样就可以通过访问接口来采集指标。
环境说明:
系统:centos7
[root@prometheus ~]# mkdir /prometheus/
[root@prometheus ~]# docker run -d --name test -p 9090:9090 prom/prometheus
[root@prometheus ~]# docker cp test:/etc/prometheus/prometheus.yml /prometheus
[root@prometheus ~]# docker stop test
[root@prometheus ~]# docker rm test
// 输入IP:9090,看到如下页面说明成功,因为没有添加监控项所以这里没有内容
// 所有主机都要部署
[root@prometheus ~]# yum -y install yum-utils
[root@prometheus ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@prometheus ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
[root@prometheus ~]# yum -y install docker-ce
[root@prometheus ~]# systemctl enable --now docker.service
// 全部主机都要做
docker run -d -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
--web.listen-address 9100 //默认使用9100端口号
--path.rootfs:node-exporter使用/host前缀访问主机文件系统
--collector.filesystem.ignored-mount-points:忽略访问的文件
--net=host:代替端口映射,如容器有80,需要访问的话就需要加-p选项,不想的话加--net=host就可以直接访问80
浏览器IP:9100/metrics
// 所有主机都要做
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:8080 --detach=true --name=cadvisor --net=host google/cadvisor
--detach=true 是否在后台运行容器true为后台运行,false反之
浏览器IP:8080/containers
[root@prometheus prometheus]# tail -9 prometheus.yml
- targets: ["localhost:9090","localhost:9100","localhost:8080"]
- job_name: "node1"
static_configs:
- targets: ["192.168.182.131:9100","192.168.182.131:8080"]
- job_name: "node2"
static_configs:
- targets: ["192.168.182.132:9100","192.168.182.132:8080"]
// 重启服务
[root@prometheus prometheus]# docker restart Prometheus
浏览器IP:9090
// 看到如下界面说明监控成功
[root@prometheus ~]# mkdir /grafana/
[root@prometheus ~]# chmod 777 -R /grafana/ //这一步很重要
docker run -d -p 3000:3000 --name grafana -v /grafana/:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=passwd" grafana/grafana
在docker-monitor目录下新增grafana目录,在里面创建文件config.monitoring,内容如下
GF_SECURITY_ADMIN_PASSWORD=admin #grafana管理界面的登录用户密码,用户名是admin
GF_USERS_ALLOW_SIGN_UP=false #grafana管理界面是否允许注册,默认不允许
浏览器IP:3000,用户名admin,密码passwd
// 添加数据源
// 点击添加
// 选择Prometheus数据源
// 连接Prometheus
// 点击save&test,出现绿色的勾说明添加成功
// 使用grafana提供的模板来进行优化界面
模板下载地址
可通过下面两种方式获得模板
有两种方式使用模板
1 通过模板的id号进行导入
2将模板下载到本地再进行导入
// 导入模板
// 通过id添加模板,点击load
// 最后呈现的效果
// 因为我们要看的是容器的信息,所以找一个和容器相关的模板导入。
//通过关键字搜索相关模板
// 可以看到这里有两个容器的运行状态
// 可以选择查看不同节点上的容器,上图是node1节点上的容器,下图是Prometheus上的容器
启动AlerManager来接受Prometheus发送的报警信息,并执行各种方式报警。
流程如下:
告警等级
[root@prometheus ~]# mkdir /alertmanager //创建一个数据目录
[root@prometheus ~]# docker run -d --name test -p 9093:9093 prom/alertmanager //创建容器用来获得alertmanager.yml配置文件
[root@prometheus ~]# docker cp test:/etc/alertmanager/alertmanager.yml /alertmanager/
// 浏览器IP:9093,看到下面的页面表示成功,但是因为没有设置任何报警信息所以没有数据
这里说一下配置文件中几个重要的参数
// 开启POP3/SMTP服务并生成授权码
// 生成授权码
[root@prometheus ~]# docker stop test
[root@prometheus ~]# docker rm test
[root@prometheus ~]# docker run -d -p 9093:9093 --name alertmanager -v /alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager
// alertmanager.yml文件内容
修改Prometheus.yml的alerting部分,让alertmanager能与Prometheus通信
[root@prometheus rules]# pwd
/prometheus/rules
[root@prometheus rules]# ls
node-up.rules
[root@prometheus rules]# vim node-up.rules
groups:
- name: node-up
rules:
- alert: node-up
expr: up{job="prometheus"} == 0 //这个是在Prometheus.yml里面设置的job_name
for: 15s
labels:
severity: 1
team: node
annotations:
summary: "{{ $labels.instance }} 停止运行超过15s啦!"
[root@prometheus prometheus]# pwd
/prometheus
[root@prometheus prometheus]# ls
prometheus.yml rules
[root@prometheus prometheus]# head -17 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.182.130:9093
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "/usr/local/prometheus/rules/*.rules"
rule_files为容器内路径,需要将本地node-up.rules文件挂载到容器指定的路径。
// 随便关闭一个服务模拟故障
[root@prometheus prometheus]# docker stop node-exporter
node-exporter
创建alertmanager的模板文件
[root@prometheus alertmanager]# pwd
/alertmanager
[root@prometheus alertmanager]# mkdir template
[root@prometheus alertmanager]# cd template/
[root@prometheus template]# vim email.tmpl
{{ define "email.from" }}572635840@qq.com{{ end }}
{{ define "email.to" }}572635840@qq.com{{ end }}
{{ define "email.to.html" }}
{{ range .Alerts }}
=========start==========
告警程序: prometheus_alert
告警级别: {{ .Labels.severity }} 级
告警类型: {{ .Labels.alertname }}
故障主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
=========end==========
{{ end }}
{{ end }}
// 修改alertmanager文件
[root@prometheus alertmanager]# docker stop alertmanager
[root@prometheus alertmanager]# docker rm alertmanager
[root@prometheus alertmanager]# docker run -d --name alertmanager -p 9093:9093 -v /alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /alertmanager/template:/etc/alertmanager-tmpl prom/alertmanager
// 重启测试alertmanager
[root@prometheus alertmanager]# docker restart alertmanager