這篇文章主要介紹了linux中Docker容器內的監控命令數據修正思路,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
思路概述:編寫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修正的監控命令還不夠多,不能滿足我們的需求,于是我們就在這基礎進行了增量開發。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“linux中Docker容器內的監控命令數據修正思路”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。