✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,Prometheus监控,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:Prometheus监控系统零基础到进阶
景天的主页:景天科技苑
文章目录
prometheus结合cAdvisor监控docker容器
Docker的监控,可以使用Docker自带的stats命令来获取当前主机上运行中的容器的资源使用情况。
例如:容器的CPU使用率、内存占用、网络IO以及磁盘IO等指标。
参数解读:
# CONTAINER ID: 容器的唯一标识符。
# NAME: 容器的名称。
# CPU %: 容器使用的CPU百分比。
# MEM USAGE / LIMIT: 容器当前的内存使用量和它所能使用的最大内存量。
# MEM %: 容器使用的内存占总分配内存的百分比。
# NET I/O: 容器的网络输入/输出量,分别显示了接收和发送的总数据量。
# BLOCK I/O: 容器的磁盘输入/输出量,分别显示了读取和写入的总数据量。
# PIDS: 容器内的进程数。
但是prometheus并不支持直接抓取docker stats展示的数据。
Google开源的CAdvisor工具就是专门针对容器的性能进行监测和分析。
它提供了一个直观的UI界面,用于展示容器的实时或历史资源使用情况。
最为重要的是,CAdvisor能够导出与Prometheus兼容的监控指标,这使得Prometheus可以抓取这些指标,
从而对容器的资源使用进行监控和分析。
Cadvisor项目地址:https://github.com/google/cadvisor
用法:
1、安装docker
1)添加yum源
yum remove docker* -y && yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2)安装并启动docker
yum install docker-ce -y
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload && systemctl enable docker --now
3)运行两个容器
分别限制使用内存100M。50M
docker run -idt -p3811:80 --name demoapp --memory="100m" littlefun91/demoapp:v1.1
docker run -idt -p3812:80 --name nginx --memory="50m" nginx:1.16
2、运行cAdvisor
1)启动cAdvisor容器
docker run -idt --name=cadvisor \
-p 8082:8080 \
-v /:/rootfs:ro \
-v /var/run:/var/run:ro \
-v /sys:/sys:ro \
-v /dev/disk/:/dev/disk:ro \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
--privileged \
littlefun91/cadvisor:v0.49.2
2)访问Cadvisor提供的页面
http://10.10.0.32:8082
3)cAdvisor提供的metrics地址为 http://IP:8082/metrics
3、配置prometheus
1)修改prometheus配置文件
vim /etc/prometheus/prometheus.yml
- job_name: "docker"
static_configs:
- targets: ["jingtian03:8082"]
2)重新加载prometheus配置文件
curl -X POST http://localhost:9090/-/reload
3)检查Prometheus的Status->Targets页面,验证 docker 是否已经成功纳入监控中
4、docker常用指标与示例
docker的指标无外乎CPU,内存,磁盘和网络等指标
1)docker CPU相关指标
案例:计算每个容器的CPU利用率。
1、列出所有容器使用CPU的累积时间;
2、使用rate将最近1分钟的使用时间专为平均速率;
3、使用sum聚合,而后进行实例和容器名称的分组,最后乘以100将利用率专为百分比。
我们运行的容器都有name字段
sum (rate(container_cpu_usage_seconds_total{name!=""}[1m])) by (instance,name) * 100
2)docker内存相关指标
检测的非常精准,当前主机的总内存
案例1:获取每个容器的内存的实际使用量,以MB单位展示
sum (container_memory_working_set_bytes{name!=""}) by (instance,name) / 1024 /1024
案例2:计算每个容器的实际内存使用,占其配置的内存最大限制比率。
把没有设置限制的去掉
计算公式:( 容器实际的使用内存 / ( 容器限制最大能使用的内存 > 0 ) * 100)
sum (container_memory_working_set_bytes{name!=""}) by (instance,name)
/
sum (container_spec_memory_limit_bytes{name!=""} > 0) by (instance,name) *100
案例3:计算所有容器实际使用的内存的和,占物理内存的比率。
计算公式:( 所有容器内存使用的和 / 物理内存 * 100 )
sum(container_memory_working_set_bytes{name!=""}) / sum(machine_memory_bytes) * 100
3)docker磁盘相关指标
案例1:计算每个容器每秒的磁盘写入吞吐量。以MB为单位
# 进入demoapp容器执行:dd if=/dev/zero of=/bigdata bs=1M count=5000
# 表达式
sum (rate(container_fs_writes_bytes_total{name!=""}[1m])) by (instance,job,name) /1024 /1024
案例2:计算每个容器每秒的磁盘读取吞吐量。以MB为单位
# 进入demoapp容器执行:dd if=/bigdata of=/dev/null
# 表达式
sum (rate(container_fs_reads_bytes_total{name!=""}[1m])) by (instance,job,name) /1024 /1024
案例3:计算每个容器的每秒的读次数、写次数,也就是每秒的IOPS
sum (rate(container_fs_reads_total{name!=""}[1m])) by (instance,name)
sum (rate(container_fs_writes_total{name!=""}[1m])) by (instance,name)
4)docker inode相关指标
案例:计算inode已使用率,
计算公式:( (总的inode - 空闲的Inode ) /总的inode ) * 100 )
(container_fs_inodes_total{image=""} - container_fs_inodes_free{image=""})/ container_fs_inodes_total{image=""} * 100
5)docker网络相关指标
案例1:查询每个容器“接收”的总流量大小,以MB为单位。(如果值太小,可以考虑使用ab模拟流量)
sum (container_network_receive_bytes_total{name!=""}) by (instance,job,name) /1024 /1024
案例2:查询每个容器网络“发送”的总流量大小,以MB为单位。(如果值太小,可以考虑使用ab模拟流量)
sum (container_network_transmit_bytes_total{name!=""}) by (instance,job,name) /1024 /1024
#环比10分钟前的接收流量总大小比率 (当前流量-10分钟前流量) / 10分钟前流量 * 100
( sum (container_network_receive_bytes_total{name!=""}) - sum (container_network_receive_bytes_total{name!=""} offset 10m ) )
/
sum (container_network_receive_bytes_total{name!=""} offset 10m ) * 100
案例3:查询每个容器网络络每秒“接收”的大小除以1024,单位为KB/s(如果需要专为带宽兆比特Mbps,则需要 *8 /1024/1024)
sum(rate(container_network_receive_bytes_total{name!=""}[1m])) by (instance,job,name) / 1024
案例4:查询每个容器网络每秒“发送”的大小除以1024,单位为KB/s(如果需要专为带宽兆比特Mbps,则需要 *8 /1024/1024)
sum(rate(container_network_transmit_bytes_total{name!=""}[1m])) by (instance,job,name) / 1024
6)docker其他指标
案例1:查询正在运行的容器数量
先查询出正在运行的容器序列
根据序列计算数量
count(container_tasks_state{name!="",state="running"})
案例2:查询每个容器所运行的时长。计算公式:( 当前时间戳 - 容器开始运行时间戳 / 3600 = 容器运行的小时 )
sum (time() - container_start_time_seconds{name!=""}) by (instance,name) /3600
案例3:查询是否有容器被删除了、或停止运行了。
计算公式:(当前时间戳- 容器上一次观测到的时间戳 > 60s 则表明容器可能被停止或删除)
sum (time() - container_last_seen{name!=""}) by (instance,name) > 60
6、docker告警规则文件
1)编写告警规则文件
cat /etc/prometheus/rules/docker_rules.yml
groups:
- name: Docker的告警规则
rules:
- alert: 容器CPU利用率过高
expr: sum(rate(container_cpu_usage_seconds_total{name!=""}[1m])) by (instance,name) * 100 > 80
for: 1m
labels:
severity: warning
annotations:
summary: "实例{{ $labels.instance }}的容器{{ $labels.name }}CPU利用率过高"
description: "容器{{ $labels.name }}的CPU利用率当前为{{ $value }}%,超过了80%的阈值。"
- alert: 容器内存利用率过高
expr: |
sum(container_memory_working_set_bytes{name!=""}) by (instance,name) /
sum(container_spec_memory_limit_bytes{name!=""} > 0) by (instance,name) * 100 > 80
for: 1m
labels:
severity: warning
annotations:
summary: "实例{{ $labels.instance }}的容器{{ $labels.name }}内存利用率过高"
description: 容器{{ $labels.name }}的内存最大限制是{{ printf `sum(container_spec_memory_limit_bytes{instance="%s",name="%s"}) /1024 /1024` $labels.instance $labels.name | query | first | value }}MB , 目前利用率已达{{ $value }}%,超过限制的80%。
- alert: 容器整体内存利用率过高
expr: sum(container_memory_working_set_bytes{name!=""}) / sum(machine_memory_bytes) * 100 > 80
for: 1m
labels:
severity: warning
annotations:
summary: "所有容器的总内存利用率过高"
description: "当前所有容器占用物理内存的总量为{{ $value }}%,超过了物理内存的80%阈值。"
- alert: 容器网络发送速率过高
expr: sum(rate(container_network_transmit_bytes_total{name!=""}[1m]))by (instance,job,name) * 8 / 1024 / 1024 > 50
for: 1m
labels:
severity: warning
annotations:
summary: "实例{{ $labels.instance }}的容器{{ $labels.name }}网络发送速率过高"
description: "容器{{ $labels.name }}的网络发送速率达到{{ $value }}Mbps,超过了50Mbps的阈值。"
- alert: 容器网络接收速率过高
expr: sum(rate(container_network_receive_bytes_total{name!=""}[1m])) by (instance,job,name) * 8 / 1024 / 1024 > 50
for: 1m
labels:
severity: warning
annotations:
summary: "实例{{ $labels.instance }}的容器{{ $labels.name }}网络接收速率过高"
description: "容器{{ $labels.name }}的网络接收速率达到{{ $value }}Mbps,超过了50Mbps的阈值。"
- alert: 容器停止时间过长
expr: sum(time() - container_last_seen{name!=""}) by (instance,name)> 60
for: 1m
labels:
severity: critical
annotations:
summary: "实例{{ $labels.instance }}的容器{{ $labels.name }}已停止运行"
description: "容器{{ $labels.name }}已停止运行超过60秒。当前停止时长 {{$value }}s"
2)检查告警规则文件
7、导入docker图形
导入一个Docker Container的Grafana模板。Dashboard ID为 11600