k8s 應用日誌採集(上)
傳統服務VS k8s中服務
傳統服務
- 固定機器、固定目錄
- 機器重啓不受影響
- 錯誤輸出標準輸出指定日誌文件,不用關注stdout、stderr
K8s 中服務
- 服務運行節點不固定
- 重啓服務會漂移
- 容器是一個進程自帶標準輸出和錯誤輸出,kubectl logs需關注stdout、stderr
K8s 的日誌
- Stdout、stderr (標準輸出和錯誤輸出)
kubectl logs docker log 標準輸出和錯誤輸出默認保存到宿主機默認的目錄/var/lib/docker/containers/<cname>-json.log
-
應用日誌文件
重啓服務會丟失
解決方案
- 遠程日誌
本地不做存儲,直接把日誌拿到遠端,比如Kafka,ES,但是需要改造服務,使用比較多
-
Sidercar
每個pod跑一個Sidercar,Sidercar會跟容器共享volume,他可以訪問到所有的日誌,把日誌文件轉發到後端存儲,這樣做法對POD有一定侵入,對內存CPU都有一定消耗,並不推薦
-
LogAgent
每個node節點部署一個agent,相當於第二種方案把Sidercar從POD中拿出來放到了節點上,目的通過一個agent 採集所有POD的日誌,發送到遠端,一般是以daemonSet 方式運行在kubernetes集羣中,這種方式就需要把服務的日誌掛載到宿主機上,事先約定好宿主機的目錄,入侵性小,但是必須約定所有服務掛載特定目錄,無法知道日誌來源於哪個POD,還要定期清理日誌文件
當前實踐方案
類似於上面的第三種,但是我們用的Agent 是使用阿里的LogPilot
,佔用資源比較少,穩定,既能採集docker 標準輸出,錯誤輸出,也能採集docker文件形式的日誌。ElasticSearch+Kibana 全部都部署到容器裏面。
LogPilot
-
智能的容器日誌採集工具
能把採集到文件發送到各種各樣的後端ES,kafka,logstih,redis
- 自動發現機制
動態發現容器內部日誌文件,通過監聽容器事件,動態配置日誌採集,解決了日誌重複和丟失,日誌標記的問題
-
2017 年GitHub開源
原理是在靜態日誌採集工具上面又包了一層,通過獲取docker事件實現靜態工具動態配置,目前支持兩種插件