k8s笔记11–基于fluentd-kafka-es的日志收集方案 介绍了使用 fluentd 采集 k8s 集群日志的方法,但 fluentd 使用 CPU & Memory 效率相对较低,因此考虑采用更加轻量级的 fluent-bit 采集集群日志。本文介绍 fluent-bit 的安装,以及写入日志到 es 和 kafka 的具体方法。
helm repo add fluent https://fluent.github.io/helm-charts
helm fetch fluent/fluent-bit
tar -zxvf fluent-bit-0.20.5.tgz
解压后可以修改默认的 values.yaml 文件, 按需输出到 es 或者 kafka 集群
2.1 copy values.yaml 文件为 values-dev-es.yaml
2.2 修改配置文件 values-dev-es.yaml 输出到 es 集群
在 output 中配置es信息,如下所示:
## https://docs.fluentbit.io/manual/pipeline/outputs
outputs: |
[OUTPUT]
Name es
Match kube.*
Host 192.xx.xx.71
Port 9200
Type _doc
HTTP_User your_es_user
HTTP_Passwd your_es_pwd
Logstash_Format Off
Retry_Limit False
Index fluent-bit
2.3 部署到集群
helm -n lens-metrics upgrade --install fluent-bit fluent/fluent-bit -f values-dev-es.yaml
2.4 查看fluent-bit 相关信息
xghome:~$ kubectl -n lens-metrics get ds|grep fluent-bit
fluent-bit 1 1 1 1 1 <none> 5d4h
xghome:~$ kubectl -n lens-metrics get cm|grep fluent-bit
fluent-bit 2 5d4h
xghome:~$ helm -n lens-metrics list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
fluent-bit lens-metrics 6 2022-08-16 14:23:55.372423789 +0800 CST deployed fluent-bit-0.20.5 1.9.7
2.5 测试
服务部署完成后,过一段时间就可以在 es 中看到采集的日志,如下所示:
3.1 copy values.yaml 文件为 values-dev-kafka.yaml
3.2 修改配置文件 values-dev-kafka.yaml 输出到 kafka 集群
在 output 中配置es信息,如下所示:
## https://docs.fluentbit.io/manual/pipeline/outputs
outputs: |
[OUTPUT]
Name kafka
Match *
Brokers 192.168.2.11:9092
Topics k8s-log
3.3 部署到集群
helm -n lens-metrics upgrade --install fluent-bit fluent/fluent-bit -f values-dev-kafka.yaml
3.4 查看 fluent-bit 信息
xghome:~$ kubectl -n lens-metrics get ds|grep fluent-bit
fluent-bit 1 1 0 1 0 <none> 28s
xghome:~$ kubectl -n lens-metrics get cm|grep fluent-bit
fluent-bit 2 38s
xghome:~$ helm -n lens-metrics list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
fluent-bit lens-metrics 1 2022-08-21 17:49:01.985449435 +0800 CST deployed fluent-bit-0.20.5 1.9.7
3.5 查看 kafka 中 topic 信息
服务部署完成后,过一段时间就可以在 kafka 中看到采集的日志,如下所示:
当日志采集到 kafka 集群后,我们可以使用 logstash 或者 gohangout 将日志进一步写入到es 集群。具体可以参考如下博文:
elk笔记24–用gohangout替代logstash消费日志
elk笔记5.1–logstash使用
若直接向 es 写入数据,需要设置 Logstash_Format Off ,否则会自动生成 logstash-2022.08.16 格式的索引
默认会采集很多不必要的pod 字段,因此需要 filter,例如 Labels Off 和 Annotations Off 会去掉Label 和 Annotation 信息, 更多内容可以参考 docs.fluentbit.io/manual/pipeline/filters/kubernetes
使用DaemonSet 部署的agent 默认不会部署在有污点的节点上,例如master节点和用户加污点的节点。为了让这类节点能正常部署上agent,需要在 DaemonSet 中加如下参数(允许任何污点):
spec:
template:
spec:
tolerations:
- operator: Exists
fluent-bit 添加字段
如果需要加入字段,可以通过 FILTER 的modify 模块来添加字段,例如给不同的集群加上对应的 cluster 信息,那么可以用如下方式
[FILTER]
Name modify
Match kube.*
Add cluster cbbfe1db71b324387ab4fc47d4f208301
加入成功后 kafka 里面的数据如下:
fluent-bit 过滤掉指定命名空间日志
如果需要过滤掉某些命名空间日志,只需要在INPUT中增加 Exclude_Path即可,如下过滤掉 monitoring 和 kube-system 命名空间的日志
inputs: |
[INPUT]
Name tail
Path /var/log/containers/*.log
Exclude_Path /var/log/containers/*_monitoring_*.log,/var/log/containers/*_kube-system_*.log
multiline.parser docker, cri
Tag kube.*
Mem_Buf_Limit 50MB
Skip_Long_Lines On
软件环境:
elk 7.15.2
kafka 7.15.2
k8s 1.23.6
fluent-bit 0.20.5
参考文档:
fluent-bit 官方文档 installation/Kubernetes
fluent-bit 官方文档 outputs/elasticsearch
elk笔记24–用gohangout替代logstash消费日志
elk笔记5.1–logstash使用
k8s笔记11–基于fluentd-kafka-es的日志收集方案