<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 日志收集的原理,看這一篇就夠了

          共 3309字,需瀏覽 7分鐘

           ·

          2021-03-31 19:43

          準備

          關(guān)于容器日志

          Docker 的日志分為兩類,一類是 Docker 引擎日志;另一類是容器日志。引擎日志一般都交給了系統(tǒng)日志,不同的操作系統(tǒng)會放在不同的位置。

          本文主要介紹容器日志,容器日志可以理解是運行在容器內(nèi)部的應(yīng)用輸出的日志,默認情況下,docker logs 顯示當(dāng)前運行的容器的日志信息,內(nèi)容包含 STOUT(標準輸出) 和 STDERR(標準錯誤輸出)。日志都會以 json-file 的格式存儲于 /var/lib/docker/containers/<容器id>/<容器id>-json.log,不過這種方式并不適合放到生產(chǎn)環(huán)境中。
          • 默認方式下容器日志并不會限制日志文件的大小,容器會一直寫日志,導(dǎo)致磁盤爆滿,影響系統(tǒng)應(yīng)用。(docker log-driver 支持log文件的rotate)

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

          • 日志文件量過大時,利用docker logs -f查看時會直接將 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 的標準輸出重定向到/…/default/current,而不是發(fā)送到 Docker Daemon,這樣就避免了 Docker Daemon 收集日志的性能瓶頸。本文就是采用S6基底鏡像構(gòu)建應(yīng)用鏡像形成統(tǒng)一日志收集方案。

          關(guān)于k8s日志

          k8s日志收集方案分成三個級別:

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

          2. 節(jié)點級別

          3. 集群級別

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

          Pod 級別的日志 , 默認是輸出到標準輸出和標志輸入,實際上跟docker 容器的一致。使用 kubectl logs pod-name -n namespace 查看,具體參考。

          https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs

          • 節(jié)點級別

          Node 級別的日志 , 通過配置容器的log-driver來進行管理 , 這種需要配合logrotare來進行, 日志超過最大限制,自動進行rotate操作。

          • 集群級別

          集群級別的日志收集,有三種
          節(jié)點代理方式,在node級別進行日志收集。一般使用DaemonSet部署在每個node中。這種方式優(yōu)點是耗費資源少,因為只需部署在節(jié)點,且對應(yīng)用無侵入。缺點是只適合容器內(nèi)應(yīng)用日志必須都是標準輸出。

          使用 sidecar container 作為容器日志代理,也就是在 pod 中跟隨應(yīng)用容器起一個日志處理容器,有兩種形式:
          一種是直接將應(yīng)用容器的日志收集并輸出到標準輸出(叫做Streaming sidecar container),但需要注意的是,這時候,宿主機上實際上會存在兩份相同的日志文件:一份是應(yīng)用自己寫入的;另一份則是 sidecar 的 stdout 和 stderr 對應(yīng)的 JSON 文件。這對磁盤是很大的浪費 , 所以說,除非萬不得已或者應(yīng)用容器完全不可能被修改。

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

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

          日志架構(gòu)

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

          解釋如下:

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

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

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

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

          5. logstash 作為中間工具主要用來在es中創(chuàng)建index和消費kafka 的消息

          整個流程很好理解,但是需要解決的是

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

          2. 如何保證每個日志文件都被正常的rotate,

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

          付諸實踐

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

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

          第二個問題,利用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    }

          第三個問題,關(guān)于二次開發(fā)filebeat,可以參考博文 https://www.jianshu.com/p/fe3ac68f4

          總結(jié)

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

          參考文獻

          1. https://kubernetes.io/docs/concepts/cluster-administration/logging/

          2. https://support.rackspace.com/how-to/understanding-logrotate-utility/

          3. https://github.com/elastic/beats/tree/master/filebeat

          4. http://skarnet.org/software/s6/

          來源:https://zhuanlan.zhihu.com/p/70662744

          推薦閱讀:

          華為大數(shù)據(jù)解決方案(PPT)

          世界的真實格局分析,地球人類社會底層運行原理

          企業(yè)IT技術(shù)架構(gòu)規(guī)劃方案

          華為內(nèi)網(wǎng)最火的文章:什么是內(nèi)卷?

          不是你需要中臺,而是一名合格的架構(gòu)師(附各大廠中臺建設(shè)PPT)

          黑石董事長:我今生所有的經(jīng)驗,總結(jié)起來,不過這54條!

          阿里達摩院《機器學(xué)習(xí)算法學(xué)習(xí)指南》火了,限時開放下載!

          小米用戶畫像實戰(zhàn),48頁PPT下載

          GO語言版《算法進階指南》火了,完整版PDF下載!

          點個“在看”,一年不宕機
          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  a篇,乱伦,欧美,国产 | 俺去俺也去| 免费无码人成视在线观看不卡 | 影视先锋成人电影 | 国产操逼视频免费看 |