容器化监控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架构

image-20240911085025512

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命令

# 启动node-exporter
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,可以看到监控的其他客户端

image-20240911093304356

image-20240911163131170

收集到的数据指标是Key:value的格式

数据查询操作

image-20240911163606439

image-20240911163702757

如果只想看101的数据 : 就用{ }花括号里面写想要查看的字段 花括号里面的字段相当于过滤

image-20240911170150515

4、访问cadvisor页面 10.0.0.101:8080

image-20240911165134739

image-20240911165240850

image-20240911165311636

5、grafana模版出图

登录自己搭建的grafana :10.0.0.76:3000/

image-20240911160356809

进入grafana官网:https://grafana.com/ 进入官网首页,来到首页的页面最底下

image-20240911170835247

image-20240911171206521

选择一个自己想要的模版点击进去,自动他的ID,之后添加

image-20240911171354848

①、回到自己搭建的grafana

image-20240911171850344

②、找到prometheus的图标,双击进去,添加prometheus的URL,然后点击最下面的save & test 可看到Successfully添加成功的信息

image-20240911172651580

③测试: 再点击左边的数据源栏 可看到添加成功,之后添加模版

image-20240911173117487

image-20240911173228995

image-20240911173445043

模版里面可以点击进去看看,有的有数据,有的没有数据

image-20240911173624110

其实可以把刚刚添加的3个模版删除,因为不是我需要的,接下来会添加需要的模版

④、添加cAdcisor的模版

image-20240911174519155

8919 11277 这两个ID比较常用

image-20240911174945815

image-20240911175011030

image-20240911175141393

可以看到数据,但是目前默认是看101的数据,项目和主机都是空的,想看指定主机的数据没有,所以需要改模版

image-20240911175238626

6、修改模版

需要使用prometheus查询数据的语句 :promeQL

image-20240911181443564

image-20240911181734944

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里面去查一下是否有这个值

image-20240911192227950

可以看到这个版本的project项目名叫job,所以project应该改成job

image-20240911194340683

把project修改成job成功

image-20240911194429236

1
2
2、server
label_values(container_last_seen{project=~"$project"}, server)

这里面只要instance和job,没有server,所以把server删除

image-20240911194700416

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里面的变量

image-20240911200218534

image-20240911195320041

修改完成,保存

image-20240911195411815

image-20240911200333043

查看没有数据,添加数据

image-20240911200507280

image-20240911200625330

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!=""})

可以获取到数据

image-20240911200945018

image-20240911201650404

1
2
3
4
因为prometheus里面查出来的没有project标签,只有job标签


container_last_seen{id="/", instance="10.0.0.101:8080", job="cadvisor"}

目前只改了一个数据,但是不可能一个一个去修改,所以需要批量修改

image-20240911201813116

这个json文件就是模版,但往下看,这个json文件里面还是project,可以复制出来,批量替换成job

image-20240911201937730

image-20240911202129508

把替换后的json文件粘贴

image-20240911202309412

保存之后,重新进入,查看数据

image-20240911202434264

image-20240911202449993

⑤、添加node_exporter的模版

在官网搜索模版ID

image-20240911215221833

image-20240911215237958

回到自己安装的grafana,添加模版

image-20240911215341094

image-20240911215432195

image-20240911215458213

数据生成

image-20240911215516206

image-20240911215800737

image-20240911215816266

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"}

image-20240911215845909

想要展示数据就把,fstype!="rootfs"删掉

image-20240911220402516

image-20240911220531172

再查看没数据的框,查看没数据的原因,并修改

image-20240911220656392

无法查询数据,CPU没有等待时间,查询不出数据,所以没有数据没关系

image-20240911221251157

1
irate(node_pressure_cpu_waiting_seconds_total{instance="$node",job="$job"}[$__rate_interval])

再继续排查下一个没有数据的原因,并修改

image-20240911221454957

image-20240911221632432

image-20240911222204013

1
2
3
4
5
没有数据就去prometheus里面查一下,看看是否有相关字段

比较好用的模版有
11277
8919

8919的模版图

image-20240911224138667