久久国产乱子伦精品免费M,亚洲一区二区三区91,欧美国产在线视频,国产精品视频久久

Kubernetes日志收集的那些套路

準備
關于容器日志
Docker的日志分為兩類,一類是Docker引擎日志;另一類是容器日志。引擎日志一般都交給了系統日志,不同的操作系統會放在不同的位置。本文主要介紹容器日志,容器日志可以理解是運行在容器內部的應用輸出的日志,默認情況下,docker logs顯示當前運行的容器的日志信息,內容包含 STOUT(標準輸出)和STDERR(標準錯誤輸出)。日志都會以json-file的格式存儲于?/var/lib/docker/containers/<容器id>/<容器id>-json.log,不過這種方式并不適合放到生產環境中。
  • 默認方式下容器日志并不會限制日志文件的大小,容器會一直寫日志,導致磁盤爆滿,影響系統應用。(docker log-driver支持log文件的rotate)
  • Docker Daemon收集容器的標準輸出,當日志量過大時會導致Docker Daemon成為日志收集的瓶頸,日志的收集速度受限。
  • 日志文件量過大時,利用docker logs -f查看時會直接將Docker Daemon阻塞住,造成docker ps等命令也不響應。
Docker提供了logging drivers配置,用戶可以根據自己的需求去配置不同的log-driver,可參考官網Configure logging drivers[1]。但是上述配置的日志收集也是通過Docker Daemon收集,收集日志的速度依然是瓶頸。
log-driver 日志收集速度
syslog 14.9 MB/s
json-file 37.9 MB/s
能不能找到不通過Docker Daemon收集日志直接將日志內容重定向到文件并自動rotate的工具呢?答案是肯定的采用S6[2]基底鏡像。
S6-log將CMD的標準輸出重定向到/.../default/current,而不是發送到 Docker Daemon,這樣就避免了Docker Daemon收集日志的性能瓶頸。本文就是采用S6基底鏡像構建應用鏡像形成統一日志收集方案。
關于Kubernetes日志
Kubernetes日志收集方案分成三個級別:
應用(Pod)級別
Pod級別的日志,默認是輸出到標準輸出和標志輸入,實際上跟Docker容器的一致。使用kubectl logs pod-name -n namespace查看,具體參考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs。
節點級別
Node級別的日志 , 通過配置容器的log-driver來進行管理,這種需要配合logrotare來進行,日志超過最大限制,自動進行rotate操作。
Kubernetes日志收集的那些套路
集群級別
集群級別的日志收集,有三種。
節點代理方式,在Node級別進行日志收集。一般使用DaemonSet部署在每個Node中。這種方式優點是耗費資源少,因為只需部署在節點,且對應用無侵入。缺點是只適合容器內應用日志必須都是標準輸出。Kubernetes日志收集的那些套路
使用sidecar container作為容器日志代理,也就是在Pod中跟隨應用容器起一個日志處理容器,有兩種形式:
一種是直接將應用容器的日志收集并輸出到標準輸出(叫做Streaming sidecar container),但需要注意的是,這時候,宿主機上實際上會存在兩份相同的日志文件:一份是應用自己寫入的;另一份則是sidecar的stdout和stderr對應的JSON文件。這對磁盤是很大的浪費,所以說,除非萬不得已或者應用容器完全不可能被修改。
Kubernetes日志收集的那些套路
另一種是每一個Pod中都起一個日志收集agent(比如Logstash或Fluebtd)也就是相當于把方案一里的logging agent放在了Pod里。但是這種方案資源消耗(CPU,內存)較大,并且日志不會輸出到標準輸出,kubectl logs會看不到日志內容。Kubernetes日志收集的那些套路
應用容器中直接將日志推到存儲后端,這種方式就比較簡單了,直接在應用里面將日志內容發送到日志收集服務后端。Kubernetes日志收集的那些套路
日志架構
通過上文對Kubernetes日志收集方案的介紹,要想設計一個統一的日志收集系統,可以采用節點代理方式收集每個節點上容器的日志,日志的整體架構如圖所示:
Kubernetes日志收集的那些套路
解釋如下:
  1. 所有應用容器都是基于S6基底鏡像的,容器應用日志都會重定向到宿主機的某個目錄文件下比如/data/logs/namespace/appname/podname/log/xxxx.log
  2. log-agent內部包含Filebeat,Logrotate等工具,其中Filebeat是作為日志文件收集的agent
  3. 通過Filebeat將收集的日志發送到Kafka
  4. Kafka在講日志發送的ES日志存儲/kibana檢索層
  5. Logstash作為中間工具主要用來在ES中創建index和消費Kafka的消息
整個流程很好理解,但是需要解決的是:
  1. 用戶部署的新應用,如何動態更新Filebeat配置
  2. 如何保證每個日志文件都被正常的rotate
  3. 如果需要更多的功能則需要二次開發Filebeat,使Filebeat支持更多的自定義配置
付諸實踐
解決上述問題,就需要開發一個log-agent應用以DaemonSet形式運行在Kubernetes集群的每個節點上,應用內部包含Filebeat,Logrotate和需要開發的功能組件。
第一個問題,如何動態更新Filebeat配置,可以利用http://github.com/fsnotify/fsnotify工具包監聽日志目錄變化create、delete事件,利用模板渲染的方法更新Filebeat配置文件。
第二個問題,利用http://github.com/robfig/cron工具包創建CronJob,定期rotate日志文件,注意應用日志文件所屬用戶,如果不是root用戶所屬,可以在配置中設置切換用戶。
Kubernetes日志收集的那些套路
第三個問題,關于二次開發filebeat,可以參考博文:https://www.jianshu.com/p/fe3ac68f4a7a
總結
本文只是對Kubernetes日志收集提供了一個簡單的思路,關于日志收集可以根據公司的需求,因地制宜。
相關鏈接:
  1. https://docs.docker.com/v17.09/engine/admin/logging/overview/
  2. http://skarnet.org/software/s6/
原文鏈接:https://zhuanlan.zhihu.com/p/70662744

文章轉載:?分布式實驗室
(版權歸原作者所有,侵刪)

相關新聞

歷經多年發展,已成為國內好評如潮的Linux云計算運維、SRE、Devops、網絡安全、云原生、Go、Python開發專業人才培訓機構!

    1. 主站蜘蛛池模板: 南城县| 汉寿县| 涞水县| 马龙县| 德江县| 杨浦区| 雷波县| 石屏县| 钦州市| 易门县| 吉水县| 光泽县| 丰镇市| 若尔盖县| 始兴县| 鄂尔多斯市| 扎赉特旗| 柘荣县| 宁强县| 舒兰市| 汝南县| 靖西县| 南康市| 桐城市| 唐河县| 德州市| 龙陵县| 麻江县| 马尔康县| 临武县| 平湖市| 巴彦淖尔市| 繁昌县| 依兰县| 塔城市| 吉安市| 新安县| 阳信县| 新余市| 射阳县| 滨海县|