【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知

发布于:2025-02-14 ⋅ 阅读:(14) ⋅ 点赞:(0)

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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
在这里插入图片描述