容器监控系统如何做,看看这篇就够了
阅读本文大概需要 10 分钟。
作者:__七把刀__
来源:https://www.jianshu.com/p/abfa502e43a6
1 容器监控方案选择
2 容器资源监控-CAdvisor
2.1 部署与运行
由于CAdvisor已经容器化,部署和运行很简单,执行如下命令即可:
运行之后,就可以在浏览器打开http://ip:8080
查看宿主机的容器监控数据了。
2.2 集成InfluxDB
{
"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}}"
}
2.3 CAdvisor存在的问题
1)运行报错问题
运行最新的CAdvisor容器的时候,发现容器有如下的错误日志:
这个问题是因为没有安装 findutils 工具导致的。
2)统计不到容器内存数据
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.stat
user 95191
system 5028
而容器网络流量CAdvisor是从/proc/PID/net/dev中读取的,如上面的容器b1f257进程在宿主机的PID为6748,可以看到容器所有网卡的接收和发送流量以及错误数等。CAdvisor定期读取对应目录下面的数据并定期发送到指定的存储引擎存储,而本地会默认存储最近2分钟的数据并提供UI界面查看。
# cat /proc/6748/net/dev
Inter-| 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
eth1: 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。
# influx
Connected to http://localhost:8086 version 1.3.5
InfluxDB shell version: 1.3.5
> create database cadvisor ## 创建数据库cadvisor
> show databases
name: databases
name
----
_internal
cadvisor
> 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重要概念
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 = 17858781633
value
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
启动之后就可以在http://IP:8888/页面去配置数据源了,一个示例如下:
配置完数据源,就可以添加Panel来实现数据可视化了。Grafana的图表功能十分强大,在配置数据查询语句的时候也是十分智能,会对数据源,数据表,数据字段自动提示,而且对InfluxDB的所有函数都有分类可以直接选取配置。需要注意的一点就是在配置字节类数据(比如网卡接收流量 rx_bytes 和 内存使用量 memory_usage)的时候单位要选 data(IEC)这个类别。
5 总结
后台回复“加群”,带你进入高手如云交流群
推荐阅读:
10T 技术资源大放送!包括但不限于:云计算、虚拟化、微服务、大数据、网络、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公众号内回复「1024」,即可免费获取!!