云原生之docker容器监控详解(cAdvisor、node exporter、prometheus)
docker容器监控
- 一、前言
- 二、cAdvisor
- 2.1、安装cAdvisor
- 2.2、使用Prometheus监控cAdvisor
- 2.3、cAdvisor暴露的Prometheus指标
- 三、Node Exporter
- 3.1、安装Node Exporter
- 3.2、指标
- 四、Prometheus
- 4.1、安装
- 4.2、规则配置
- 4.3、报警管理器
- 五、grafana
一、前言
cAdvisor源码
node exporter源码
prometheus:
官方文档
PromQL文档
prometheus源码
报警管理器文档
报警管理器源码
中文文档
二、cAdvisor
cAdvisor让容器用户了解容器的资源使用情况和性能特征。用于收集、聚合、处理和导出有关正在运行的容器的信息。它为每个容器保存资源隔离参数、历史资源使用情况、完整历史资源使用直方图和网络统计信息。
简而言之:对容器进行实时监控和性能数据采集,包括CPU、内存、网络、文件系统等资源的使用情况。
2.1、安装cAdvisor
- 下载二进制文件:
wget https://github.com/google/cadvisor/releases/download/v0.46.0/cadvisor-v0.46.0-linux-amd64
- 编写Dockerfile构建容器(Dockerfile)。
# ubuntu作为基础镜像
FROM ubuntu:latest
LABEL cadvisor 0.46.0
# 将下载的二进制文件复制到容器里
COPY ./cadvisor-v0.46.0-linux-amd64 /usr/bin/cadvisor
# 赋予权限
RUN chmod +x /usr/bin/cadvisor
# 指定程序入口,这里使用ENTERYPOINT而不使用CMD的原因是cadvisor启动时有很多的启动参数,
# 使用CMD会需要指定太多参数,不够简洁。
ENTRYPOINT ["/usr/bin/cadvisor"]
- 构建镜像。
docker build -t cadvisor:0.46.0 .
- 运行容器。
docker run \
--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 \
--userns=host \
--privileged \
--device=/dev/kmsg \
cadvisor:0.46.0
- web访问监控图标。
http://localhost:8080
2.2、使用Prometheus监控cAdvisor
cAdvisor将容器和硬件统计数据公开为Prometheus开箱即用的指标。默认情况下,这些指标在http端点的/metrics路径下。例如:http://192.168.0.106:8080/metrics。可以通过设置-
prometheus_endpoint和-disable_metrics或-enable_metrics命令行标志来自定义此端点:
- -disable_metrics:要禁用的指标的逗号分隔列表。选项包括:
accelerator,advtcp,app,cpu,cpuLoad,cpu_topology,cpuset,disk,diskIO,hugetlb,memory,memory_numa,network,oom_event,percpu,perf_event,process,referenced_memory,resctrl,sched,tcp,udp。默认值:
advtcp,cpu_topology,cpuset,hugetlb,memory_numa,process,referenced_memory,resctrl,sched,tcp,udp。 - -enable_metrics:要启用的指标的逗号分隔列表,如果设置则覆盖-disable_metrics选项。选项包括:
accelerator,advtcp,app,cpu,cpuLoad,cpu_topology,cpuset,disk,diskIO,hugetlb,memory,memory_numa,network,oom_event,percpu,perf_event,process,referenced_memory,resctrl,sched,tcp,udp。 - -prometheus_endpoint:暴露普罗米修斯指标的端点(默认为“/metrics”)。
- 示例:
docker run \
--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 \
--userns=host \
--privileged \
--device=/dev/kmsg \
cadvisor:0.46.0 -disable_metrics cpu,cpuLoad
2.3、cAdvisor暴露的Prometheus指标
容器指标:
- 文档。
- 指标:
硬件指标:
- 文档。
- 指标:
三、Node Exporter
Node Exporter 是prometheus官方提供的agent,项目被托管在prometheus的账号之下。用于收集主机的硬件和操作系统指标。
3.1、安装Node Exporter
- 启动容器,默认端口为9100
# 安装Node Exporter 来收集硬件信息
docker run -d \
--net="host" \
--pid="host" \
--userns="host" \
-v "/:/host:ro,rslave" \
--name node_exporter \
quay.io/prometheus/node-exporter:latest \
--path.rootfs=/host
- 访问http端点,查看指标
http://192.168.0.106:9100/metrics
- –collector. 启用指标,–no-collector. 禁用指标,–collector.disable-defaults 禁用所有默认启用的指标。例如:
docker run -d \
--net="host" \
--pid="host" \
--userns="host" \
-v "/:/host:ro,rslave" \
--name node_exporter \
quay.io/prometheus/node-exporter:latest \
--path.rootfs=/host \
--collector.disable-defaults \
--collector.arp --collector.bcache
3.2、指标
默认启用指标:
- 文档
- 指标:
默认禁用指标:
- 文档
- 禁用指标的原因:高基数;运行时长超过Prometheus scrap_interval或scrap_timeout设置的时长;对主机资源消耗巨大。因此,启用默认禁用指标需慎重,按需启用。
- 指标:
四、Prometheus
一个开源的监控和报警系统,通过定时收集采集端的数据,经过计算存入到时序数据库。通过PromQL对时序数据库中的指标进行计算,从而分析出系统的状态。通过定时评估指定的基于PromQL的表达式从而实现警告的触发。
4.1、安装
(1)配置文件(promethus.yml),配置的编写可以参考官网的说明。
global:# 每20s获取一次数据指标scrape_interval: 20s# 获取数据超时时长 10sscrape_timeout: 10s# 规则评估评率,即计算指标是否有触发规则的计算频率evaluation_interval: 20s
# 规则文件,从所有匹配的文件中读取规则和警报
rule_files:- "alertRule.yml"- "recordRule.yml"
# 采集配置列表
scrape_configs:
- job_name: 'cadvisor'static_configs:- targets:- 192.168.0.106:8080
- job_name: 'node'static_configs:- targets:- 192.168.0.106:9100- 192.168.0.142:9100- 192.168.0.143:9100
- job_name: 'prometheus'static_configs:- targets:- 192.168.0.106:9090
# 报警管理
alerting:alertmanagers:- static_configs:- targets: ['192.168.20.106:9093']
(2)启动容器。
docker run -itd --name prometheus -p 9090:9090 \
-v /opt/prometheus:/etc/prometheus \
prom/prometheus --config.file=/etc/prometheus/prometheus.yml
(3)访问端点:http://192.168.0.106:9090
(4)指标类型:
- Counter:计数器,只增不减,用于描述某个指标的累计状态。比如cpu总使用时长:node_cpu_seconds_total
- Gauge:可增可减的计量器,用于描述某个指标的当前状态,比如空闲内存空间:node_memory_MemFree_bytes
(5)5分钟CPU使用率表达式,1 - 5分钟内增量空闲CPU/5分钟内增量总CPU ,按instance分组。由于node_cpu_seconds_total指标是一个counter类型,所以该指标是一直累计CPU使用量,因此需要以增量来获取CPU的量。表达式如下:
100- sum(increase(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)/sum(increase(node_cpu_seconds_total[5m])) by (instance) * 100
(6) 机器平均负载,node_load1 1分钟平均负载,node_load5 5分钟平均负载,node_load15 15分钟平均负载。
node_load1
node_load5
node_load15
(7)内存使用率,node_memory_MemTotal_bytes 总内存,node_memory_MemFree_bytes 空闲内存,node_memory_Buffers_bytes 缓冲缓存,node_memory_Cached_bytes 页面缓存。公式:总内存 -(空闲内存 + 缓冲缓存 + 页面缓存))/ 总内存 * 100。
(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes+node_memory_Cached_bytes ))/node_memory_MemTotal_bytes * 100
(8) 磁盘空间使用率,node_filesystem_avail_bytes 可用字节数 ,node_filesystem_size_bytes 总字节数。
node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100
4.2、规则配置
(1)规则检查:
promtool check rules /path/to/example.rules.yml
(2)记录规则:
roups:
- name: RecordCpurules:- record: Cpu15mRateexpr: 100- sum(increase(node_cpu_seconds_total{mode="idle"}[15m])) by (instance)/sum(increase(node_cpu_seconds_total[15m])) by (instance) * 100labels:CpuRate: 15
(3)报警规则:
groups:
# 组名
- name: node_health# 规则rules:# 报警名称- alert: InstanceDown# 基于PromQL的条件表达式expr: up == 0# 评估等待时间,表示,触发条件表达式后,等待一段时间发送报警信息for: 1m# 自定义label 标签labels:NodeHealth: false# 附加信息,比如详细的描述报警情况annotations:# 摘要summary: "Instance {{ $labels.instance }} down"# 详情 description: " {{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes "
- name: node_resourcerules:- alert: Cpu5mRateexpr: 100- sum(increase(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)/sum(increase(node_cpu_seconds_total[5m])) by (instance) * 100 > 2labels:CpuRate: hightannotations:# 摘要summary: "Instance {{ $labels.instance }} 5分钟CPU使用率过高"# 详情description: " {{ $labels.instance }} of job {{ $labels.job }} 5分钟CPU使用率过高 "
- alert: NodeLoad15expr: node_load15 > 0.8labels:NodeLoad15: hightannotations:# 摘要summary: "Instance {{ $labels.instance }} 15分钟平均负载过高请留意"# 详情description: " {{ $labels.instance }} of job {{ $labels.job }} 15分钟平均负载过高 "
- alert: MemRateexpr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes+node_memory_Cached_bytes ))/node_memory_MemTotal_bytes * 100 > 20labels:NodeMemRate: hightannotations:# 摘要summary: "机器内存使用率过高"# 详情description: "机器内存使用率超过20%,请留意"
- alert: DiskRateexpr: node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100 > 80labels:DiskRate: hightannotations:# 摘要summary: "机器磁盘使用率过高"# 详情description: "机器磁盘使用率超过80%,请留意"
(4)配置文件中指定规则文件:
rule_files:- "alertRule.yml"- "recordRule.yml"
4.3、报警管理器
报警管理器负责接收prometheus产生的报警,对报警消息进行管理。
例如:
- 去重:对同时触发的多个相同的警报去重。
- 分组:同一个组的所有警报信息将被合并为一个警报通知,避免一次性接收大量的警告通知。
- 路由:可根据情况配置路由,通知不同角色的运维人员。
- 抑制:当某一个警告发出后,可以停止重复发送由此警告引发的其他警告。
- 静默:被静默的标签将不会进行警告通知。
(1)启动报警管理器。
docker run --name alertmanager -d -p 9093:9093 quay.io/prometheus/alertmanager
(2)添加配置到prometheus 配置文件。
# 报警管理
alerting:alertmanagers:- static_configs:- targets: ['192.168.0.106:9093']
(3) 访问http://192.168.0.106:9093可查看报警信息。
五、grafana
一个开源的监控系统Web UI ,支持多种数据源。支持自定义看板,以及采用官方现有数据看板。
- 源码地址
- 官网
- 安装使用,默认用户名:admin 默认密码:admin。
docker run -d -p 3000:3000 --name=grafana -v /var/lib/grafana grafana/grafana-enterprise
- 几个现有的grafana 模板:
1860 、9276、193、11600
- 去官网挑选模板:
相关文章:

云原生之docker容器监控详解(cAdvisor、node exporter、prometheus)
docker容器监控一、前言二、cAdvisor2.1、安装cAdvisor2.2、使用Prometheus监控cAdvisor2.3、cAdvisor暴露的Prometheus指标三、Node Exporter3.1、安装Node Exporter3.2、指标四、Prometheus4.1、安装4.2、规则配置4.3、报警管理器五、grafana一、前言 cAdvisor源码 node exp…...

<Linux>进程概念
文章目录一、什么是进程1.进程概念2.进程描述 – PCB3.task_struct内容分类二、进程的基本操作1.查看进程2.结束进程3.通过系统调用获取进程标示符4.通过系统调用创建子进程(fork)三、进程状态1.普遍的操作系统状态2.Linux操作系统状态四、两种特殊的进程1.僵尸进程2.孤儿进程五…...

数据结构——顺序表
文章目录🐨0. 前言🎈1. 顺序表的概念及定义🪁2. 接口的声明🪄3. 接口的实现🍅3.1 为何使用断言?🍒3.2 初始化与销毁🍓3.3 尾插与尾删🍉3.4 头插与头删🍹3.5 指…...

闪存系统性能优化方向集锦?AC timing? Cache? 多路并发?
1. 从Flash系统的性能提升说起从消费级产品到数据中心企业级场景,NAND Flash凭借其高性能、大容量、低功耗以及低成本等特性大受欢迎,是目前应用最为广泛的半导体非易失存储介质。为了满足业务场景越来越严苛的性能要求,人们想了许多方法来提…...
【每日一题】——网购
🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟢 读书笔记 🟡 C语言跬步积累 🌈座右铭:广积粮,缓称…...

百度终于要出手了?文心一言
文心一言 百度全新一代知识增强大语言模型,文心大模型家族的新成员,能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。 前几天炒的风风火火的ChatGPT,虽然 ChatGPT 很强大&a…...

8年Java架构师面试官教你正确的面试姿势,10W字面试题带你成功上岸大厂
从最开始的面试者变成现在的面试官,工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因: 1、“知其然不知其所以然”。做了多…...
Mybatis-Plus详解
简介MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。特性(官网提供)无侵入:只做增强…...

购物清单(蓝桥杯C/C++省赛)
目录 1 问题描述 2 文件的读取格式 3 代码实现 1 问题描述 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。 这不,XX大促销又来了!老板…...
【蓝桥杯集训·每日一题】AcWing 4496. 吃水果
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴求组合数一、题目 1、原题链接 4496. 吃水果 2、题目描述 n 个小朋友站成一排,等着吃水果。 一共有 m 种水果,每种水果的数量都足够多。 现在&…...

selenium(6)-----unittest框架
unittest框架 1)测试固件 1)setUp()是用来初始化测试环境所做的工作 2)tearDown()是用来清理环境所做的工作 2)测试套件 把不同的测试脚本,不同类中的测试用例给组织起来放到一个测试套中执行 3)测试用例的要以test_开头 4)如何使用unittest框架 只需要在脚本中定义…...

统计软件与数据分析--Lesson3
dataframe数据常用python操作dataframe数据常用知识点1.创建dataframe1.1使用字典创建DataFrame:1.2使用列表创建DataFrame:1.3使用numpy数组创建DataFrame:1.4从TXT文件中创建DataFrame:1.5从CSV文件中创建DataFrame:…...

竞赛无人机搭积木式编程——以2022年TI电赛送货无人机一等奖复现为例学习(7月B题)
在学习本教程前,请确保已经学习了前4讲中无人机相关坐标系知识、基础飞行控制函数、激光雷达SLAM定位条件下的室内定点控制、自动飞行支持函数、导航控制函数等入门阶段的先导教程。 同时用户在做二次开发自定义的飞行任务时,可以参照第5讲中2021年国赛植…...
oracle基础操作
oracle基础操作语法: 1、查询会话 SQL> select count(*) from v$session;2、增大连接数 SQL> alter system set processes5000 scope spfile;3、增大会话数 SQL> alter system set sessions7552 scopespfile;4、查询 参数: SQL> sho…...
python爬虫数据写入excel
在Jmeter118中描述了如何将接口请求的响应数据写入到csv中,同样的接口如果采用python写法,会简便很多,主要是用到了python中的pandas库#爬取展台数据import requestsimport pandas as pdurlhttps://ficonline.cfaa.cn/Exhibition/searchExhib…...

优思学院|六西格玛DMAIC,傻傻搞不清?
DMAIC还是搞不清? DMAIC是一个用于过程改进和六西格玛的问题解决方法论。它是以下五个步骤的缩写: 定义(Define):明确问题,设定项目的目标和目的。绘制流程图,并收集数据,以建立未来…...

【Linux】网络编程套接字(下)
🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…...

【Linux网络】网络编程套接字(上)
🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…...

十二、51单片机之DS1302
1、DS1302简介 (1)详情查看数据手册。 (2)管角描述 管教名称功能1Vcc2双供电配置中的主电源供电引脚2X1与标准的32.768kHz晶振相连。用于ds1302记时。3X24GND电源地5CE输入信号,CE信号在读写时必须保持高电平6I/O输入/推挽输出I/O,是三线接口的双向数…...

ChatGPT-4震撼发布
3月15日消息,美国当地时间周二,人工智能研究公司OpenAI发布了其下一代大型语言模型GPT-4,这是其支持ChatGPT和新必应等应用程序的最新AI大型语言模型。该公司表示,该模型在许多专业测试中的表现超出了“人类水平”。GPT-4, 相较于…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...