Logstash收集Kubernetes的應用日誌,
發現logstash十分消耗內存(大約500M),
而改用filebeat(大約消耗10多M內存)。
在進行日誌收集的過程中,我們首先想到的是使用Logstash,因爲它是ELK stack中的重要成員,但是在測試過程中發現,Logstash是基於JDK的,在沒有產生日誌的情況單純啓動Logstash就大概要消耗500M內存,在每個Pod中都啓動一個日誌收集組件的情況下,使用logstash有點浪費系統資源,經人推薦我們選擇使用Filebeat替代,經測試單獨啓動Filebeat容器大約會消耗12M內存,比起logstash相當輕量級。
方案選擇
Kubernetes官方提供了ELK的日誌收集解決方案,但是這種方案並不適合所有的業務場景,它本身就有一些侷限性,例如:
-
所有日誌都必須是out前臺輸出,真實業務場景中無法保證所有日誌都在前臺輸出
-
只能有一個日誌輸出文件,而真實業務場景中往往有多個日誌輸出文件
-
Fluentd並不是常用的日誌收集工具,我們更習慣用logstash,現使用filebeat替代
-
我們已經有自己的ELK集羣且有專人維護,沒有必要再在kubernetes上做一個日誌收集服務
基於以上幾個原因,我們決定使用自己的ELK集羣。
K8S日誌收集解決方案
方案1 每個app的鏡像中都集成日誌收集組件
優點: 部署方便,kubernetes的yaml文件無須特別配置,可以爲每個app自定義日誌收集配置
缺點: 強耦合,不方便應用和日誌收集組件升級和維護且會導致鏡像過大
方案2 單獨創建一個日誌收集組件跟app的容器一起運行在同一個pod中
優點: 低耦合,擴展性強,方便維護和升級
缺點: 需要對kubernetes的yaml文件進行單獨配置,略顯繁瑣
方案3 將所有的Pod的日誌都掛載到宿主機上,每臺主機上單獨起一個日誌收集Pod
優點: 完全解耦,性能最高,管理起來最方便
缺點: 需要統一日誌收集規則,目錄和輸出方式
綜合以上優缺點,我們選擇使用方案二。該方案在擴展性、個性化、部署和後期維護方面都能做到均衡,因此選擇該方案。
我們創建了自己的logstash鏡像。創建過程和使用方式見:
https://github.com/rootsongjc/docker-images
鏡像地址:
index.tenxcloud.com/jimmy/filebeat:5.4.0
測試
我們部署一個應用對logstash的日誌收集功能進行測試。
創建應用yaml文件fielbeat-test.yaml。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: filebeat-test
namespace: default
spec:
replicas: 3
template:
metadata:
labels:
k8s-app: filebeat-test
spec:
containers:
– image: sz-pg-oam-docker-hub-001.tendcloud.com/library/filebeat:5.4.0
name: filebeat
volumeMounts:
– name: app-logs
mountPath: /log
– name: filebeat-config
mountPath: /etc/filebeat/
– image: sz-pg-oam-docker-hub-001.tendcloud.com/library/analytics-docker-test:Build_8
name : app
ports:
– containerPort: 80
volumeMounts:
– name: app-logs
mountPath: /usr/local/TalkingData/logs
volumes:
– name: app-logs
emptyDir: {}
– name: filebeat-config
configMap:
name: filebeat-config
—
apiVersion: v1
kind: Service
metadata:
name: filebeat-test
labels:
app: filebeat-test
spec:
ports:
– port: 80
protocol: TCP
name: http
selector:
run: filebeat-test
—
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-config
data:
filebeat.yml: |
filebeat.prospectors:
– input_type: log
paths:
– “/log/*”
– “/log/usermange/common/*”
output.elasticsearch:
hosts: [“172.23.5.255:9200”]
username: “elastic”
password: “changeme”
index: “filebeat-docker-test”
注意事項
-
將app的/usr/local/TalkingData/logs目錄掛載到logstash的/log目錄下。
-
Filebeat容器大概需要10M左右內存。
-
該文件可以在manifests/test/filebeat-test.yaml找到。
-
我使用了自己的私有鏡像倉庫,測試時請換成自己的應用鏡像。
-
filebeat鏡像製作請參考https://github.com/rootsongjc/docker-images
創建應用
部署Deployment
kubectl create -f filebeat-test.yaml
查看http://172.23.5.255:9200/_cat/indices將可以看到列表有這樣的indices:
green open filebeat-docker-test 7xPEwEbUQRirk8oDX36gAA 5 1 2151 0 1.6mb 841.8kb
訪問Kibana的web頁面,查看filebeat-docker-test的索引,可以看到filebeat收集到了app日誌。