Kubernetes 日誌收集的原理,看這一篇就夠了
準備
關於容器日誌
Docker 的日誌分爲兩類,一類是 Docker 引擎日誌;另一類是容器日誌。引擎日誌一般都交給了系統日誌,不同的操作系統會放在不同的位置。
本文主要介紹容器日誌,容器日誌可以理解是運行在容器內部的應用輸出的日誌,默認情況下,docker logs
顯示當前運行的容器的日誌信息,內容包含 STOUT(標準輸出) 和 STDERR(標準錯誤輸出)。日誌都會以 json-file 的格式存儲於 /var/lib/docker/containers/<容器id>/<容器id>-json.log
,不過這種方式並不適合放到生產環境中。
log-driver 日誌收集速度
syslog 14.9 MB/s
json-file 37.9 MB/s
關於 k8s 日誌
k8s 日誌收集方案分成三個級別:
-
應用 (Pod) 級別
-
節點級別
-
集羣級別
- 應用 (Pod) 級別
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs
- 節點級別
- 集羣級別
集羣級別的日誌收集,有三種
節點代理方式,在 node 級別進行日誌收集。一般使用 DaemonSet 部署在每個 node 中。這種方式優點是耗費資源少,因爲只需部署在節點,且對應用無侵入。缺點是隻適合容器內應用日誌必須都是標準輸出。
使用 sidecar container 作爲容器日誌代理,也就是在 pod 中跟隨應用容器起一個日誌處理容器,有兩種形式:
一種是直接將應用容器的日誌收集並輸出到標準輸出(叫做 Streaming sidecar container),但需要注意的是,這時候,宿主機上實際上會存在兩份相同的日誌文件:一份是應用自己寫入的;另一份則是 sidecar 的 stdout 和 stderr 對應的 JSON 文件。這對磁盤是很大的浪費 , 所以說,除非萬不得已或者應用容器完全不可能被修改。
另一種是每一個 pod 中都起一個日誌收集 agent(比如 logstash 或 fluebtd )也就是相當於把方案一里的 logging agent 放在了 pod 裏。但是這種方案資源消耗 (cpu,內存) 較大,並且日誌不會輸出到標準輸出,kubectl logs 會看不到日誌內容。
應用容器中直接將日誌推到存儲後端,這種方式就比較簡單了,直接在應用裏面將日誌內容發送到日誌收集服務後端。
日誌架構
通過上文對 k8s 日誌收集方案的介紹,要想設計一個統一的日誌收集系統,可以採用節點代理方式收集每個節點上容器的日誌,日誌的整體架構如圖所示。
解釋如下:
-
所有應用容器都是基於 s6 基底鏡像的,容器應用日誌都會重定向到宿主機的某個目錄文件下比如
/data/logs/namespace/appname/podname/log/xxxx.log
-
log-agent 內部 包含 filebeat ,logrotate 等工具,其中 filebeat 是作爲日誌文件收集的 agent
-
通過 filebeat 將收集的日誌發送到 kafka
-
kafka 在講日誌發送的 es 日誌存儲 / kibana 檢索層
-
logstash 作爲中間工具主要用來在 es 中創建 index 和消費 kafka 的消息
整個流程很好理解,但是需要解決的是
-
用戶部署的新應用,如何動態更新 filebeat 配置,
-
如何保證每個日誌文件都被正常的 rotate,
-
如果需要更多的功能則需要二次開發 filebeat,使 filebeat 支持更多的自定義配置。
付諸實踐
解決上述問題,就需要開發一個 log-agent 應用以 daemonset 形式運行在 k8s 集羣的每個節點上,應用內部包含 filebeat,logrotate,和需要開發的功能組件。
第一個問題,如何動態更新 filebeat 配置,可以利用 http://github.com/fsnotify/fsnotify 工具包監聽日誌目錄變化 create、delete 事件,利用模板渲染的方法更新 filebeat 配置文件
第二個問題,利用 http://github.com/robfig/cron 工具包 創建 cronJob,定期 rotate 日誌文件,注意應用日誌文件所屬用戶,如果不是 root 用戶所屬,可以在配置中設置切換用戶
第三個問題,關於二次開發 filebeat,可以參考博文 https://www.jianshu.com/p/fe3ac68f4
總結
本文只是對 k8s 日誌收集提供了一個簡單的思路,關於日誌收集可以根據公司的需求,因地制宜。
參考文獻
-
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
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/TphcrAC9mieELiZVWtAgtg