云原生之docker容器监控详解(cAdvisor、node exporter、prometheus)
创始人
2024-06-02 14:17:37
0

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

  1. 下载二进制文件:
wget  https://github.com/google/cadvisor/releases/download/v0.46.0/cadvisor-v0.46.0-linux-amd64
  1. 编写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"]
  1. 构建镜像。
docker build -t cadvisor:0.46.0 .
  1. 运行容器。
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
  1. 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命令行标志来自定义此端点:

  1. -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。
  2. -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。
  3. -prometheus_endpoint:暴露普罗米修斯指标的端点(默认为“/metrics”)。
  4. 示例:
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指标

容器指标:

  1. 文档。
  2. 指标:
    在这里插入图片描述

硬件指标:

  1. 文档。
  2. 指标:
    在这里插入图片描述

三、Node Exporter

Node Exporter 是prometheus官方提供的agent,项目被托管在prometheus的账号之下。用于收集主机的硬件和操作系统指标。

3.1、安装Node Exporter

  1. 启动容器,默认端口为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
  1. 访问http端点,查看指标
http://192.168.0.106:9100/metrics

在这里插入图片描述

  1. –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、指标

默认启用指标:

  1. 文档
  2. 指标:
    在这里插入图片描述

默认禁用指标:

  1. 文档
  2. 禁用指标的原因:高基数;运行时长超过Prometheus scrap_interval或scrap_timeout设置的时长;对主机资源消耗巨大。因此,启用默认禁用指标需慎重,按需启用。
  3. 指标:
    在这里插入图片描述

四、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 ,支持多种数据源。支持自定义看板,以及采用官方现有数据看板。

  1. 源码地址
  2. 官网
  3. 安装使用,默认用户名:admin 默认密码:admin。
docker run -d -p 3000:3000 --name=grafana -v /var/lib/grafana grafana/grafana-enterprise
  1. 几个现有的grafana 模板:
1860 、9276、193、11600
  1. 去官网挑选模板:
    在这里插入图片描述
    在这里插入图片描述

求关注

相关内容

热门资讯

三年级作文《可爱的小狗》(最... 三年级作文《可爱的小狗》 篇一可爱的小狗小狗是一种非常可爱的动物。它们有着软软的毛发和圆圆的大眼睛,...
我们的学校三年级作文六十个字... 我们的学校三年级作文六十个字 篇一我们的学校很美丽。校园里有很多树木和鲜花,四季都有不同的景色。教室...
美丽的海底世界三年级作文40... 篇一:美丽的海底世界海底世界真是美丽极了!在这里,我看到了各种各样奇特的鱼儿和珊瑚。我最喜欢的就是小...
三年级作文《有趣的游戏》范文... 三年级作文《有趣的游戏》范文 篇一有趣的游戏大家好!我是小明,今天我要给大家介绍一个非常有趣的游戏—...
小学三年级作文假期的生活50... 小学三年级作文假期的生活500字 篇一假期的生活假期来临了,我可是兴奋得不得了。因为这段时间,我可以...
三年级作文姥姥家的葡萄树【优... 三年级作文姥姥家的葡萄树 篇一姥姥家的葡萄树我家住在一个小镇上,每年暑假,我都会去姥姥家玩。姥姥家有...
小学三年级抗疫情作文300字 2020年小学三年级抗疫情作文300字  众志成城,万众一心,抗击疫情,共度难关,加油!下面是小编收...
小学三年级作文400字 【精华】小学三年级作文400字合集九篇  在平平淡淡的学习、工作、生活中,大家都不可避免地要接触到作...
小学三年级作文800字(优质... 小学三年级作文800字 篇一我最喜欢的动物我最喜欢的动物是猫。猫有一只灵活的身体,一双亮晶晶的大眼睛...
秋天的变化三年级作文【优选3... 秋天的变化三年级作文 篇一秋天的变化秋天是一个美丽而神奇的季节。在这个季节里,大自然的一切都在发生变...
2018世界杯足球赛作文三年... 2018世界杯足球赛作文三年级 篇一热闹的世界杯足球赛今年的夏天,全世界都沸腾了!因为2018世界杯...
可爱的灰仓鼠三年级优秀作文【... 可爱的灰仓鼠三年级优秀作文 篇一灰仓鼠是一种非常可爱的小动物,它们通常生活在森林或草地中。我非常喜欢...
三年级作文猴子下山【通用6篇... 三年级作文猴子下山 篇一猴子下山的故事,是我们小时候听过的经典故事之一。今天,我要给大家讲一个不同寻...
小学三年级作文我是妈妈的小助... 小学三年级作文我是妈妈的小助手 篇一我是妈妈的小助手我是一个小学三年级的学生,我有一个非常好的妈妈。...
三年级作文我当小家长400字... 三年级作文我当小家长400字作文大全 篇一作为三年级的小学生,我有着当小家长的责任和义务。今天,我要...
谁是我的老师作文三年级49篇... 谁是我的老师作文三年级49篇 篇一我亲爱的老师在我三年级的时候,我遇到了很多不同的老师。有的是我的班...
春节小学三年级作文300字(... 春节小学三年级作文300字 篇一快乐的春节春节是我最喜欢的节日。春节是中国最重要的传统节日,也是全家...
书的字述600字作文(优秀3... 书的字述600字作文 篇一:阅读的魅力阅读是一种独特的体验,它能够带我们进入一个全新的世界,让我们与...
三年级上册写一次游戏活动的作... 三年级上册写一次游戏活动的作文 篇一我最喜欢的游戏——躲猫猫今天,我们班组织了一次非常有趣的游戏活动...
三年级作文400字写大海(最... 三年级作文400字写大海 篇一大海大海,是一个神奇的地方。我喜欢大海,因为它给我带来了无穷的快乐和惊...