一文详解Docker容器监控神器:cAdvisor、node exporter、prometheus

一、前言

Docker容器监控在云原生时代对于确保容器化应用的稳定、高效和安全运行具有不可或缺的重要性。有效的监控体系可以提升应用的可靠性和性能,保障业务的持续稳定运行。

本文将深入探讨在云原生时代中,如何利用cAdvisor、node exporter和Prometheus这三个关键工具来实现Docker容器监控。文章将分别对这三个工具进行详细介绍,包括其功能、安装配置、监控指标以及与其他工具的集成。

prometheus:

二、cAdvisor

cAdvisor(容器监控器,Container Advisor)是由Google开发的开源项目,旨在提供对Docker容器的资源使用情况、性能指标和运行状态的实时监控。cAdvisor可自动发现运行中的容器,并收集有关CPU、内存、文件系统以及网络等方面的性能数据,还可以提供历史数据和容器之间的比较。它以轻量级的方式运行在Docker容器中,并能够与容器的生命周期自动同步,在容器启动和停止时自动创建和清理监控数据。cAdvisor为容器化环境提供了全面的监控和性能分析能力,有助于及时发现容器内部的问题、异常行为或者性能瓶颈。

cAdvisor让容器用户了解容器的资源使用情况和性能特征。用于收集、聚合、处理和导出有关正在运行的容器的信息。它为每个容器保存资源隔离参数、历史资源使用情况、完整历史资源使用直方图和网络统计信息。

简而言之:对容器进行实时监控和性能数据采集,包括CPU、内存、网络、文件系统等资源的使用情况。

2.1、安装cAdvisor

  1. 下载二进制文件:

    wget  https://github.com/google/cadvisor/releases/download/v0.46.0/cadvisor-v0.46.0-linux-amd64
    
  2. 编写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"]
    
  3. 构建镜像。

    docker build -t cadvisor:0.46.0 .
    
  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
    
  5. 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”)。

示例:

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
    
  2. 访问http端点,查看指标

    http://192.168.0.106:9100/metrics
    

    在这里插入图片描述

  3. –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
	# 获取数据超时时长 10s
	scrape_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: RecordCpu
	rules:
	- record: Cpu15mRate
		expr: 100- sum(increase(node_cpu_seconds_total{mode="idle"}[15m])) by (instance)/sum(increase(node_cpu_seconds_total[15m])) by (instance) * 100
		labels:
 			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_resource
	rules:
	- alert: Cpu5mRate
 	expr: 100- sum(increase(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)/sum(increase(node_cpu_seconds_total[5m])) by (instance) * 100 > 2
 	labels:
  		CpuRate: hight
 	annotations:
  		# 摘要
  		summary: "Instance {{ $labels.instance }} 5分钟CPU使用率过高"
  		# 详情
  		description: " {{ $labels.instance }} of job {{ $labels.job }} 5分钟CPU使用率过高 "
- alert: NodeLoad15
 expr: node_load15 > 0.8
 labels:
  NodeLoad15: hight
 annotations:
  # 摘要
  summary: "Instance {{ $labels.instance }} 15分钟平均负载过高请留意"
  # 详情
  description: " {{ $labels.instance }} of job {{ $labels.job }} 15分钟平均负载过高 "
- alert: MemRate
 expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes+node_memory_Cached_bytes ))/node_memory_MemTotal_bytes * 100 > 20
 	labels:
  	NodeMemRate: hight
 	annotations:
	  # 摘要
	  summary: "机器内存使用率过高"
	  # 详情
	  description: "机器内存使用率超过20%,请留意"
- alert: DiskRate
 	expr: node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100 > 80
 	labels:
  		DiskRate: hight
 	annotations:
	  # 摘要
	  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. 去官网挑选模板:
    在这里插入图片描述
    在这里插入图片描述

总结

cAdvisor、node exporter和Prometheus是在云原生环境中非常常用的监控工具,它们各自有着独特的功能和优势,结合使用可以构建强大、全面的监控系统。

cAdvisor:

  • 优势:cAdvisor提供了对Docker容器的详细监控,包括CPU使用率、内存使用情况、网络流量、文件系统使用情况等,能够准确地监控容器的资源利用情况和性能指标。
  • 限制:cAdvisor在大规模集群中监控能力受到限制,对于复杂的监控需求不够灵活。

node exporter:

  • 优势:node exporter能够监控物理机或虚拟机的资源使用情况,包括CPU、内存、磁盘、网络等,为Prometheus提供了丰富的主机级监控指标。
  • 限制:node exporter主要面向物理机和虚拟机,对于容器化环境的监控支持相对较弱。

Prometheus:

  • 优势:Prometheus是一款强大的开源监控系统,具有多维数据模型、灵活的查询语言和强大的数据可视化能力,能够实时监控和调查大规模云原生环境中的监控数据。
  • 限制:在极端大规模和高并发场景下,Prometheus会遇到一些性能问题。

求关注

要实现Docker容器监控,可以通过静态配置和集成cadvisor来使用普罗米修斯(Prometheus)。静态配置允许管理员手动指定监控目标,而使用cadvisor可以自动发现容器内的监控数据。具体步骤如下:(步骤、代码、mermaid流程图、扩展内容,此处略) 参考资源链接:[普罗米修斯监控Docker容器详解:静态配置与服务发现](https://wenku.youkuaiyun.com/doc/6ryv5584w8) 首先,需要在Docker宿主机上安装cadvisor。可以通过Docker命令行工具运行cadvisor镜像,确保挂载必要的目录以访问宿主机和容器的运行信息。cadvisor运行后,它会监听8080端口,通过访问该端口可以看到容器的运行状态和资源使用情况。 其次,配置Prometheus以便从cadvisor收集数据。这涉及到修改Prometheus的配置文件`prometheus.yml`,添加静态目标或使用服务发现机制来指定cadvisor的地址。对于静态配置,直接在配置文件中列出cadvisor的地址;如果使用服务发现,可能需要结合Consul或etcd等工具来动态注册监控目标。 最后,通过Yum安装PrometheusPrometheus提供了一个稳定且功能丰富的监控解决方案,它能够从配置的监控目标中抓取指标数据,并在内置的时序数据库中存储。安装完成后,需要启动Prometheus服务,并确保其配置正确,以便开始监控Docker容器。 一旦Prometheus开始收集数据,可以使用Alertmanager来处理由Prometheus触发的警报。这样,运维团队可以及时响应容器的异常状态,并采取相应的操作。 为了深入理解整个监控流程,建议阅读《普罗米修斯监控Docker容器详解:静态配置与服务发现》。这篇文章不仅会帮助你搭建监控环境,还会提供如何管理和优化监控系统的实用建议。通过本文档的学习,你将能够全面掌握在Docker环境中部署和使用普罗米修斯监控服务的技能。 参考资源链接:[普罗米修斯监控Docker容器详解:静态配置与服务发现](https://wenku.youkuaiyun.com/doc/6ryv5584w8)
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion 莱恩呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值