Docker容器内的监控命令数据修正思路
2017-11-20 23:04
423 查看
摘要: 编写linux c代码,生成对应的动态链接库(so文件),通过LDPRELOAD实现对/proc文件系统访问的劫持。劫持之后,实现容器内正确的数据计算逻辑,并生成对应的/proc文件放到容器内/tmp/proc目录,劫持后对应的命令的数据来源就从/tmp/proc/*中获取。
思路概述:编写linux c代码,生成对应的动态链接库(so文件),通过LDPRELOAD实现对/proc文件系统访问的劫持。劫持之后,实现容器内正确的数据计算逻辑,并生成对应的/proc文件放到容器内/tmp/proc目录,劫持后对应的命令的数据来源就从/tmp/proc/*中获取。
下文以劫持/proc/meminfo为例进行说明:
###编写hijack_meminfo.c,用于劫持/proc/meminfo的open操作,从而劫持free命令的输出。
###编译hijack_meminfo.c,生成动态链接库libhijack_meminfo.so。
$ gcc -shared -fPIC hijack_meminfo.c -o libhijack_meminfo.so -ldl
###将libhijack_meminfo.so的全路径配置到环境变量LD_PRELOAD,系统会进行open函数的劫持。
$ export LD_PRELOAD=
###为了测试和便于观察,我们将手动生成文件/tmp/proc/meminfo。
###执行free/top命令, 观察是否劫持/proc/meminfo成功。
根据这个思路,我们分析了常用的监控命令(free, top, iostat, vmstat, sar, df, uptime等)数据计算方法,对相关/proc文件进行了open/fopen 的劫持,并重新根据容器内对应的cgroup fs 数据重新计算的这些监控命令的监控数据。
因为我们有些场景是胖容器的场景,运维需要像监控VM/PM一样的监控docker容器,因此才会需要我们去对容器内的监控命令进行修正。
在这里,我要推荐一个携程的一个开源项目docker-monitor-injector,我们也是参考它的思路进行开发的。为什么没有直接使用它呢?因为docker-monitor-injector修正的监控命令还不够多,不能满足我们的需求,于是我们就在这基础进行了增量开发。
思路概述:编写linux c代码,生成对应的动态链接库(so文件),通过LDPRELOAD实现对/proc文件系统访问的劫持。劫持之后,实现容器内正确的数据计算逻辑,并生成对应的/proc文件放到容器内/tmp/proc目录,劫持后对应的命令的数据来源就从/tmp/proc/*中获取。
下文以劫持/proc/meminfo为例进行说明:
###编写hijack_meminfo.c,用于劫持/proc/meminfo的open操作,从而劫持free命令的输出。
#define _GNU_SOURCE #include <stdio.h> #include <dlfcn.h> #include <stdlib.h> #include <stdarg.h> int open( const char * pathname, int flags) { typeof(open) *old_open; old_open = dlsym(RTLD_NEXT, "open"); //printf("in my hijack open!"); // 劫持/proc/meminfo的open char *s_meminfo = strstr(pathname, "/proc/meminfo"); if (s != NULL) { /* TODO:调用自己开发的容器meminfo信息收集函数,生成meminfo到容器目录/tmp/proc/meminfo */ (*old_open)("/tmp/proc/meminfo", flags); } else { (*old_open)(pathname, flags); } }
###编译hijack_meminfo.c,生成动态链接库libhijack_meminfo.so。
$ gcc -shared -fPIC hijack_meminfo.c -o libhijack_meminfo.so -ldl
###将libhijack_meminfo.so的全路径配置到环境变量LD_PRELOAD,系统会进行open函数的劫持。
$ export LD_PRELOAD=
pwd/libhijack_meminfo.so
###为了测试和便于观察,我们将手动生成文件/tmp/proc/meminfo。
MemTotal: 999 kB MemFree: 999 kB MemAvailable: 999 kB Buffers: 999 kB Cached: 999 kB SwapCached: 0 kB Active: 999 kB Inactive: 999 kB Active(anon): 999 kB Inactive(anon): 999 kB Active(file): 999 kB Inactive(file): 999 kB Unevictable: 999 kB Mlocked: 999 kB SwapTotal: 999 kB SwapFree: 999 kB Dirty: 999 kB Writeback: 999 kB AnonPages: 999 kB Mapped: 999 kB Shmem: 999 kB Slab: 999 kB SReclaimable: 999 kB SUnreclaim: 999 kB KernelStack: 999 kB PageTables: 999 kB NFS_Unstable: 999 kB Bounce: 999 kB WritebackTmp: 999 kB CommitLimit: 999 kB Committed_AS: 999 kB VmallocTotal: 999 kB VmallocUsed: 999 kB VmallocChunk: 999 kB HardwareCorrupted: 999 kB AnonHugePages: 999 kB CmaTotal: 999 kB CmaFree: 999 kB HugePages_Total: 999 HugePages_Free: 999 HugePages_Rsvd: 999 HugePages_Surp: 999 Hugepagesize: 999 kB DirectMap4k: 999 kB DirectMap2M: 999 kB
###执行free/top命令, 观察是否劫持/proc/meminfo成功。
根据这个思路,我们分析了常用的监控命令(free, top, iostat, vmstat, sar, df, uptime等)数据计算方法,对相关/proc文件进行了open/fopen 的劫持,并重新根据容器内对应的cgroup fs 数据重新计算的这些监控命令的监控数据。
因为我们有些场景是胖容器的场景,运维需要像监控VM/PM一样的监控docker容器,因此才会需要我们去对容器内的监控命令进行修正。
在这里,我要推荐一个携程的一个开源项目docker-monitor-injector,我们也是参考它的思路进行开发的。为什么没有直接使用它呢?因为docker-monitor-injector修正的监控命令还不够多,不能满足我们的需求,于是我们就在这基础进行了增量开发。
相关文章推荐
- docker实战1 (docker-toolbox的安装,docker基础命令详解[运行,容器导入/导出,镜像导入/导出,数据卷,网络],构建100个docker实例的测试环境)
- Docker-MySql -- 使用mysqldump 命令备份导出mysql容器中的结构数据
- Docker cp 命令(用于容器与主机之间的数据拷贝)
- Weave Scope 多主机监控 - 每天5分钟玩转 Docker 容器技术(81)
- Docker容器内存监控
- 验证 Swarm 数据持久性 - 每天5分钟玩转 Docker 容器技术(104)
- Docker容器学习梳理--Volume数据卷使用
- Docker学习笔记:容器数据管理,链接容器,构建私有库
- docker容器之数据管理
- docker容器之数据管理
- Docker 快速上手系列(4): 数据卷,数据卷容器的概念及相关操作
- docker中 启动所有的容器命令
- 学习Docker之Docker、容器和镜像的简介和常用命令
- Docker容器、镜像、数据卷
- 用 volume container 共享数据 - 每天5分钟玩转 Docker 容器技术(42)
- docker 运行的新容器不能使用常规的命令
- Docker--容器中数据管理--RHEL7.2
- 自己学Docker:6.Docker的数据持久化之数据卷容器
- [置顶] kafka监控命令kafka-run-class.sh查看消费了多少条数据
- Docker容器数据管理1