最近有一个新的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中查看日志的具体信息了。