prometheus监控k8s
初见prometheus
1 | nano /opt/prometheus/config/prometheus.yml |
填入如下内容作为配置(监控自己)
1 | scrape_configs: |
运行
1 | docker run -d --name=prometheus -p 9090:9090 -v /opt/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus |
运行成功后可以浏览器访问
nginx实例
1 | docker run -d --name=mynginx -p 10080:80 nginx |
此时可以在浏览器访问
使用stats查看某容器状态
1 | [root@node0 docker.service.d]# docker stats mynginx |
说明 –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 | apple |
操作行和列
在 awk 中使用条件语句、循环、数学运算等来处理文本中的数据。
示例:计算每行第一列和第二列的和:
1 | echo -e "10 20\n30 40" | awk '{print $1 + $2}' |
输出:
1 | 30 |
使用字段分隔符(FS)
可以指定自定义的字段分隔符。例如,当数据是 CSV 格式时,分隔符是逗号。
示例:指定逗号作为分隔符来处理 CSV 数据:
1 | echo -e "apple,10\nbanana,20" | awk -F ',' '{print $1}' |
输出:
输出:
1 | apple |
模式匹配和条件执行
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 | apple 10 |
cadvsior
安装
1 | docker run -d --volume=/:/rootfs:ro \ |
此时可以在8080访问
在prometheus绑定的配置文件添加监控源
1 | nano /opt/prometheus/config/prometheus.yml |
重启prometheus
1 | docker restart prometheus |
静待片刻即可收到返回的新数据
grafana
1 | docker run -d --name=grafana -p 3000:3000 grafana/grafana |
之后可以在端口3000访问
默认账号密码
1 | admin |
第一次会提示修改密码
先添加数据源
再导入监控模板
之后即可看到监控数据
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 |
再次配置到前端展示
1 | nano /opt/prometheus/config/prometheus.yml |
1 | docker restart prometheus |
静待一会即可
对于Grafana,依旧是带入库模板,编号9276
之后即可看到面板
有些显示没有图表,一般是三个原因
- 没数据(取采)
- 时间不对(采集的时间戳与实际时间不符,调节横轴时间范围)
- 代码写错了(如下面的网卡,可以把语句的中间拿去prometheus查询看有没有数据)
调整图表
cpu使用率
有结果的
1 | node_cpu_seconds_total{instance=~"$node",mode="idle"} |
加一个irate就没了
1 | irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[1m]) |
推测node_cpu_seconds_total
只被更新不频繁,增加时间范围,到2分钟,可以
1 | irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[2m]) |
于是问题解决
1 | 100 - (avg(irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[2m])) * 100) |
磁盘读写速率
点进去发现具有同样的问题,时间片从1m改为2m解决,最后一个为实时io,无data,查询普罗米修斯,返回状态码0
磁盘读写容量
与上面类似处理
磁盘IO读写时间
类似处理,可以显示数据(实际上四条查询,前两个指标nodata,原因尚不清楚,后两个有)
磁盘每秒IO耗时
类似处理,解决
网络进出流量
比如下面这个是默认的网卡名称不对
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 |
分区显示
刷新解决