容器化监控Promethues
1、Docker自带的监控命令
1 2 3 4
| [root@docker02 ~]# docker ps [root@docker02 ~]# docker top mysql80 [root@docker02 ~]# docker top jenkins [root@docker02 ~]# docker stats
|
有了上面的命令,我们就可以使用zabbix来监控docker容器了,但是问题就是, zabbix-agent 的端口,我们在宿主机上只能映射出来一个。
解决方案:
1.起多块网卡
2.每个容器装一个zabbix-server
3.修改不同容器的agent端口
4.映射容器的相关文件,然后监控宿主机上的对应文件
5.不用zabbix
2、监控软件的介绍
服务端
prometheus:类似于zabbix-server服务端,负责收集客户端监控指标(Metrics)
客户端
cAdvisor:类似 zabbix-agent 客户端,用来收集容器里面的监控指标
node_exporter:类似 zabbix-agent 客户端,用来收集宿主机的监控指标
组件
Grafana:出图工具
1、cAdvisor介绍 凯得歪热儿
1 2 3 4 5 6 7 8
| cAdvisor介绍 cAdvisor是谷歌开发的容器监控工具,cAdvisor会显示当前host资源使用情况,包括CPU、内存、网络、文件系统等。
不过cAdvisor提供的操作界面略显简陋,而且要在不同的页面之间跳转,并且只能监控一个host,不免让人质疑它的实用性,但是cAdvisor有一个亮点,就是将监控数据导出给其他第三方工具,而且它兼容很多第三方工具,所以我们把它定位成是一个 监控数据收集器 ,收集和导出是它的强项,而非展示
dokcer stats 可以查看运行的 Docker 镜像的运行状态,例如:这种方式比较原始,因为你无法通过http 的方式来获取数据,而且没有界面,数据可视化还需要做大量的工作。
由于 dokcer stats 有这些问题,所以 cadvisor 诞生了。 cadvisor 不仅可以搜集一台机器上所有运行的容器信息还提供基础查询界面和 http 接口,方便 Prometheus 进行数据抓取。
|
2、grafana介绍
grafana是一个支持多种数据源的图形展示工具
3、prometheus介绍
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| promethues官网:https://prometheus.io
prometheus是一个非常优秀的监控工具,提供了监控数据的收集、存储、处理、可视化、和告警等一系列完整的监控体系。
组件包含: Node Exporter:负责收集host硬件和操作系统数据,以容器的形式运行在所有的host上。 cAdvisor:负责收集容器数据,以容器的形式运行在所有的host上。
zabbix是在客户端配服务端的地址,所以数据能从客户端推送给服务端
prometheus数据获取的来源: 服务端配客户端的地址,prometheus-server去其他客户端拉过来的数据,只有告警是推的 设置触发器出现告警了,出发告警方式,才会推送数据
|
支持:
1、MySQL、Oracle、Postgre、es等数据库
2、zabbix、prometheus等监控系统
3、Prometheus架构
TSDB:时序数据库,和时间轴有关的
influxDB:时序数据库
4、部署Prometheus
环境准备
主机名 |
ip |
角色 |
应用 |
docker01 |
10.0.0.101 / 172.16.1.101 |
被监控端 |
cadvisor、node_exporter |
docker02 |
10.0.0.102 / 172.16.1.102 |
被监控端 |
cadvisor、node_exporter |
docker03 |
10.0.0.103 / 172.16.1.103 |
被监控端 |
cadvisor、node_exporter |
elk01 |
10.0.0.76 / 172.16.1.76 |
监控端、服务端 |
prometheus、grafana、cadvisor |
1 2 3 4 5 6 7 8 9 10 11
|
docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
-v "/:/host:相当于监控宿主机
# 启动cadvisor docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw -- volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro -p 8080:8080 -d --name=cadvisor google/cadvisor:latest
|
1、elk机器 部署docker compose
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| 1、准备工作目录 [root@elk1 ~]# mkdir prometheus && cd prometheus/
2、准备promethues配置文件 [root@elk1 prometheus]# vim prometheus.yml scrape_configs: - job_name: cadvisor scrape_interval: 5s static_configs: - targets: - 10.0.0.101:8080 - 10.0.0.102:8080 - 10.0.0.103:8080
- job_name: prometheus scrape_interval: 5s static_configs: - targets: - 10.0.0.76:9090
- job_name: node_exporter scrape_interval: 5s static_configs: - targets: - 10.0.0.101:9100 - 10.0.0.102:9100 - 10.0.0.103:9100
3、编写docker-compose [root@elk1 prometheus]# vim pro-docker-compose.yml version: '3.2' services: prometheus: image: prom/prometheus:latest container_name: prometheus ports: - 9090:9090 command: - --config.file=/etc/prometheus/prometheus.yml volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro restart: always grafana: image: grafana/grafana:latest container_name: grafana ports: - 3000:3000 restart: always cadvisor: image: google/cadvisor:latest container_name: cadvisor ports: - 8080:8080 volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker:/var/lib/docker:ro restart: always node-exporter: image: prom/node-exporter:latest container_name: node_exporter ports: - 9100:9100 restart: always
[root@elk1 promethenus]# docker-compose -f pro-docker-compose.yml up -d
|
2、docker01 02 03
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| [root@docker01 node]# mkdir node && cd node [root@docker01 node]# vim node-docker-compose.yml version: '3.2' services: node-exporter: image: prom/node-exporter:latest container_name: node_exporter ports: - 9100:9100 restart: always cadvisor: image: google/cadvisor:latest container_name: cadvisor ports: - 8080:8080 volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker:/var/lib/docker:ro restart: always [root@docker02 node]# docker-compose -f node-docker-compose.yml up
|
3、访问网页 10.0.0.76:9090,可以看到监控的其他客户端
收集到的数据指标是Key:value的格式
数据查询操作
如果只想看101的数据 : 就用{ }花括号里面写想要查看的字段 花括号里面的字段相当于过滤
4、访问cadvisor页面 10.0.0.101:8080
5、grafana模版出图
登录自己搭建的grafana :10.0.0.76:3000/
进入grafana官网:https://grafana.com/ 进入官网首页,来到首页的页面最底下
选择一个自己想要的模版点击进去,自动他的ID,之后添加
①、回到自己搭建的grafana
②、找到prometheus的图标,双击进去,添加prometheus的URL,然后点击最下面的save & test 可看到Successfully添加成功的信息
③测试: 再点击左边的数据源栏 可看到添加成功,之后添加模版
模版里面可以点击进去看看,有的有数据,有的没有数据
其实可以把刚刚添加的3个模版删除,因为不是我需要的,接下来会添加需要的模版
④、添加cAdcisor的模版
8919 11277 这两个ID比较常用
可以看到数据,但是目前默认是看101的数据,项目和主机都是空的,想看指定主机的数据没有,所以需要改模版
6、修改模版
需要使用prometheus查询数据的语句 :promeQL
1 2 3 4 5 6 7 8 9
| 1、project label_values(container_last_seen, project)
2、server label_values(container_last_seen{project=~"$project"}, server)
3、instance label_values(container_last_seen{project=~"$project",server=~"$server"}, instance)
|
1 2 3
| 1、project label_values(container_last_seen, project) 获取的是container_last_seen里面的project,去prometheus里面去查一下是否有这个值
|
可以看到这个版本的project项目名叫job,所以project应该改成job
把project修改成job成功
1 2
| 2、server label_values(container_last_seen{project=~"$project"}, server)
|
这里面只要instance和job,没有server,所以把server删除
1 2 3 4 5 6 7
| 3、instance label_values(container_last_seen{project=~"$project",server=~"$server"}, instance) server没有,不要,可以删除
label_values(container_last_seen{job=~"$project"}, instance)
$project这个表示获取project里面的变量
|
修改完成,保存
查看没有数据,添加数据
1 2 3 4
| count(container_last_seen{project=~"$project",instance=~"$instance",image!=""})
把变量和job换一下 count(container_last_seen{job=~"cadvisor",instance=~"10.0.0.101:8080",image!=""})
|
可以获取到数据
1 2 3 4
| 因为prometheus里面查出来的没有project标签,只有job标签
container_last_seen{id="/", instance="10.0.0.101:8080", job="cadvisor"}
|
目前只改了一个数据,但是不可能一个一个去修改,所以需要批量修改
这个json文件就是模版,但往下看,这个json文件里面还是project,可以复制出来,批量替换成job
把替换后的json文件粘贴
保存之后,重新进入,查看数据
⑤、添加node_exporter的模版
在官网搜索模版ID
回到自己安装的grafana,添加模版
数据生成
1 2 3 4
| node_filesystem_size_bytes{instance="$node",job="$job",mountpoint="/",fstype!="rootfs"}
想要展示数据就把,fstype!="rootfs"删掉 node_filesystem_size_bytes{instance="$node",job="$job",mountpoint="/",fstype!="rootfs"}
|
想要展示数据就把,fstype!="rootfs"删掉
再查看没数据的框,查看没数据的原因,并修改
无法查询数据,CPU没有等待时间,查询不出数据,所以没有数据没关系
1
| irate(node_pressure_cpu_waiting_seconds_total{instance="$node",job="$job"}[$__rate_interval])
|
再继续排查下一个没有数据的原因,并修改
1 2 3 4 5
| 没有数据就去prometheus里面查一下,看看是否有相关字段
比较好用的模版有 11277 8919
|
8919的模版图