<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Kubernetes 日志收集的原理,看這一篇就夠了

          共 5188字,需瀏覽 11分鐘

           ·

          2021-06-23 19:07

          公眾號(hào)關(guān)注杰哥的IT之旅”,

          選擇“星標(biāo)”,重磅干貨,第一時(shí)間送達(dá)!

          準(zhǔn)備

          關(guān)于容器日志

          Docker的日志分為兩類,一類是 Docker引擎日志;另一類是容器日志。引擎日志一般都交給了系統(tǒng)日志,不同的操作系統(tǒng)會(huì)放在不同的位置。本文主要介紹容器日志,容器日志可以理解是運(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ò)誤輸出)。日志都會(huì)以 json-file 的格式存儲(chǔ)于/var/lib/docker/containers/<容器id>/<容器id>-json.log,不過(guò)這種方式并不適合放到生產(chǎn)環(huán)境中。

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

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

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

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

          log-driver 日志收集速度
          syslog 14.9 MB/s
          json-file 37.9 MB/s

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

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

          關(guān)于k8s日志

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

          1、應(yīng)用(Pod)級(jí)別
          2、節(jié)點(diǎn)級(jí)別
          3、集群級(jí)別

          • 應(yīng)用(Pod)級(jí)別

          Pod級(jí)別的日志 , 默認(rèn)是輸出到標(biāo)準(zhǔn)輸出和標(biāo)志輸入,實(shí)際上跟docker 容器的一致。使用 kubectl logs pod-name -n namespace 查看,具體參考[4]。

          • 節(jié)點(diǎn)級(jí)別

          Node級(jí)別的日志 , 通過(guò)配置容器的log-driver[5]來(lái)進(jìn)行管理 , 這種需要配合logrotare[6]來(lái)進(jìn)行 , 日志超過(guò)最大限制 , 自動(dòng)進(jìn)行rotate操作。

          • 集群級(jí)別

          集群級(jí)別的日志收集 , 有三種

          • 節(jié)點(diǎn)代理方式,在node級(jí)別進(jìn)行日志收集。一般使用DaemonSet部署在每個(gè)node中。這種方式優(yōu)點(diǎn)是耗費(fèi)資源少,因?yàn)橹恍璨渴鹪诠?jié)點(diǎn),且對(duì)應(yīng)用無(wú)侵入。缺點(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í)際上會(huì)存在兩份相同的日志文件:一份是應(yīng)用自己寫(xiě)入的;另一份則是 sidecar 的 stdout 和 stderr 對(duì)應(yīng)的 JSON 文件。這對(duì)磁盤(pán)是很大的浪費(fèi) , 所以說(shuō),除非萬(wàn)不得已或者應(yīng)用容器完全不可能被修改。

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

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

          日志架構(gòu)

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

          解釋如下:

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

          • log-agent 內(nèi)部 包含 filebeat[7] ,logrotate 等工具,其中filebeat是作為日志文件收集的agent

          • 通過(guò)filebeat將收集的日志發(fā)送到kafka

          • kafka在講日志發(fā)送的es日志存儲(chǔ)/kibana檢索層

          • logstash 作為中間工具主要用來(lái)在es中創(chuàng)建index和消費(fèi)kafka 的消息

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

          • 用戶部署的新應(yīng)用,如何動(dòng)態(tài)更新filebeat配置,

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

          • 如果需要更多的功能則需要二次開(kāi)發(fā)filebeat,使filebeat 支持更多的自定義配置。

          付諸實(shí)踐

          解決上述問(wèn)題,就需要開(kāi)發(fā)一個(gè)log-agent應(yīng)用以daemonset形式運(yùn)行在k8s集群的每個(gè)節(jié)點(diǎn)上,應(yīng)用內(nèi)部包含filebeat,logrotate,和需要開(kāi)發(fā)的功能組件。

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

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

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

          第三個(gè)問(wèn)題,關(guān)于二次開(kāi)發(fā)filebeat,可以參考博文 https://www.jianshu.com/p/fe3ac68f4a7a[10]

          總結(jié)

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

          參考文獻(xiàn)

          https://kubernetes.io/docs/concepts/cluster-administration/logging/[11]
          https://support.rackspace.com/how-to/understanding-logrotate-utility/[12]
          https://github.com/elastic/beats/tree/master/filebeat[13]
          http://skarnet.org/software/s6/[14]

          參考資料

          [1] Configure logging drivers: 

          https://link.zhihu.com/?target=https%3A//docs.docker.com/v17.09/engine/admin/logging/overview/

          [2] S6: 

          https://link.zhihu.com/?target=http%3A//skarnet.org/software/s6/

          [3] S6: 

          https://link.zhihu.com/?target=http%3A//skarnet.org/software/s6/

          [4] 具體參考: 

          https://link.zhihu.com/?target=https%3A//kubernetes.io/docs/reference/generated/kubectl/kubectl-commands%23logs

          [5] log-driver: 

          https://link.zhihu.com/?target=https%3A//docs.docker.com/config/containers/logging/configure/

          [6] logrotare: 

          https://link.zhihu.com/?target=https%3A//linux.die.net/man/8/logrotate

          [7] filebeat: 

          https://link.zhihu.com/?target=https%3A//github.com/elastic/beats/tree/master/filebeat

          [8] http://github.com/fsnotify/fsnotify: 

          https://link.zhihu.com/?target=http%3A//github.com/fsnotify/fsnotify

          [9] http://github.com/robfig/cron: 

          https://link.zhihu.com/?target=http%3A//github.com/robfig/cron

          [10] https://www.jianshu.com/p/fe3ac68f4a7a: 

          https://link.zhihu.com/?target=https%3A//www.jianshu.com/p/fe3ac68f4a7a

          [11] https://kubernetes.io/docs/concepts/cluster-administration/logging/: 

          https://link.zhihu.com/?target=https%3A//kubernetes.io/docs/concepts/cluster-administration/logging/

          [12] https://support.rackspace.com/how-to/understanding-logrotate-utility/: 

          https://link.zhihu.com/?target=https%3A//support.rackspace.com/how-to/understanding-logrotate-utility/

          [13] https://github.com/elastic/beats/tree/master/filebeat: 

          https://link.zhihu.com/?target=https%3A//github.com/elastic/beats/tree/master/filebeat

          [14] http://skarnet.org/software/s6/: 

          https://link.zhihu.com/?target=http%3A//skarnet.org/software/s6/

          轉(zhuǎn)自:知乎-知道又忘了
          鏈接:https://zhuanlan.zhihu.com/p/70662744

          公眾號(hào)「杰哥的IT之旅」后臺(tái)回復(fù)「搜索」即可搜索你所需要的文章;
          公眾號(hào)「杰哥的IT之旅」后臺(tái)回復(fù)「wx」添加杰哥微信即可加入讀者交流群;

          推薦閱讀

          超詳細(xì)!K8S 面試題總結(jié)

          原來(lái)Kubernetes部署如此簡(jiǎn)單,看完全明白了

          Kubernetes 擴(kuò)展容器架構(gòu)的7款工具

          2021年必會(huì)的3個(gè)Kubernetes工具

          杰哥的另一個(gè)公眾號(hào),主要分享關(guān)于個(gè)人成長(zhǎng)經(jīng)歷的那點(diǎn)事,歡迎您的關(guān)注。

          瀏覽 59
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女裸体无遮挡天天摸天天做 | 2021成人在线 | 日日搔AV一区二区三区 | 色色网五月天 | 精品国产精品三级精品AV网址 |