使用Filebeat收集K8S应用日志
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日志。