簡述Kubernetes容器日志收集原理蓬抄!

概述

關(guān)于容器日志

Docker的日志分為兩類夯到,一類是Docker引擎日志;另一類是容器日志耍贾。引擎日志一般都交給了系統(tǒng)日志阅爽,不同的操作系統(tǒng)會放在不同的位置付翁。本文主要介紹容器日志,容器日志可以理解是運(yùn)行在容器內(nèi)部的應(yīng)用輸出的日志晃听,默認(rèn)情況下砰识,docker logs顯示當(dāng)前運(yùn)行的容器的日志信息,內(nèi)容包含 STOUT(標(biāo)準(zhǔn)輸出)和STDERR(標(biāo)準(zhǔn)錯(cuò)誤輸出)辫狼。日志都會以json-file的格式存儲于 /var/lib/docker/containers/<容器id>/<容器id>-json.log,不過這種方式并不適合放到生產(chǎn)環(huán)境中予借。

  • 默認(rèn)方式下容器日志并不會限制日志文件的大小,容器會一直寫日志频蛔,導(dǎo)致磁盤爆滿,影響系統(tǒng)應(yīng)用晦溪。(docker log-driver支持log文件的rotate)

  • Docker Daemon收集容器的標(biāo)準(zhǔn)輸出,當(dāng)日志量過大時(shí)會導(dǎo)致Docker Daemon成為日志收集的瓶頸三圆,日志的收集速度受限。

  • 日志文件量過大時(shí)舟肉,利用docker logs -f查看時(shí)會直接將Docker Daemon阻塞住,造成docker ps等命令也不響應(yīng)路媚。

Docker提供了logging drivers配置黄琼,用戶可以根據(jù)自己的需求去配置不同的log-driver整慎,可參考官網(wǎng)Configure logging drivers[1]。但是上述配置的日志收集也是通過Docker Daemon收集裤园,收集日志的速度依然是瓶頸。

log-driver 日志收集速度

syslog 14.9 MB/s


json-file 37.9 MB/s

能不能找到不通過Docker Daemon收集日志直接將日志內(nèi)容重定向到文件并自動(dòng)rotate的工具呢拧揽?答案是肯定的采用S6[2]基底鏡像剃盾。

S6-log將CMD的標(biāo)準(zhǔn)輸出重定向到/.../default/current痒谴,而不是發(fā)送到 Docker Daemon,這樣就避免了Docker Daemon收集日志的性能瓶頸饮怯。本文就是采用S6基底鏡像構(gòu)建應(yīng)用鏡像形成統(tǒng)一日志收集方案。

關(guān)于Kubernetes日志

Kubernetes日志收集方案分成三個(gè)級別:

應(yīng)用(Pod)級別

Pod級別的日志蓖墅,默認(rèn)是輸出到標(biāo)準(zhǔn)輸出和標(biāo)志輸入临扮,實(shí)際上跟Docker容器的一致。使用kubectl logs pod-name -n namespace查看教翩,具體參考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs

節(jié)點(diǎn)級別

Node級別的日志 , 通過配置容器的log-driver來進(jìn)行管理饱亿,這種需要配合logrotare來進(jìn)行,日志超過最大限制彪笼,自動(dòng)進(jìn)行rotate操作。

集群級別

集群級別的日志收集配猫,有三種幅恋。

節(jié)點(diǎn)代理方式泵肄,在Node級別進(jìn)行日志收集。一般使用DaemonSet部署在每個(gè)Node中腐巢。這種方式優(yōu)點(diǎn)是耗費(fèi)資源少品追,因?yàn)橹恍璨渴鹪诠?jié)點(diǎn)冯丙,且對應(yīng)用無侵入。缺點(diǎn)是只適合容器內(nèi)應(yīng)用日志必須都是標(biāo)準(zhǔn)輸出银还。

使用sidecar container作為容器日志代理洁墙,也就是在Pod中跟隨應(yīng)用容器起一個(gè)日志處理容器,有兩種形式:

一種是直接將應(yīng)用容器的日志收集并輸出到標(biāo)準(zhǔn)輸出(叫做Streaming sidecar container)热监,但需要注意的是捺弦,這時(shí)候孝扛,宿主機(jī)上實(shí)際上會存在兩份相同的日志文件:一份是應(yīng)用自己寫入的;另一份則是sidecar的stdout和stderr對應(yīng)的JSON文件苦始。這對磁盤是很大的浪費(fèi),所以說陌选,除非萬不得已或者應(yīng)用容器完全不可能被修改理郑。

另一種是每一個(gè)Pod中都起一個(gè)日志收集agent(比如Logstash或Fluebtd)也就是相當(dāng)于把方案一里的logging agent放在了Pod里。但是這種方案資源消耗(CPU您炉,內(nèi)存)較大,并且日志不會輸出到標(biāo)準(zhǔn)輸出赚爵,kubectl logs會看不到日志內(nèi)容。

應(yīng)用容器中直接將日志推到存儲后端冀膝,這種方式就比較簡單了,直接在應(yīng)用里面將日志內(nèi)容發(fā)送到日志收集服務(wù)后端窝剖。

日志架構(gòu)

通過上文對Kubernetes日志收集方案的介紹,要想設(shè)計(jì)一個(gè)統(tǒng)一的日志收集系統(tǒng)枯芬,可以采用節(jié)點(diǎn)代理方式收集每個(gè)節(jié)點(diǎn)上容器的日志论笔,日志的整體架構(gòu)如圖所示:

解釋如下:

  1. 所有應(yīng)用容器都是基于S6基底鏡像的千所,容器應(yīng)用日志都會重定向到宿主機(jī)的某個(gè)目錄文件下比如/data/logs/namespace/appname/podname/log/xxxx.log

  2. log-agent內(nèi)部包含F(xiàn)ilebeat,Logrotate等工具淫痰,其中Filebeat是作為日志文件收集的agent

  3. 通過Filebeat將收集的日志發(fā)送到Kafka

  4. Kafka在講日志發(fā)送的ES日志存儲/kibana檢索層

  5. Logstash作為中間工具主要用來在ES中創(chuàng)建index和消費(fèi)Kafka的消息

整個(gè)流程很好理解,但是需要解決的是:

  1. 用戶部署的新應(yīng)用待错,如何動(dòng)態(tài)更新Filebeat配置

  2. 如何保證每個(gè)日志文件都被正常的rotate

  3. 如果需要更多的功能則需要二次開發(fā)Filebeat,使Filebeat支持更多的自定義配置

付諸實(shí)踐

解決上述問題火俄,就需要開發(fā)一個(gè)log-agent應(yīng)用以DaemonSet形式運(yùn)行在Kubernetes集群的每個(gè)節(jié)點(diǎn)上,應(yīng)用內(nèi)部包含F(xiàn)ilebeat瓜客,Logrotate和需要開發(fā)的功能組件适瓦。

第一個(gè)問題谱仪,如何動(dòng)態(tài)更新Filebeat配置,可以利用http://github.com/fsnotify/fsnotify工具包監(jiān)聽日志目錄變化create疯攒、delete事件,利用模板渲染的方法更新Filebeat配置文件敬尺。

第二個(gè)問題枚尼,利用http://github.com/robfig/cron工具包創(chuàng)建CronJob,定期rotate日志文件姑原,注意應(yīng)用日志文件所屬用戶,如果不是root用戶所屬锭汛,可以在配置中設(shè)置切換用戶。

/var/log/xxxx/xxxxx.log {
  su www-data www-data
  missingok
  notifempty
  size 1G
  copytruncate
} 

第三個(gè)問題唤殴,關(guān)于二次開發(fā)filebeat般婆,可以參考博文:http://www.reibang.com/p/fe3ac68f4a7a

總結(jié)

本文只是對Kubernetes日志收集提供了一個(gè)簡單的思路朵逝,關(guān)于日志收集可以根據(jù)公司的需求,因地制宜配名。

寫在最后

歡迎大家關(guān)注我的公眾號【風(fēng)平浪靜如碼】,海量Java相關(guān)文章渠脉,學(xué)習(xí)資料都會在里面更新,整理的資料也會放在里面芋膘。

覺得寫的還不錯(cuò)的就點(diǎn)個(gè)贊鳞青,加個(gè)關(guān)注唄为朋!點(diǎn)關(guān)注,不迷路习寸,持續(xù)更新=憾琛H诨痢精钮!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轨香,隨后出現(xiàn)的幾起案子忽你,更是在濱河造成了極大的恐慌臂容,老刑警劉巖根蟹,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異简逮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尿赚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門散庶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凌净,“玉大人悲龟,你說我怎么就攤上這事冰寻。” “怎么了斩芭?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長划乖。 經(jīng)常有香客問我,道長迁筛,這世上最難降的妖魔是什么煤蚌? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任细卧,我火速辦了婚禮,結(jié)果婚禮上贪庙,老公的妹妹穿的比我還像新娘。我一直安慰自己止邮,他們只是感情好这橙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布屈扎。 她就那樣靜靜地躺著,像睡著了一般撩匕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天模蜡,我揣著相機(jī)與錄音,去河邊找鬼忍疾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卤妒,可吹牛的內(nèi)容都是我干的丸边。 我是一名探鬼主播荚孵,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼收叶!你這毒婦竟也來了骄呼?” 一聲冷哼從身側(cè)響起判没,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澄峰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俏竞,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年魂毁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片席楚。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烦秩,靈堂內(nèi)的尸體忽然破棺而出垮斯,到底是詐尸還是另有隱情只祠,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布铆农,位于F島的核電站牺氨,受9級特大地震影響墩剖,放射性物質(zhì)發(fā)生泄漏猴凹。R本人自食惡果不足惜岭皂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爷绘。 院中可真熱鬧,春花似錦土至、人聲如沸购对。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楷扬。三九已至解幽,卻和暖如春烘苹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镣衡。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廊鸥,地道東北人然爆。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓曾雕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親助被。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容