Docker 容器监控Cadvisor+Prometheus+Grafana

监控系统概述


cAdvisor (Container Advisor) :用于收集正在运行的容器资源使用和性能信息。https://github.com/google/cadvisor

为了解决docker stats的问题(存储、展示),谷歌开源的cadvisor诞生了,cadvisor不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如Prometheus进行数据抓取,或者cadvisor + Prometheus + grafna搭配使用。

cAdvisor可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况

Cadvisor使用Go语言开发,利用Linux的cgroups获取容器的资源使用信息,在K8S中集成在Kubelet里作为默认启动项,官方标配。

谷歌开发的容器资源采集信息,cadvisor也用到了k8s当中,采集pod容器信息。

运行cadvisor以docker容器的方式运行,运行起来就可以通过ip 端口进行访问了

docker run -d \
--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 \
google/cadvisor:latest

Cadviosr是Google用来监测单节点的资源信息的监控工具。虽然Docker提供了一些CLI的命令行的功能,但是在一个看图的时代,基本的功能是很难满足人民群众日益增长的物质文化需求,Cadvisor提供了一目了然的单节点多容器的资源监控功能。Google的Kubernetes中也缺省地将其作为单节点的资源监控工具,各个节点缺省会被安装上Cadvisor。在免费的世界里,Cadvisor作为一个很不错的工具,越来越多的引起很多人过渡性的关注。 

 

安装


  • 使用二进制部署
下载二进制:https://github.com/google/cadvisor/releases/latest
本地运行:./cadvisor  -port=8080 &>>/var/log/cadvisor.log
  •  使用docker部署
docker run -d \
--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 \
google/cadvisor:latest


[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                                            NAMES
afd8196a70d8        google/cadvisor:latest                 "/usr/bin/cadvisor -…"   4 minutes ago       Up 4 minutes        0.0.0.0:8080->8080/tcp 

注意:
在Ret Hat,CentOS, Fedora 等发行版上需要传递如下参数,因为 SELinux 加强了安全策略:
--privileged=true
  启动后访问:http://127.0.0.1:8080查看页面,/metric查看指标

这个部署时在你需要监控的docker主机上部署,这些挂载的数据卷卷,cadvisor想要采集的宿主机的目录,所以将宿主机目录挂载在容器当中,通过宿主机目录获取容器相关的资源利用率信息即相关的配置限制。

 

 

 使用Cadvisor监控节点信息


cAdvisor 的主要功能,总结起来主要两点:

  1. 展示 Host 和容器两个层次的监控数据

  2. 展示历史变化数据

由于 cAdvisor 提供的操作界面略显简陋,而且需要在不同页面之间跳转,并且只能监控一个 host,这不免会让人质疑它的实用性。但 cAdvisor 的一个亮点是它可以将监控到的数据导出给第三方工具,由这些工具进一步加工处理。

我们可以把 cAdvisor 定位为一个监控数据收集器,收集和导出数据是它的强项,而非展示数据。

下图为cAdvisor的web界面,数据实时刷新但是不能存储。

Docker container详细信息 

  整体使用状况 

CPU详细状况

内存详细状况 

Network

 FileSystem和Subcontainer

Cad实际上暴露的普罗米修斯的指标,也就是要被普罗米修斯监控,那么暴露出来的指标要符合普罗米修斯的指标格式,下面是要搭建监控系统,普罗米修斯在任何机器部署也行,主要能够从advisor里面获取数据即可

可以看到这就是cad暴露的指标,这些指标可以被普罗米修斯识别认可的。如果时其他格式就识别不了不能存储,这些指标由指标名称和标签,也就是key value的形式体现的。标签越多监控的维度越多。

 

Prometheus(普罗米修斯)


随着容器技术的迅速发展,Kubernetes 已然成为大家追捧的容器集群管理系统。Prometheus 作为生态圈 Cloud Native Computing Foundation(简称:CNCF)中的重要一员,其活跃度仅次于 Kubernetes, 现已广泛用于 Kubernetes 集群的监控系统中。
Prometheus 简介
Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。
作为新一代的监控框架,Prometheus 具有以下特点:

    强大的多维度数据模型:

  •         时间序列数据通过 metric 名和键值对来区分。
  •         所有的 metrics 都可以设置任意的多维标签。
  •         数据模型更随意,不需要刻意设置为以点分隔的字符串。
  •         可以对数据模型进行聚合,切割和切片操作。
  •         支持双精度浮点类型,标签可以设为全 unicode。

    灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作。
    易于管理: Prometheus server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。
    高效:平均每个采样点仅占 3.5 bytes,且一个 Prometheus server 可以处理数百万的 metrics。
    使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。
    可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端。
    可以通过服务发现或者静态配置去获取监控的 targets。
    有多种可视化图形界面。
    易于伸缩。

需要指出的是,由于数据采集可能会有丢失,所以 Prometheus 不适用对采集数据要 100% 准确的情形。但如果用于记录时间序列数据,Prometheus 具有很大的查询优势,此外,Prometheus 适用于微服务的体系架构
Prometheus 组成及架构

Prometheus 生态圈中包含了多个组件,其中许多组件是可选的:

  •     Prometheus Server: 用于收集和存储时间序列数据。
  •     Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。
  •     Push Gateway: 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。
  •     Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。
  •     Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。一些其他的工具。

Prometheus 架构图

 

 cadvisor 与 Prometheus 集成


主要内容:

  • cadvisor 与 Prometheus 集成
  • 在 Prometheus 中查看容器的 CPU,内存,网络流量等信息

数据的采集从agent采集,也即是cadvisor存储的数据采集起来,通过普罗米修斯的简单UI查看里面的数据 

Step1:启动简单启动容器和端口就可以

[root@localhost ~]# docker run -d --name=prometheus  -p 9090:9090 prom/prometheus
9bb7d60a70269a8c314794ff822dfec25d7c9230e1f5a19e5553cbf6f2a3c6e7

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                                            NAMES
9bb7d60a7026        prom/prometheus                        "/bin/prometheus --c…"   10 seconds ago      Up 6 seconds        0.0.0.0:9090->9090/tcp                           prometheus
afd8196a70d8        google/cadvisor:latest                 "/usr/bin/cadvisor -…"   18 minutes ago      Up 18 minutes       0.0.0.0:8080->8080/tcp                           cadvisor

Step2: 修改 Prometheus 配置信息,添加 cadvisor 访问地址:

现在要实现通过普罗米修斯收集cad采集的数据,现在部署的这两个组件时没有任何关系的,即普罗米修斯还没有去采集cad的数据。

 被监控端有两个概念,一个时job分组,比如web服务器是一组,mysql是一组,这样在使用promql的时候就可以筛选分组。

[root@localhost ~]# docker exec -it prometheus sh
/prometheus $ vi /etc/prometheus/prometheus.yml 
scrape_configs:
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
    - targets: ['localhost:9090']

  - job_name: 'webserver'
    basic_auth:
      username: prometheus
      password: 123456
    static_configs:
    - targets: ['192.168.179.99:9100']
  - job_name: 'docker'
    static_configs:
    - targets: ['192.168.179.99:8080','192.168.179.100:8080']

#这样就添加了被监控端

如果要添加多个

- targets: ['192.168.179.99:8080','xxx.xxx.xxx.xxx']

Step3: 重新加载配置,访问 http://localhost:9090/targets 你将看到新加的 cadvisor 已经生效

#如果需要生效需要重启
[root@localhost ~]# docker restart  prometheus
Prometheus

Step4: 此时访问 Prometheus 的 graph 页面 http://localhost:9090/graph,搜索 container 你将看到容器相关数据

现在要使用prmosql来提供信息来实现数据可视化,现在要监控哪个容器使用的内存,Cad采集的内存不仅仅是容器还有主机的,也就是列出的结果里面只要有这个标签的就是容器(现在要使用prmosql来提供信息来实现数据可视化)

 我这里只需要容器的指标,container_memory_usage_bytes{image!=""}  通过这个过滤,这里就都是容器了.

 

Granfana展示


监控Docker主机模板ID:193(这个模板可以直接使用来监控docker来得到仪表盘)

在granfana中使用该模板

 这里只能显示一台机器,现在要在一个仪表盘展示多个主机的数据,

如果再新建仪表盘会显得冗余很多,如果每个docker主机都创建一个仪表盘,太麻烦了

如何使用一个仪表盘监控多个docker主机

列出所有被监控端,up指标主要判断被监控端的状态是否是ok的,ok的值为1不ok的值为0

这个语句的格式两个值up为指标名,instance是标签,也就是获取哪个标签(一个指标下面很多标签。每个标签对应一个值)

点击仪表盘设置

 这里的Node相对于变量名用来接收许多docker主机值的,label_values(up,instance)  通过label_values获取指标的获取哪个值

 可以看到监控多个docker主机了

但是还没完,每个图表里面都有promsql,promql决定了显示哪个容器的数据和显示什么数据

这个默认是获取所有节点的内存,现在要让其显示我选择查看节点的内存怎么设置。在这里需要添加过滤,即添加标签

修改为sum(container_memory_usage_bytes{image!="",instance="$Node"})/1024/1024 

 这样就能够根据选择的按钮动态引用这个变量,从而获取对应的值进行展示,其他的也需要修改为这样,比如内存网络

再添加节点都是这种流程,不需要操作了,并且一切都是帮你自动显示对应节点的状态信息不需要再和之前一样手动配置

剩下的同理cpu和内存网络都需要修改(修改展示如下)

 

 

总结


Cadvisor(采集所有容器资源利用率,相当于agent,在每个docker主机部署 ------> 普罗米修斯主动去从cadvisor里面去采集(数据收集与存储) ------> grafana展示(从普罗米修斯里面可视化展示)

问题 如果仪表不出数据

  • 时间没有同步,被采集单数据的时间要和监控服务器的时间保持一致
  • 或者promql写的有问题,可能普罗米修斯版本和grafana版本不兼容
  • 普罗米修斯里面没有数据

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值