12c集群日志位置_Kubernetes(k8s)那些套路之日志收集
準(zhǔn)備
關(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 。但是上述配置的日志收集也是通過Docker Daemon收集,收集日志的速度依然是瓶頸。
log-driver 日志收集速度syslog 14.9 MB/s
json-file 37.9 MB/s
能不能找到不通過Docker Daemon收集日志直接將日志內(nèi)容重定向到文件并自動 rotate的工具呢?答案是肯定的采用S6基底鏡像。
S6-log 將 CMD 的標(biāo)準(zhǔn)輸出重定向到/.../default/current,而不是發(fā)送到 Docker Daemon,這樣就避免了 Docker Daemon 收集日志的性能瓶頸。本文就是采用S6基底鏡像構(gòu)建應(yīng)用鏡像形成統(tǒng)一日志收集方案。
關(guān)于k8s日志
k8s日志收集方案分成三個(gè)級別:
- 應(yīng)用(Pod)級別
Pod級別的日志 , 默認(rèn)是輸出到標(biāo)準(zhǔn)輸出和標(biāo)志輸入,實(shí)際上跟docker 容器的一致。使用 kubectl logs pod-name -n namespace 查看,具體參考。
- 節(jié)點(diǎn)級別
Node級別的日志 , 通過配置容器的log-driver來進(jìn)行管理 , 這種需要配合logrotare來進(jìn)行 , 日志超過最大限制 , 自動進(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)
通過上文對k8s日志收集方案的介紹,要想設(shè)計(jì)一個(gè)統(tǒng)一的日志收集系統(tǒng),可以采用節(jié)點(diǎn)代理方式收集每個(gè)節(jié)點(diǎn)上容器的日志,日志的整體架構(gòu)如圖所示。
解釋如下:
整個(gè)流程很好理解,但是需要解決的是
付諸實(shí)踐
解決上述問題,就需要開發(fā)一個(gè)log-agent應(yīng)用以daemonset形式運(yùn)行在k8s集群的每個(gè)節(jié)點(diǎn)上,應(yīng)用內(nèi)部包含filebeat,logrotate,和需要開發(fā)的功能組件。
第一個(gè)問題,如何動態(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-datamissingoknotifemptysize 1Gcopytruncate}第三個(gè)問題,關(guān)于二次開發(fā)filebeat,可以參考博文 https://www.jianshu.com/p/fe3ac68f4a7a
總結(jié)
本文只是對k8s日志收集提供了一個(gè)簡單的思路,關(guān)于日志收集可以根據(jù)公司的需求,因地制宜。
參考文獻(xiàn)
總結(jié)
以上是生活随笔為你收集整理的12c集群日志位置_Kubernetes(k8s)那些套路之日志收集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360借条放款额度有多少
- 下一篇: 计算机基础ABCDEF,计算机应用基础_