7

docker容器监控的实现

 3 years ago
source link: https://blogread.cn/it/article/8060?f=hot1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文写于2015年,所有PAAS平台相关内容都已经在2015Q3完成,当时使用的docker版本为1.6.2,虽然docker新版本发布很快,但是下面提到的监控相关的内容大致相同。

一、 docker容器有哪些指标需要监控?

  • 容器CPU、内存、IO、网络、应用存活

二、 如何监控?

宿主机监控 zabbix可以实现,容器内部安装zabbix?
(数据和宿主机一致,无法反应容器真实状态)

看别人都如何实现?

Searching GitHub…

  • seagull
    可以查看、启停容器,管理镜像,但不支持查看容器使用CPU、内存、IO、网络等情况。

  • Prometheus
    太庞大

  • Docker官方stats接口
    要求docker在1.5以上版本,有命令行和API两种方式,API为非中断式,不停的显示数据

  • Docker-mon
    命令行工具,1.5以上版本,展示效果很好,但数据无法汇总,也无法查看历史数据

  • Dockernana
    可以对docker宿主进行日常cpu、内存、IO进行监控,但无法监控容器的资源使用。

  • cAdvisor
    可以查看容器对CPU、内存、磁盘的使用情况,WEB界面方式,缺点是每个宿主都要起个容器,而且数据无法汇总,无法查看历史数据。

图1:Docker-mon

wpid-4f156ade31c626ea44e60990b9201a49_804ae661-5f7e-491e-a6f2-7060cec3c0fd.jpg
图2:cAdvisor
wpid-4f156ade31c626ea44e60990b9201a49_460df2a2-e36e-49b0-85d8-d629e1daa7ac.jpg

没办法,自己来吧…

三、 如何获取相关数据

CPU,时间片差值相减除以时间

  1. cat /cgroup/cpuacct/docker/$DOCKERID/cpuacct.stat

  2. user 5647675

  3. system 1848266

  4. #@Those times are expressed in ticks of 1/100th of a second. Actually, they are expressed in "user jiffies".

  5. There are USER_HZ "jiffies" per second, and on x86 systems, USER_HZ is 100.

如下图所示
wpid-4f156ade31c626ea44e60990b9201a49_1e8dcc40-da5a-4cd0-92b8-a77b6a024b16.jpg

最终脚本如下:

  1. a1_user=`cat /cgroup/cpuacct/docker/$i/cpuacct.stat | grep user |awk '{print $2}'`

  2. a1_sys=`cat /cgroup/cpuacct/docker/$i/cpuacct.stat | grep sys | awk '{print $2}'`

  3. sleep 5

  4. a2_user=`cat /cgroup/cpuacct/docker/$i/cpuacct.stat | grep user |awk '{print $2}'`

  5. a2_sys=`cat /cgroup/cpuacct/docker/$i/cpuacct.stat | grep sys | awk '{print $2}'`

  6. cpuall=$((a2_user + a2_sys - a1_user - a1_sys))

  7. CPUSTAT=`echo "scale=2;$cpuall/5/100" |bc`

  1. #@当前使用内存除以最大内存限制

  2. [root@BJ-YF-64-7 ~]#cat /cgroup/memory/docker/$DOCKERID/memory.limit_in_bytes

  3. 1073741824

  4. [root@BJ-YF-64-7 ~]#cat /cgroup/memory/docker/$DOCKERID/memory.usage_in_bytes

  5. 186269696

  1. #@根据容器PID来获取该进程的网络状态

  2. PID=`docker inspect -f '{{.State.Pid}}' $i`

  3. a1_rx=`cat /proc/$PID/net/dev | grep eth1 |awk '{print $2}'`

网络连接数

  1. #@根据容器PID来获取该进程的网络状态

  2. cat /proc/$PID/net/tcp

四、 初步展示shell+InfluxDB+Grafana

使用Shell打印结果:
wpid-4f156ade31c626ea44e60990b9201a49_3c904dcc-4bb7-4015-99bc-dfa7d5d43014.jpg

使用InfluxDB+ Grafana展示结果:
wpid-4f156ade31c626ea44e60990b9201a49_9bfcb5d7-0b35-4e5a-b4f3-cbed83941b67.jpg

五、 接入PAAS平台

shell定时向PAAS推送数据。PAAS将数据存储于MySQL,并展示给用户。
都是实时数据,没有历史趋势图。
wpid-4f156ade31c626ea44e60990b9201a49_e7f011c9-37b2-4df8-9450-ccdc67aebf5e.jpg

五、 接入Zabbix

数据展示问题解决了,那数据报警呢? Zabbix

Zabbix一台宿主机有N张图,容器1CPU、容器1内存、容器2CPU…

数据获取很复杂,很困难

每个容器都运行Zabbix
数据通过shell脚本打印到容器在宿主的映射目录

wpid-4f156ade31c626ea44e60990b9201a49_a279ebd8-35a2-41c2-ad28-2fb59fa20dcb.jpg

六 、自主开发监控系统

监控客户端hunter->监控数据存储端InfluxDB(触发器报警)->监控数据展示端PAAS

wpid-4f156ade31c626ea44e60990b9201a49_e7f011c9-37b2-4df8-9450-ccdc67aebf5e.jpg

历史趋势图

wpid-4f156ade31c626ea44e60990b9201a49_15807059-a22f-45ab-bba5-a987822ca244.jpg

建议继续学习:

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK