Kubernetes 日志收集的原理,看這一篇就夠了
準(zhǔn)備
關(guān)于容器日志
Docker 的日志分為兩類,一類是 Docker 引擎日志;另一類是容器日志。引擎日志一般都交給了系統(tǒng)日志,不同的操作系統(tǒng)會(huì)放在不同的位置。
docker logs 顯示當(dāng)前運(yùn)行的容器的日志信息,內(nèi)容包含 STOUT(標(biāo)準(zhǔn)輸出) 和 STDERR(標(biāo)準(zhǔn)錯(cuò)誤輸出)。日志都會(huì)以 json-file 的格式存儲(chǔ)于 /var/lib/docker/containers/<容器id>/<容器id>-json.log,不過這種方式并不適合放到生產(chǎn)環(huán)境中。默認(rèn)方式下容器日志并不會(huì)限制日志文件的大小,容器會(huì)一直寫日志,導(dǎo)致磁盤爆滿,影響系統(tǒng)應(yīng)用。(docker log-driver 支持log文件的rotate)
Docker Daemon 收集容器的標(biāo)準(zhǔn)輸出,當(dāng)日志量過大時(shí)會(huì)導(dǎo)致 Docker Daemon 成為日志收集的瓶頸,日志的收集速度受限。
日志文件量過大時(shí),利用
docker logs -f查看時(shí)會(huì)直接將 Docker Daemon 阻塞住,造成docker ps等命令也不響應(yīng)。
log-driver 日志收集速度
syslog 14.9 MB/s
json-file 37.9 MB/s
關(guān)于k8s日志
k8s日志收集方案分成三個(gè)級別:
應(yīng)用(Pod)級別
節(jié)點(diǎn)級別
集群級別
應(yīng)用(Pod)級別
kubectl logs pod-name -n namespace 查看,具體參考。https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs
節(jié)點(diǎn)級別

集群級別




日志架構(gòu)
解釋如下:
所有應(yīng)用容器都是基于s6基底鏡像的,容器應(yīng)用日志都會(huì)重定向到宿主機(jī)的某個(gè)目錄文件下比如
/data/logs/namespace/appname/podname/log/xxxx.loglog-agent 內(nèi)部 包含 filebeat ,logrotate 等工具,其中filebeat是作為日志文件收集的agent
通過filebeat將收集的日志發(fā)送到kafka
kafka再將日志發(fā)送的es日志存儲(chǔ)/kibana檢索層
logstash 作為中間工具主要用來在es中創(chuàng)建index和消費(fèi)kafka 的消息
整個(gè)流程很好理解,但是需要解決的是
用戶部署的新應(yīng)用,如何動(dòng)態(tài)更新filebeat配置,
如何保證每個(gè)日志文件都被正常的rotate,
如果需要更多的功能則需要二次開發(fā)filebeat,使filebeat 支持更多的自定義配置。
付諸實(shí)踐
解決上述問題,就需要開發(fā)一個(gè)log-agent應(yīng)用以daemonset形式運(yùn)行在k8s集群的每個(gè)節(jié)點(diǎn)上,應(yīng)用內(nèi)部包含filebeat,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-datamissingoknotifemptysize 1Gcopytruncate}
第三個(gè)問題,關(guān)于二次開發(fā)filebeat,可以參考博文 https://www.jianshu.com/p/fe3ac68f4
總結(jié)
本文只是對k8s日志收集提供了一個(gè)簡單的思路,關(guān)于日志收集可以根據(jù)公司的需求,因地制宜。
參考文獻(xiàn)
https://kubernetes.io/docs/concepts/cluster-administration/logging/
https://support.rackspace.com/how-to/understanding-logrotate-utility/
https://github.com/elastic/beats/tree/master/filebeat
http://skarnet.org/software/s6/
來源:https://zhuanlan.zhihu.com/p/70662744
文章轉(zhuǎn)載:高效運(yùn)維
(版權(quán)歸原作者所有,侵刪)
關(guān)注「開源Linux」加星標(biāo),提升IT技能

