使用Filebeat搜集Kubernetes的应用日志

优采云 发布时间: 2020-08-12 03:40

  前言

  在进行日志搜集的过程中,我们首先想到的是使用Logstash,因为它是ELK stack中的重要成员,但是在测试过程中发觉,Logstash是基于JDK的,在没有形成日志的情况单纯启动Logstash就大约要消耗500M显存,在每位Pod中都启动一个日志搜集组件的情况下,使用logstash有点浪费系统资源,经人推荐我们选择使用Filebeat取代,经测试单独启动Filebeat容器大约会消耗12M显存,比起logstash相当轻量级。

  方案选择

  Kubernetes官方提供了EFK的日志搜集解决方案,但是这些方案并不适宜所有的业务场景,它本身就有一些局限性,例如:

  基于以上几个缘由,我们决定使用自己的ELK集群。

  Kubernetes集群中的日志搜集解决方案

  编号方案优点缺点

  1

  每个app的镜像中都集成日志搜集组件

  部署便捷,kubernetes的yaml文件无须非常配置,可以为每位app自定义日志搜集配置

  强耦合,不便捷应用和日志搜集组件升级和维护且会导致镜像过大

  2

  单独创建一个日志搜集组件跟app的容器一起运行在同一个pod中

  低耦合,扩展性强,方便维护和升级

  需要对kubernetes的yaml文件进行单独配置,略显冗长

  3

  将所有的Pod的日志都挂载到宿主机上,每台主机上单独起一个日志搜集Pod

  完全前馈,性能最高,管理上去最方便

  需要统一日志搜集规则,目录和输出形式

  综合以上优缺点,我们选择使用方案二。

  该方案在扩展性、个性化、部署和后期维护方面都能做到均衡,因此选择该方案。

  

  我们创建了自己的logstash镜像。创建过程和使用方法见

  镜像地址:/jimmy/filebeat:5.4.0

  测试

  我们布署一个应用filebeat来搜集日志的功能测试。

  创建应用yaml文件filebeat-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-test"

  说明

  该文件中收录了配置文件filebeat的配置文件的ConfigMap,因此不需要再定义环境变量。

  当然你也可以不同ConfigMap,通过传统的传递环境变量的方法来配置filebeat。

  例如对filebeat的容器进行如下配置:

   containers:

- image: sz-pg-oam-docker-hub-001.tendcloud.com/library/filebeat:5.4.0

name: filebeat

volumeMounts:

- name: app-logs

mountPath: /log

env:

- name: PATHS

value: "/log/*"

- name: ES_SERVER

value: 172.23.5.255:9200

- name: INDEX

value: logstash-docker

- name: INPUT_TYPE

value: log

  目前使用这些方法会有个问题,及时PATHS只能传递单个目录,如果想传递多个目录须要更改filebeat镜像的docker-entrypoint.sh脚本,对该环境变量进行解析降低filebeat.yml文件中的PATHS列表。

  推荐使用ConfigMap,这样filebeat的配置能够够更灵活。

  注意事项

  创建应用

  部署Deployment

  kubectl create -f filebeat-test.yaml

  查看:9200/_cat/indices将可以看见列表有这样的indices:

  green open filebeat-2017.05.17 1qatsSajSYqAV42_XYwLsQ 5 1 1189 0 1mb 588kb

  访问Kibana的web页面,查看filebeat-2017.05.17的索引,可以看见logstash搜集到了app日志。

  

  问题记录

  我们配置的index: "filebeat-test"没有生效,需要参考filebeat的配置文档,对filebeat的配置进一步优化。

  更多详情可以查看:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线