Kubernetes日志收集


關於kubernetes的日志分好幾種,針對kubernetes本身而言有三種:

1、資源運行時的event事件。比如在k8s集群中創建pod之后,可以通過 kubectl describe pod 命令查看pod的詳細信息。

2、容器中運行的應用程序自身產生的日志,比如tomcat、nginx、php的運行日志。比如kubectl logs redis-master-bobr0。這也是官方以及網上多數文章介紹的部分。

3、k8s各組件的服務日志,比如 systemctl status kubelet。

 

容器日志收集的方式通常有以下幾種:

1、容器外收集。將宿主機的目錄掛載為容器的日志目錄,然后在宿主機上收集。

2、容器內收集。在容器內運行一個后台日志收集服務。

3、單獨運行日志容器。單獨運行一個容器提供共享日志卷,在日志容器中收集日志。

4、網絡收集。容器內應用將日志直接發送到日志中心,比如java程序可以使用log4j 2轉換日志格式並發送到遠端。

5、通過修改docker的--log-driver。可以利用不同的driver把日志輸出到不同地方,將log-driver設置為syslog、fluentd、splunk等日志收集服務,然后發送到遠端。

 

從docker1.8起docker內置了fluentd log driver,docker默認的LogDriver是json-driver,將日志以JSON文件的方式存儲。

#docker info |grep 'Logging Driver'
Logging Driver: json-file

 

 

 

Docker支持的LogDriver具體來說有以下幾種,詳情請參考docker官網。

Driver		Description	 
none		No logs will be available for the container and docker logs will not return any output.	 
json-file	The logs are formatted as JSON. The default logging driver for Docker.	 
syslog		Writes logging messages to the syslog facility. The syslog daemon must be running on the host machine.	 
journald	Writes log messages to journald. The journald daemon must be running on the host machine.	 
gelf		Writes log messages to a Graylog Extended Log Format (GELF) endpoint such as Graylog or Logstash.	 
fluentd		Writes log messages to fluentd (forward input). The fluentd daemon must be running on the host machine.	 
awslogs		Writes log messages to Amazon CloudWatch Logs.	 
splunk		Writes log messages to splunk using the HTTP Event Collector.	 
etwlogs		Writes log messages as Event Tracing for Windows (ETW) events. Only available on Windows platforms.	 
gcplogs		Writes log messages to Google Cloud Platform (GCP) Logging.	 
nats		NATS logging driver for Docker. Publishes log entries to a NATS server.

 

容器輸出到控制台的日志,都會以 *-json.log 的命名方式保存在 /var/lib/docker/containers/ 目錄下。

kubernetes 官方推薦的方案是 Flunetd+ElasticSearch+Kibana。網上常見的日志收集器還有filebeat、logspout等。

Sidecar container with a streaming container

在每個node上各運行一個Flunetd容器,對本節點 /var/log 和 /var/lib/docker/containers/ 兩個目錄下的日志進行采集,然后匯總到elasticsearch集群,最后通過kibana展示。

為了讓fluentd在每個node上運行一份,這里有幾種不同的方法:

1、直接在Node宿主機上安裝fluentd。這種方法適合elk都安裝在物理機上的場景。

2、利用kubelet的–config參數,為每個node分別運行一個靜態fluentd pod。

3、利用daemonset來讓fluentd分別在每個node上運行一個pod。(daemontset是k8s的一種資源對象)

官方使用的是第三種方式,將ElesticSearch和kibana都運行在k8s集群中,然后用daemonset運行fluentd。具體實現過程github上有示例文件,這里不做詳細描述。

 

除了容器應用的日志之外,還有一個重要的部分就是,程序自身的日志。一般情況下,會將程序日志寫到固定目錄文件、或者寫入到中間件保存和讀取。

這部分日志的處理,可以直接通過日志文件收集、或者是讓開發程序的同學修改程序把日志輸出到中間件或者是直接輸出到elk上。

 

參考:

https://docs.docker.com/engine/admin/logging/overview/

https://docs.docker.com/engine/admin/logging/json-file/

https://docs.docker.com/engine/reference/commandline/dockerd/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM