使用filebeat收集k8s集群中的应用日志


最近有一个新的k8s集群上线,在日志收集组件上有2个选择:

1. Logstash
2. Filebeat

logstash是之前用过的日志收集工具,同时logstash的生态也很丰富,大量的插件可以保证它在大部分的场景下都能游刃有余。但是logstash也有它的问题,典型的问题就是性能比较差以及对资源的使用较多;

filebeat则是组内同事推荐,相比于logstash,filebeat很年轻,所以功能比较单一。但是也因为功能单一,所以它相对很健壮,同时对于资源的使用也比较小。

最后考虑到新的集群硬件资源有限,所以决定选择filebeat作为该集群的日志收集组件。

方案选择

在kubernetes集群中常见的日志收集解决方案有:

编号 方案 优点 缺点
1 每个组件的镜像中集成日志收集组件 部署方便,可以针对于每一个组件做定制化配置。 日志收集和应用耦合性太强,不太适用于频繁更改、部署阶段的应用。
2 在组件运行的pod中,创建一个日志收集的容器 跟应用组件耦合性较低、扩展性强、方便维护和升级 需要对组件的charts进行单独配置。
3 将所有的pod的日志都挂载到宿主机上,每台主机上部署日志收集服务 完全解耦,管理方便 需要统一日志收集规则、目录和输出方式。

经过考虑之后,决定采用方案2。 该方案在扩展性、定制化、部署和后期维护这几个方面来说可以做到比较均衡,因此选择该方案。 部署方案如图:

同时,考虑到在国内访问docker hub比较慢,所以制作了自己的filebeat的镜像。镜像为:

example.com/tools/filebeat:7.4.1

测试

部署一个应用对filebeat的日志收集功能进行测试,应用的charts为:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: filebeat-test
  namespace: default
spec:
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: filebeat-test
    spec:
      containers:
        - image: example.com/tools/filebeat:7.4.1
           name: filebeat
           volumeMounts:
             - name: app-logs
                mountPath: /app/logs
             - name: filebeat-config
                mountPath: /etc/filebeat/
        - image: example.com/dev/helloworld:v0.1
           name : app
           ports:
           - containerPort: 80
           volumeMounts:
           - name: app-logs
             mountPath: /app/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:
      - "/app/logs/*"
    output.elasticsearch:
      hosts: ["192.168.1.100:9200", "192.168.1.101:9200"]
      protocol: https
      path: /elasticsearch
    timeout: 5

pod部署成功之后,在es的对应的index中就可以看到日志了,后面就可以在kibana中查看日志的具体信息了。