背景
在用戶對POD內(nèi)存增長比較敏感的時(shí)候怜俐,記錄下來用戶登錄POD后執(zhí)行的所有操作效床,對POD內(nèi)存增長原因分析會有一定幫助
那么如何記錄用戶在POD里的操作呢睹酌?
實(shí)施
直接打log日志
由于提供了web頁面給用戶登錄POD,web是通過WebSocket方式登錄POD的剩檀,因此可以直接在WebSocket的onMessage方法中收到啥就打印啥
@OnMessage
public void onMessage(String msg, Session session) {
log.info(msg, session);
}
這種方式是最直接憋沿、最容易想到的,但是缺點(diǎn)也很明顯沪猴,收到一個字符打印一個字符辐啄,顯得有點(diǎn)臃腫
其次是針對一次特殊功能鍵采章,如Tab
等提示不好處理,完整的操作命令只能一點(diǎn)點(diǎn)拼湊起來壶辜,而且只能拼湊出個大概悯舟,可能會長這樣
參考HISTORY
這種實(shí)現(xiàn)方式主要基于history命令來完成,具體是在POD登錄的時(shí)候設(shè)置如下的一次性環(huán)境變量
export HISTFILESIZE=1
export HISTSIZE=1
export HISTORY_FILE=/data/bash/bash.log
export PROMPT_COMMAND=$'{ H=`history 1 |awk \'{$1=""; print $0}\'`;W=`whoami`;CONTAINER=$POD_NAME;IP=$POD_IP;echo -e $(date "+%Y-%m-%d %H:%M:%S") notice bash[]: user: $W container: $CONTAINER podip: $IP execs: "\'"$H"\'";} >> $HISTORY_FILE'
設(shè)置方式也很簡單士复,通過k8s客戶端API登錄POD時(shí)图谷,是可以指定commands數(shù)組的翩活,我們可以如下指定
return new String[]{"/bin/bash", "-c", HISTORY_BASH_FORMAT + fileName + ";"+HISTORY_BASH_CMD+";"+"/bin/bash"}
設(shè)置環(huán)境變量后阱洪,最后執(zhí)行一個bash命令,來控制偽終端即可
這種實(shí)現(xiàn)方式會將操作時(shí)間菠镇、容器名稱冗荸、等信息記錄到/data/bash/bash.log文件中,POD只需要掛在這個/data目錄即可完成持久化了利耍,這樣用戶的操作記錄都能記錄在宿主機(jī)上的文件里了
這種方式看著還行蚌本,比較直觀的記錄了用戶的操作記錄
但是會有一個很明顯的問題,就是設(shè)置了HISTSIZE和HISTFILESIZE之后隘梨,會限制history的歷史記錄大小程癌,shell里面的上下快捷鍵就被限制了,使用起來還是不太方便
而且經(jīng)過測試轴猎,針對一些內(nèi)存limit比較小的POD來說嵌莉,這種記錄方式會引起POD內(nèi)存的較快增長,同時(shí)可能引起CPU的抑制
通過反復(fù)對比設(shè)置了上述環(huán)境變量與否的內(nèi)存增長圖捻脖,發(fā)現(xiàn)設(shè)置了上述環(huán)境變量的POD在登錄后內(nèi)存增長更快锐峭,而且更容易引起CPU的抑制
原生HISTORY
如果不記錄新的文件,直接使用原生history命令支持的立即刷文件和自定義文件呢可婶?
這時(shí)候只需要換幾個環(huán)境變量即可
export HISTTIMEFORMAT='%F %T '
export HISTFILE=/data/bash/bash.log
export PROMPT_COMMAND='history -a'
這樣設(shè)置就完全使用的是history的一些環(huán)境變量了沿癞,再觀察看看登錄POD后的內(nèi)存增長
此時(shí)的內(nèi)存增長明顯變緩,多次實(shí)驗(yàn)結(jié)果均如此
看來這個才是正確打開方式
其它問題
為什么登錄POD后會引起POD內(nèi)存增長呢矛渴?
起初懷疑是通過WebSocket方式登錄的問題椎扬,后來直接通過kubectl登錄POD也會引起一樣的內(nèi)存增長,因?yàn)榈卿浐笫裁床僮鞫紱]做具温,甚至沒有查看文件蚕涤,也會引起內(nèi)存增長
可能和設(shè)置的內(nèi)存limit較小有關(guān),并且這部分內(nèi)存是沒法回收的桂躏,登錄多次后POM會直接OOM重啟钻趋,背后原因尚未明確