0%

prometheus监控docker和linux主机

prometheus监控k8s

初见prometheus

1
nano /opt/prometheus/config/prometheus.yml

填入如下内容作为配置(监控自己)

1
2
3
4
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"] # Prometheus 主节点地址

运行

1
docker run -d --name=prometheus -p 9090:9090 -v /opt/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

运行成功后可以浏览器访问

image-20241203192821670

nginx实例

1
docker run -d --name=mynginx -p 10080:80 nginx

此时可以在浏览器访问

image-20241203193603780

使用stats查看某容器状态

1
2
3
4
5
[root@node0 docker.service.d]# docker stats mynginx
# or
[root@node0 docker.service.d]# docker stats --no-stream mynginx
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
96ee9202c1c9 mynginx 0.00% 3.598MiB / 3.297GiB 0.11% 5.77kB / 4.89kB 0B / 16.4kB 5

说明 –no-stream Disable streaming stats and only pull the first result\

终端处理格式化文本

1
docker stats --no-stream mynginx | awk 'NR!=1{print $3}'

解释
NR:表示当前处理的行号。NR != 1 代表跳过第一行(标题行)
print $3:表示输出每行的第三列(即 CPU 使用百分比)。

awk使用(插曲)

awk 是一种强大的文本处理工具,通常用于从文本中提取、处理和生成报告。它特别适用于处理结构化的文本数据,比如日志文件、CSV 文件、配置文件、表格数据等。它可以按行处理文本,并且可以通过分隔符(例如空格、逗号等)来处理数据。

awk 基本用途和功能

按列处理数据

awk 可以轻松处理按空格或其他分隔符(例如逗号)分隔的文本。默认情况下,awk 使用空格或制表符(Tab)作为分隔符来划分每行数据,并通过 $1, $2, $3 等来访问每一列。

示例:从一个文件或命令输出中提取每行的第一列数据:

1
echo -e "apple 10\nbanana 20" | awk '{print $1}'

输出:

1
2
apple
banana

操作行和列

在 awk 中使用条件语句、循环、数学运算等来处理文本中的数据。

示例:计算每行第一列和第二列的和:

1
echo -e "10 20\n30 40" | awk '{print $1 + $2}'

输出:

1
2
30
70

使用字段分隔符(FS)

可以指定自定义的字段分隔符。例如,当数据是 CSV 格式时,分隔符是逗号。

示例:指定逗号作为分隔符来处理 CSV 数据:

1
echo -e "apple,10\nbanana,20" | awk -F ',' '{print $1}'

输出:

输出:

1
2
apple
banana

模式匹配和条件执行

awk 允许根据条件执行特定的操作,例如打印满足条件的行。

示例:打印包含“banana”这一单词的行:

1
echo -e "apple 10\nbanana 20" | awk '$1 == "banana" {print $0}'

输出:

1
banana 20

内置变量

awk 提供了一些内置变量,比如:

NR:当前处理的行号。
NF:当前行的字段数。
$0:整行文本。
$1, $2, $3:每行的第 1、2、3 列。
FS:字段分隔符(默认是空格或制表符)。
打印格式化输出
awk 可以自定义输出格式,比如指定列宽、对齐等。

示例:输出每个字段的固定宽度:

1
echo -e "apple 10\nbanana 20" | awk '{printf "%-10s %10s\n", $1, $2}'

输出:

1
2
apple           10
banana 20

cadvsior

安装

1
2
3
4
5
6
7
8
9
docker run -d --volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest

此时可以在8080访问

image-20241203193536021

在prometheus绑定的配置文件添加监控源

1
nano /opt/prometheus/config/prometheus.yml

image-20241203202747980

重启prometheus

1
docker restart prometheus

静待片刻即可收到返回的新数据

image-20241203202901001

grafana

1
docker run -d --name=grafana -p 3000:3000 grafana/grafana

之后可以在端口3000访问

默认账号密码

1
2
admin
admin

第一次会提示修改密码

image-20241203202038317

先添加数据源

image-20241203202125565

image-20241203202150910

image-20241203202212419

再导入监控模板

image-20241203202246323

image-20241203202321103

image-20241203202349339

之后即可看到监控数据

image-20241203202420197

node exporter

先创建容器,使用 –net=”host”` 网络模式共享主机网络堆栈,不需要-p进行端口映射

1
docker run -d   --name=node-exporter   --net="host"   --pid="host"   -v "/:/host:ro,rslave"   quay.io/prometheus/node-exporter:latest   --path.rootfs=/host

image-20241203202633848

再次配置到前端展示

1
nano /opt/prometheus/config/prometheus.yml

image-20241203231340915

1
docker restart prometheus

静待一会即可

image-20241203231321355

对于Grafana,依旧是带入库模板,编号9276

image-20241203231507625

image-20241203231623784

之后即可看到面板

image-20241203231703052

有些显示没有图表,一般是三个原因

  1. 没数据(取采)
  2. 时间不对(采集的时间戳与实际时间不符,调节横轴时间范围)
  3. 代码写错了(如下面的网卡,可以把语句的中间拿去prometheus查询看有没有数据)

调整图表

cpu使用率

image-20241203232815565

有结果的

1
node_cpu_seconds_total{instance=~"$node",mode="idle"}

image-20241203232842329

加一个irate就没了

1
irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[1m])

image-20241203232953786

推测node_cpu_seconds_total 只被更新不频繁,增加时间范围,到2分钟,可以

1
irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[2m])

image-20241203233413063

于是问题解决

1
100 - (avg(irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[2m])) * 100)

image-20241203233919379

磁盘读写速率

点进去发现具有同样的问题,时间片从1m改为2m解决,最后一个为实时io,无data,查询普罗米修斯,返回状态码0

image-20241203234214204

image-20241204000357533

磁盘读写容量

与上面类似处理

image-20241203234646417

磁盘IO读写时间

类似处理,可以显示数据(实际上四条查询,前两个指标nodata,原因尚不清楚,后两个有)

image-20241203235634961

磁盘每秒IO耗时

类似处理,解决

image-20241203235842715

网络进出流量

比如下面这个是默认的网卡名称不对

image-20241203231809571

1
irate(node_network_receive_bytes_total{instance=~'$node',device=~'$nic'}[5m])*8

改为实际的网卡即可

1
irate(node_network_receive_bytes_total{instance=~'$node',device=~'ens33'}[5m])*8

image-20241203231933298

分区显示

刷新解决

image-20241204001130367