Docker容器监控方案怎么选

74次阅读
没有评论

共计 6530 个字符,预计需要花费 17 分钟才能阅读完成。

本篇文章给大家分享的是有关 Docker 容器监控方案怎么选,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

随着线上服务的全面 docker 化,对 docker 容器的监控就很重要了。SA 的监控系统是物理机的监控,在一个物理机跑多个容器的情况下,我们是没法从一个监控图表里面区分各个容器的资源占用情况的。为了更好的监控容器运行情况,更重要的是为了后续的容器动态调度算法需要的大量运行时数据的搜集,经过调研后,基于 CAdvisor + InfluxDB + Grafana 搭建了这套容器监控系统。

1、容器监控方案选择

在调研容器监控系统的时候,其实是有很多选择的,比如 docker 自带的 docker stats 命令,Scout,Data Dog,Sysdig Cloud,Sensu Monitoring Framework,CAdvisor 等。通过 docker stats 命令可以很方便的看到当前宿主机上所有容器的 CPU,内存以及网络流量等数据。但是 docker stats 命令的缺点就是统计的只是当前宿主机的所有容器,而获取的监控数据是实时的,没有地方存储,也没有报警功能。

而 Scout(链接:https://scoutapp.com/)、Sysdig Cloud,Data Dog 虽然都提供了较完善的服务,但是它们都是托管的服务而且都收费,于是也不在考虑范围之内。Sensu Monitoring Framework(链接:https://sensu.io/)集成度较高,也免费,但是部署过于复杂。最后,我们选择了 CAdvisor 做容器监控工具。CAdvisor 谷歌出品,优点是开源产品,监控指标齐全,部署方便,而且有官方的 docker 镜像。缺点是集成度不高,默认只在本地保存 2 分钟数据。不过在调研之后发现可以加上 InfluxDB 存储数据,对接 Grafana 展示图表,比较便利地搭建好了容器监控系统,数据收集和图表展示效果良好,对系统性能也几乎没有什么影响。

2、容器资源监控 -CAdvisor2.1 部署与运行

CAdvisor 是一个容器资源监控工具,包括容器的内存,CPU,网络 IO,磁盘 IO 等监控,同时提供了一个 WEB 页面用于查看容器的实时运行状态。CAdvisor 默认存储 2 分钟的数据,而且只是针对单物理机。不过,CAdvisor 提供了很多数据集成接口,支持 InfluxDB,Redis,Kafka,Elasticsearch 等集成,可以加上对应配置将监控数据发往这些数据库存储起来。

由于 CAdvisor 已经容器化,部署和运行很简单,执行如下命令即可:

运行之后,就可以在浏览器打开 http://ip:8080 查看宿主机的容器监控数据了。

2.2 集成 InfluxDB

如前面说到,CAdvisor 默认只在本机保存最近 2 分钟的数据,为了持久化存储数据和统一收集展示监控数据,需要将数据存储到 InfluxDB 中。InfluxDB 是一个时序数据库,专门用于存储时序相关数据,很适合存储 CAdvisor 的数据。而且,CAdvisor 本身已经提供了 InfluxDB 的集成方法,在启动容器时指定配置即可。我们使用了管理容器来管理 CAdvisor,修改后的启动配置如下。主要指定了存储引擎为 InfluxDB,以及指定 InfluxDB 的 HTTP API 的地址(这里用到了自建 DNS 的域名 influxdb.service.consul 以避免暴露外部端口),还有对应的数据库和用户名密码。

{    binds : [           /:/rootfs:ro ,           /var/run:/var/run:rw ,           /sys:/sys:ro ,           /home/docker/var/lib/docker/:/var/lib/docker:ro    ],     image : forum-cadvisor ,     labels : {        type : cadvisor    },     command : -docker_only=true -storage_driver=influxdb  -storage_driver_db=cadvisor  -storage_driver_host=influxdb.service.consul:8086  -storage_driver_user=testuser  -storage_driver_password=testpwd ,     tag : latest ,     hostname : cadvisor-{{lan_ip}} }

注意到我们使用了一个自己的 forum-cadvisor 镜像来代替官方的 cadvisor 镜像,这是为了修复 cadvisor 一些问题以及基于管理方便性的考虑。

2.3 CAdvisor 存在的问题 1)运行报错问题

运行最新的 CAdvisor 容器的时候,发现容器有如下的错误日志:

这个问题是因为没有安装 findutils 工具导致的。

2)统计不到容器内存数据

Debian 默认没有开启 CGroup Memory 的支持,CAdvisor 默认情况下无法统计到容器内存数据,需要修改 GRUB 启动参数,修改文件 /etc/default/grub,加入下面这行:

GRUB_CMDLINE_LINUX= cgroup_enable=memory

然后更新 grub2 重启即可。

3)网络流量监控数据错误问题

在 CAdvisor 上线一段时间后,顺安发现容器的网络数据跟实际情况不符,并查找资料后发现问题是因为 CAdvisor 默认只统计第一个网卡的流量,而在我们的容器中是有多个 overlay 网络的,需要统计容器中所有的网卡流量。于是我修改了 CAdvisor 统计网络流量部分的代码并重新编译了一个版本在线上使用,修改的代码在这里。

最后,我们自定义的镜像文件 forum-cadvisor.Dockerfile 是这样的(src/cadvisor 是修改后重新编译的 cadvisor 可执行文件):

2.4 CAdvisor 原理简介

CAdvisor 运行时挂载了宿主机根目录,docker 根目录等多个目录,由此可以从中读取容器的运行时信息。docker 基础技术有 Linux namespace,Control Group(CGroup),AUFS 等,其中 CGroup 用于系统资源限制和优先级控制的。

宿主机的 /sys/fs/cgroup/ 目录下面存储的就是 CGroup 的内容了,CGroup 包括多个子系统,如对块设备的 blkio,cpu,内存,网络 IO 等限制。Docker 在 CGroup 里面的各个子系统中创建了 docker 目录,而 CAdvisor 运行时挂载了宿主机根目录和 /sys 目录,从而 CAdvisor 可以读取到容器的资源使用记录。

比如下面可以看到容器 b1f257 当前时刻的 CPU 的使用统计。CGroup 详细介绍可以参见 DOCKER 基础技术:LINUX CGROUP(链接 https://coolshell.cn/articles/17049.html)

# cat /sys/fs/cgroup/cpu/docker/b1f25723c5c3a17df5026cb60e1d1e1600feb293911362328bd17f671802dd31/cpuacct.statuser 95191system 5028

而容器网络流量 CAdvisor 是从 /proc/PID/net/dev 中读取的,如上面的容器 b1f257 进程在宿主机的 PID 为 6748,可以看到容器所有网卡的接收和发送流量以及错误数等。CAdvisor 定期读取对应目录下面的数据并定期发送到指定的存储引擎存储,而本地会默认存储最近 2 分钟的数据并提供 UI 界面查看。

# cat /proc/6748/net/devInter-|   Receive                                                |  Transmit face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed  eth0: 6266314     512    0    0    0     0          0         0    22787     292    0    0    0     0       0          0  eth2:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0    lo: 5926805    5601    0    0    0     0          0         0  5926805    5601    0    0    0     0       0          0

3、容器监控数据存储 -InfluxDB

InfluxDB(链接:https://docs.influxdata.com/influxdb/v1.3/)是一个开源的分布式时序数据库,使用 GO 语言开发。特别适合用于时序类型数据存储,CAdvisor 搜集的容器监控数据用 InfluxDB 存储就很合适,而且 CAdvisor 本身就提供了 InfluxDB 的支持,集成起来非常方便。

由于线上服务都 docker 化了,所以 InfluxDB 我们也是选择用容器来跑,通过容器管理系统统一管理。容器运行时的核心配置如下,主要挂载了数据库目录,以及配置了 consul 的服务注册,这样,CAdvisor 由于和 InfluxDB 处于同一个 overlay 子网中,不需要再开放端口给外部访问,CAdvisor 直接通过 influxdb.service.consul:8086 即可连接到 InfluxDB。

为了存储 CAdvisor 的数据,需要预先创建好数据库并配置用户名密码以及相关权限。InfluxDB 提供了一套 influx 的 CLI,跟 mysql client 很相似。另外,InfluxDB 的数据库操作语言 InfluxQL 跟 SQL 语法也基本一致。进入 InfluxDB 容器,运行下面命令创建数据库和用户密码并授权。

# influxConnected to http://localhost:8086 version 1.3.5InfluxDB shell version: 1.3.5 create database cadvisor  ## 创建数据库 cadvisor show databasesname: databasesname—-_internalcadvisor CREATE USER testuser WITH PASSWORD testpwd ## 创建用户和设置密码 GRANT ALL PRIVILEGES ON cadvisor TO testuser ## 授权数据库给指定用户 CREATE RETENTION POLICY cadvisor_retention ON cadvisor DURATION 30d REPLICATION 1 DEFAULT ## 创建默认的数据保留策略,设置保存时间 30 天,副本为 1

配置成功后,可以看到 CAdvisor 会通过 InfluxDB 的 HTTP API 自动创建好数据表,并将数据发送到 InfluxDB 存储起来。

3.2 InfluxDB 重要概念

influxdb 有一些重要概念:database,timestamp,field key,field value,field set,tag key,tag value,tag set,measurement,retention policy,series,point,下面简要说明一下:database:数据库,如之前创建的数据库 cadvisor。InfluxDB 不是 CRUD 数据库,更像是一个 CR-ud 数据库,它优先考虑的是增加和读取数据而不是更新删除数据的性能。timestamp:时间戳,因为 InfluxDB 是时序数据库,它的数据里面都有一列名为 time 的列,存储记录生成时间。如 rx_bytes 中的 time 列,存储的就是时间戳。fields: 包括 field key,field value 和 field set 几个概念。field key 是字段名,在 rx_bytes 表中,字段名为 value。field value 是字段值,如 17858781633,1359398 等。而 field set 是字段集合,由 field key 和 field value 构成,如 rx_bytes 中的字段集合如下:

value = 17858781633value

tags:包括 tag key,tag value,tag set 几个概念。tag key 是标签名,在 rx_bytes 表中 container_name,game,machine,namespace,type 都是标签。tag value 就是标签的值了。tag set 就是标签集合,由 tag key 和 tag value 构成。InfluxDB 中标签是可选的,不过标签是有索引的。如果查询中经常用的字段,建议设置为标签而不是字段。标签相当于传统数据库中有索引的列。retention policy: 数据保留策略,cadvisor 的保留策略为 cadvisor_retention,存储 30 天,副本为 1。一个数据库可以有多个保留策略。measurement:类似传统数据看的表,是字段,标签以及 time 列的集合。series:共享同一个 retention policy,measurement 以及 tag set 的数据集合。

3.3 InfluxDB 的特色功能

InfluxDB 作为时序数据库,相比传统数据库它有很多特色功能,比如独有的一些特色函数和连续查询功能。关于 InfluxDB 的更多详细内容可以参见官方文档。

特色函数:有一些聚合类函数如 FILL()用于填充数据, INTEGRAL()计算字段所覆盖的曲面面积,SPREAD()计算表中最大与最小值的差值,STDDEV()计算字段标准差,MEAN()计算平均值, MEDIAN()计算中位数,SAMPLE()函数用于随机取样以及 DERIVATIVE()计算数据变化比等。

连续查询:InfluxDB 独有的连续查询功能可以定期的缩小取样,就原数据库的数据缩小取样后存储到指定的新的数据库或者新的数据表中,在历史数据统计整理时特别有用。

4、容器监控数据可视化 -Grafana

通过 CAdvisor 搜集容器的监控数据,存储到 InfluxDB 中,接下来就剩数据可视化的问题了。毕竟,一个可视化的图表可以很方便快速的看到容器的一些问题。图表展示我选择的是 Grafana。Grafana 是一个开源的数据监控分析可视化平台,支持多种数据源配置 (支持的数据源包括 InfluxDB,MySQL,Elasticsearch,OpenTSDB,Graphite 等) 和丰富的插件及模板功能,支持图表权限控制和报警。Grafana 同样也是以容器方式运行,容器启动配置如下,主要是挂载了 grafana 的数据和日志目录,设置了管理员的密码,并开放了 8888 端口作为 grafana 的访问端口:

启动之后就可以在 http://IP:8888/ 页面去配置数据源了,一个示例如下:

配置完数据源,就可以添加 Panel 来实现数据可视化了。Grafana 的图表功能十分强大,在配置数据查询语句的时候也是十分智能,会对数据源,数据表,数据字段自动提示,而且对 InfluxDB 的所有函数都有分类可以直接选取配置。需要注意的一点就是在配置字节类数据 (比如网卡接收流量 rx_bytes 和 内存使用量 memory_usage) 的时候单位要选 data(IEC)这个类别。

使用 CAdvisor+InfluxDB+Grafana 构建容器资源监控系统,是可行而且是较为简便的方式。这三个组件全部以容器的方式运行,也符合我们线上服务皆为容器的理念。目前已经全面上线该监控系统,运行正常,数据可视化效果良好。除了用于可视化监控之外,这些数据后续还会用于系统异常检测算法和容器智能调度算法中。

以上就是 Docker 容器监控方案怎么选,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计6530字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)