1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Kubernetes日志收集的那些套路

        共 3076字,需瀏覽 7分鐘

         ·

        2021-10-25 08:36

        點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

        作者:知道又忘了

        來(lái)源:https://zhuanlan.zhihu.com/p/70662744

        準(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ì)一直寫日志,導(dǎo)致磁盤爆滿,影響系統(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基底鏡像構(gòu)建應(yīng)用鏡像形成統(tǒng)一日志收集方案。

        關(guān)于Kubernetes日志

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

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

        Pod級(jí)別的日志,默認(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)級(jí)別

        Node級(jí)別的日志 , 通過(guò)配置容器的log-driver來(lái)進(jìn)行管理,這種需要配合logrotare來(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)用自己寫入的;另一份則是sidecar的stdout和stderr對(duì)應(yīng)的JSON文件。這對(duì)磁盤是很大的浪費(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ì)Kubernetes日志收集方案的介紹,要想設(shè)計(jì)一個(gè)統(tǒng)一的日志收集系統(tǒng),可以采用節(jié)點(diǎn)代理方式收集每個(gè)節(jié)點(diǎn)上容器的日志,日志的整體架構(gòu)如圖所示:

        解釋如下:

        1. 所有應(yīng)用容器都是基于S6基底鏡像的,容器應(yīng)用日志都會(huì)重定向到宿主機(jī)的某個(gè)目錄文件下比如/data/logs/namespace/appname/podname/log/xxxx.log
        2. log-agent內(nèi)部包含F(xiàn)ilebeat,Logrotate等工具,其中Filebeat是作為日志文件收集的agent
        3. 通過(guò)Filebeat將收集的日志發(fā)送到Kafka
        4. Kafka在講日志發(fā)送的ES日志存儲(chǔ)/kibana檢索層
        5. Logstash作為中間工具主要用來(lái)在ES中創(chuàng)建index和消費(fèi)Kafka的消息

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

        1. 用戶部署的新應(yīng)用,如何動(dòng)態(tài)更新Filebeat配置
        2. 如何保證每個(gè)日志文件都被正常的rotate
        3. 如果需要更多的功能則需要二次開發(fā)Filebeat,使Filebeat支持更多的自定義配置

        付諸實(shí)踐

        解決上述問(wèn)題,就需要開發(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è)問(wèn)題,如何動(dòng)態(tài)更新Filebeat配置,可以利用http://github.com/fsnotify/fsnotify工具包監(jiān)聽日志目錄變化create、delete事件,利用模板渲染的方法更新Filebeat配置文件。

        第二個(gè)問(wèn)題,利用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è)問(wèn)題,關(guān)于二次開發(fā)filebeat,可以參考博文:https://www.jianshu.com/p/fe3ac68f4a7a

        總結(jié)

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

        相關(guān)鏈接:

        1. https://docs.docker.com/v17.09/engine/admin/logging/overview/
        2. http://skarnet.org/software/s6/

        1、精品 IDEA 插件大匯總!值得收藏
        2、為什么 jsp 還沒(méi)有淘汰???
        3、Redis 作者:每天花6小時(shí)搞開源,頂不住了!
        4、rm 好兇殘,太 TM 嚇人了!
        5、上午寫了一段代碼,下午就被開除了,奇怪的知識(shí)又增加了!
        6、21 款 yyds 的 IDEA插件
        7、真香!用 IDEA 神器看源碼,效率真高!

        點(diǎn)分享

        點(diǎn)收藏

        點(diǎn)點(diǎn)贊

        點(diǎn)在看

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲va欧美va天堂v国产桃 | 男人的j插入女人的b | 丝袜脚交一区二区三区 | 插菊花综合网2 | 92国产精品偷窥熟女精品视频 | 国产欧美一区二区精品婷 | 啊啊啊好爽好大 | 精品无码一区二区 | 超碰免费国产 | 五月婷亚洲精品AV天堂 |