技巧 | 使用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日志。

本文转移K8S技术社区-技巧 | 使用Filebeat收集K8S应用日志

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/679015

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。