您好,登錄后才能下訂單哦!
這篇文章主要介紹了linux中Docker容器內(nèi)的監(jiān)控命令數(shù)據(jù)修正思路,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
思路概述:編寫linux c代碼,生成對應(yīng)的動態(tài)鏈接庫(so文件),通過LDPRELOAD實現(xiàn)對/proc文件系統(tǒng)訪問的劫持。劫持之后,實現(xiàn)容器內(nèi)正確的數(shù)據(jù)計算邏輯,并生成對應(yīng)的/proc文件放到容器內(nèi)/tmp/proc目錄,劫持后對應(yīng)的命令的數(shù)據(jù)來源就從/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:調(diào)用自己開發(fā)的容器meminfo信息收集函數(shù),生成meminfo到容器目錄/tmp/proc/meminfo */ (*old_open)("/tmp/proc/meminfo", flags); } else { (*old_open)(pathname, flags); } }
###編譯hijack_meminfo.c,生成動態(tài)鏈接庫libhijack_meminfo.so。
$ gcc -shared -fPIC hijack_meminfo.c -o libhijack_meminfo.so -ldl
###將libhijack_meminfo.so的全路徑配置到環(huán)境變量LD_PRELOAD,系統(tǒng)會進行open函數(shù)的劫持。
$ 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
###執(zhí)行free/top命令, 觀察是否劫持/proc/meminfo成功。
根據(jù)這個思路,我們分析了常用的監(jiān)控命令(free, top, iostat, vmstat, sar, df, uptime等)數(shù)據(jù)計算方法,對相關(guān)/proc文件進行了open/fopen 的劫持,并重新根據(jù)容器內(nèi)對應(yīng)的cgroup fs 數(shù)據(jù)重新計算的這些監(jiān)控命令的監(jiān)控數(shù)據(jù)。
因為我們有些場景是胖容器的場景,運維需要像監(jiān)控VM/PM一樣的監(jiān)控docker容器,因此才會需要我們?nèi)θ萜鲀?nèi)的監(jiān)控命令進行修正。
在這里,我要推薦一個攜程的一個開源項目docker-monitor-injector,我們也是參考它的思路進行開發(fā)的。為什么沒有直接使用它呢?因為docker-monitor-injector修正的監(jiān)控命令還不夠多,不能滿足我們的需求,于是我們就在這基礎(chǔ)進行了增量開發(fā)。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“l(fā)inux中Docker容器內(nèi)的監(jiān)控命令數(shù)據(jù)修正思路”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。