溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux中Docker容器內(nèi)的監(jiān)控命令數(shù)據(jù)修正思路

發(fā)布時間:2021-11-08 15:26:38 來源:億速云 閱讀:201 作者:小新 欄目:云計算

這篇文章主要介紹了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)知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI