使用filebeat收集kubernetes中的应用日志 - 宋净超的博客|Cloud Native|云原生布道师

标签: | 发表时间:2020-01-30 18:02 | 作者:
出处:https://jimmysong.io

前言

本文已同步更新到Github仓库 kubernetes-handbook中。

昨天写了篇文章 使用Logstash收集Kubernetes的应用日志,发现logstash十分消耗内存(大约500M),经人提醒改用filebeat(大约消耗10几M内存),因此重写一篇使用filebeat收集kubernetes中的应用日志。

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

方案选择

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

  • 所有日志都必须是out前台输出,真实业务场景中无法保证所有日志都在前台输出
  • 只能有一个日志输出文件,而真实业务场景中往往有多个日志输出文件
  • Fluentd并不是常用的日志收集工具,我们更习惯用logstash,现使用filebeat替代
  • 我们已经有自己的ELK集群且有专人维护,没有必要再在kubernetes上做一个日志收集服务

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

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

编号 方案 优点 缺点
1 每个app的镜像中都集成日志收集组件 部署方便,kubernetes的yaml文件无须特别配置,可以为每个app自定义日志收集配置 强耦合,不方便应用和日志收集组件升级和维护且会导致镜像过大
2 单独创建一个日志收集组件跟app的容器一起运行在同一个pod中 低耦合,扩展性强,方便维护和升级 需要对kubernetes的yaml文件进行单独配置,略显繁琐
3 将所有的Pod的日志都挂载到宿主机上,每台主机上单独起一个日志收集Pod 完全解耦,性能最高,管理起来最方便 需要统一日志收集规则,目录和输出方式

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

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

logstash日志收集架构图

我们创建了自己的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镜像制作参考

创建应用

部署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日志。

Kibana页面

「真诚赞赏,手留余香」


相关 [filebeat kubernetes 应用] 推荐:

使用filebeat收集kubernetes中的应用日志 - 宋净超的博客|Cloud Native|云原生布道师

- -
本文已同步更新到Github仓库. kubernetes-handbook中. 使用Logstash收集Kubernetes的应用日志,发现logstash十分消耗内存(大约500M),经人提醒改用filebeat(大约消耗10几M内存),因此重写一篇使用filebeat收集kubernetes中的应用日志.

Filebeat Multiline

- - 让一切随风
Filebeat获取的文件可能包含跨多行文本的消息,例如,多行消息在包含Java堆栈跟踪的文件中很常见. 为了正确处理这些多行事件,你需要在filebeat.yml中配置multiline以指定哪一行是单个事件的一部分. 在filebeat.yml的filebeat.inputs区域指定怎样处理跨多行的消息.

使用 Kubernetes 部署 Flink 应用

- - 张吉的博客
Kubernetes 是目前非常流行的容器编排系统,在其之上可以运行 Web 服务、大数据处理等各类应用. 这些应用被打包在一个个非常轻量的容器中,我们通过声明的方式来告知 Kubernetes 要如何部署和扩容这些程序,并对外提供服务. Flink 同样是非常流行的分布式处理框架,它也可以运行在 Kubernetes 之上.

elasticsearch和filebeat学习笔记

- -
elasticsearch安装、维护以及Filebeat module编写相关的笔记,备忘. 全文检索: q=first. 单字段全文检索:q=user:prismcdn. 单字段精确检索:q=user:”prismcdn”. 多个检索条件的组合:NOT、AND、OR、(、),如q=user:(“prismcdn” OR “hello”) AND NOT mesg:first.

Filebeat 的 Registry 文件解读

- - IT瘾-dev
你可能没有注意但很重要的filebeat小知识. Filebeat会将自己处理日志文件的进度信息写入到registry文件中,以保证filebeat在重启之后能够接着处理未处理过的数据,而无需从头开始. registry文件内容为一个list,list里的每个元素都是一个字典,字典的格式如下:. source:记录采集日志的完整路径.

Kubernetes & Microservice

- - 午夜咖啡
这是前一段时间在一个微服务的 meetup 上的分享,整理成文章发布出来. 谈微服务之前,先澄清一下概念. 微服务这个词的准确定义很难,不同的人有不同的人的看法. 比如一个朋友是『微服务原教旨主义者』,坚持微服务一定是无状态的 http API 服务,其他的都是『邪魔歪道』,它和 SOA,RPC,分布式系统之间有明显的分界.

将 Java 应用容器化改造并迁移到 Kubernetes 平台

- - IT瘾-dev
为了能够适应容器云平台的管理模式和管理理念,应用系统需要完成容器化的改造过程. 对于新开发的应用,建议直接基于微服务架构进行容器化的应用开发;对于已经运行多年的传统应用系统,也应该逐步将其改造成能够部署到容器云平台上的容器化应用. 本文针对传统的Java 应用,对如何将应用进行容器化改造和迁移到Kubernetes 平台上进行说明.

使用 Kafka、Debezium 和 Kubernetes 实现应用现代化的模式

- - InfoQ - 促进软件开发领域知识与创新的传播
本文最初发表于 RedHat 的开发者站点,经原作者 Bilgin Ibryam 许可,由 InfoQ 中文站翻译分享. “我们建造计算机的方式与建造城市的方式是一样的,那就是随着时间的推移,依然毫无计划,并且要建造在废墟之上. Ellen Ullman 在 1998 年写下了这样一句话,但它今天依然适用于我们构建现代应用程序的方式,那就是,随着时间的推移,我们要在遗留的软件上构建应用,而且仅仅有短期的计划.

日志实时收集之FileBeat+Kafka

- - lxw的大数据田地
之前,我们的某一个业务用于实时日志收集处理的架构大概是这样的:. 在日志的产生端(LogServer服务器),都部署了FlumeAgent,实时监控产生的日志,然后发送至Kafka. 经过观察,每一个FlumeAgent都占用了较大的系统资源(至少会占用一颗CPU 50%以上的资源). 而另外一个业务,LogServer压力大,CPU资源尤其紧张,如果要实时收集分析日志,那么就需要一个更轻量级、占用资源更少的日志收集框架,于是我试用了一下Filebeat.

替代ELK:ClickHouse+Kafka+FileBeat才是最绝的

- -
saas 服务未来会面临数据安全、合规等问题. 公司的业务需要沉淀一套私有化部署能力,帮助业务提升行业竞争力. 为了完善平台系统能力、我们需要沉淀一套数据体系帮助运营分析活动效果、提升运营能力. 然而在实际的开发过程中,如果直接部署一套大数据体系,对于使用者来说将是一笔比较大的服务器开销. 为此我们选用折中方案完善数据分析能力.