本文主要介绍了在k8s中使用filebeat、kafka、logstash、elasticsearch、kibana进行日志收集
更新于 2021-03-27
架构方案
架构
整体收集方案使用如下的组件:
filebeat
:采集节点和容器日志,发送到kafka;kafka
:接收filebeat发送的日志消息;logstash
:从kafka中消费日志消息并进行处理;elasticsearch
:进行日志存储;kibana
:日志可视化展示;
日志文件 –> filebeat –> kafka –> logstash –> elasticsearch –> kibana
版本选择
filebeat
:7.6.2;kafka
:2.12-2.5.0;zookeeper
:3.5.7;logstash
:7.8.0;elasticsearch
:7.8.0;kibana
:7.8.0;
方案可能存在的问题
这套日志收集方案可能存在下面的问题:
- elasticsearch可能存在瓶颈(es还需要进一步调优);
- logstash会根据写入es的速度调整消息消费的速度,所有kafka有时候会出现消息堆积的情况;
- ……
准备工作
这里使用nfs作为底层存储,相关的创建方法可以参考:在k8s中使用nfs存储,当然也可以使用其他的存储系统。
使用下面的yaml文件创建一个namespace:
1 | # namesapce.yaml |
1 | kubectl apply -f namespace.yaml |
elasticsearch开启x-pack认证功能,这里将elasticsearch的密码保存在secret资源中:
1 | espassword="elastic" |
这里讲elasticsearch密码设置为:
elastic
部署elasticsearch
部署相关资源
1 | # elasticsearch-config.yaml |
配置中的相关参数解释:
cluster.name
:设置es集群名称,用于唯一标识一个集群;network.host
:监听的地址;discovery.seed_hosts
:节点发现方式;xpack.security.enabled
起用xpack安全组件;cluster.routing.allocation.disk.threshold_enabled
是否启动磁盘分配器;
cluster.routing.allocation.disk.threshold_enabled
这个参数这里设置为false,表示关闭磁盘分配器,这样es可以使用全部磁盘空间。默认情况下当磁盘空间大于85%后,es就不能再创建分片了。这个参数在es使用同一个后端存储的时候应该调节一下。相关文档
es启用了x-pack密码认证,并且通过脚本检查es是否正常启动。我这里将es https通信方式注释掉了,如果有需要可以生成相关证书并起用https配置。直接运行下面的命令创建es配置:
1 | kubectl apply -f elasticsearch-config.yaml |
使用下面的yaml文件创建一个namespace:
1 | # elasticsearch-cluster.yaml |
es集群使用了statefulset方式部署,其中storageclasslogging-storageclass
需要自己手动创建,执行下面的命令完成部署。
1 | kubectl apply -f elasticsearch-cluster.yaml |
1 | # elasticsearch-service.yaml |
执行下面的命令完成部署:
1 | kubeclt apply -f elasticsearch-service.yaml |
检查
首先确保所有的pod都处于running状态:
1 | kubectl get pod -n logging | grep es |

然后执行下面的命令:
1 | kubectl logs -f es-logging-1 -n logging -c es-logging |
如果输出的日志中有Cluster health status changed from [YELLOW] to [GREEN]
,说明集群正常了。
部署kafka
部署zookeeper
1 | # zookeeper-cluster.yaml |
使用下面的命令完成部署:
1 | kubectl apply -f zookeeper-cluster.yaml |
1 | # zookeeper-service.yaml |
执行下面命令完成部署:
1 | kubectl apply -f zookeeper-service.yaml |
部署kafka
1 | # kafka-cluster.yaml |
使用下面的命令完成部署:
1 | kubectl apply -f kafka-cluster.yaml |
1 | # kafka-service.yaml |
执行下面命令完成部署:
1 | kubectl apply -f kafka-service.yaml |
kafka-manager是kafka的一个web管理平台,这里部署一下方便在有需要时进行管理。
1 | # kafka-manager.yaml |
执行下面命令完成部署:
1 | kubectl apply -f kafka-manager.yaml |
1 | # kafka-manager-ingress.yaml |
执行下面的命令完成创建:
1 | kubectl apply -f kafka-manager-ingress.yaml |
检查服务
检查所有的pod都正常运行:
1 | kubectl get pod,svc,ingress -n logging | grep -E 'kafka|zk' |

创建nginx配置
在nginx服务器上增加kafka-manager配置,代理kafka服务:
1 | # /etc/nginx/conf.d/kafka-manager.conf |
检查配置并重载nginx:
1 | nginx -t |
访问并配置kafka-manager
通过浏览器访问kafka-manager的域名kafka-manager.example.com
即可进入kafka-manager的控制页面,点击上边的Cluster
,然后选择Add Cluster
添加kafka集群,需要填入下面几个信息:


最后点击save
后集群信息添加完成。
部署logstash
创建logstash配置
logstash相关的配置文件可以在logstash配置文件 找到,这里需要将efk-template.json
, init_efk.sh
, k8s-log.json
, logstash.conf
, logstash.yml
, systemd-log.json
放入一个目录下,例如logstash-conf
下:
efk-template.json
:定义的是针对索引的日志策略;init_efk.sh
:操作es ,初始化一些配置;k8s-log.json
:收集k8s日志的配置;logstash.conf
:logstash的流水线配置;logstash.yml
:logstash配置文件;systemd-log.json
:收集系统日志的配置;
然后执行下面的命令:
1 | kubectl create configmap logstash-logging-config --from-file=./logstash-conf/ -n logging |

部署logstash
logstash不需要很多实例,所以使用deployment
方式部署,可以根据需要进行扩展:
1 | # logstash-deployment.yaml |
直接运行下面的命令部署logstash:
1 | kubectl apply -f logstash-deployment.yaml |
检查服务
确保所有的pod都处于Running状态:
1 | kubectl get pod -n logging | grep logstash |

部署filebeat
部署相关资源
1 | # filebeat-rbac.yaml |
执行下面的命令完成创建:
1 | kubectl apply -f filebeat-rbac.yaml |
1 | # filebeat-configmap.yaml |
在配置文件中,指定filebeat去读取docker日志和系统日志,并将日志发送给kafka。filebeat本身不对日志进行处理。执行下面的命令完成创建:
1 | kubectl apply -f filebeat-configmap.yaml |
每一个工作节点都需要收集日志,所以使用daemonset方式进行部署:
1 | # fileat-daemonset.yaml |
在yaml文件中,将/var/lib/docker/containers
和/var/log
挂载到了容器中,方便容器进行日志收集。
1 | kubectl apply -f filebeat-daemonset.yaml |
检查服务
确保所有pod都正常运行:
1 | kubectl get pod -n logging | grep filebeat |

部署kibana
部署相关资源
Kibana相关的配置文件可以在kibana配置文件 找到,这里需要将init_kibana.sh
放入一个目录下,例如kibana-conf
下,然后执行下面的命令:
1 | kubectl create configmap kibana-logging-init-config --from-file=./kibana-conf/init_kibana.sh -n logging |
1 | # kibana-config.yaml |
执行下面的命令完成部署:
1 | kubectl apply -f kibana-config.yaml |
1 | # kibana-deployment.yaml |
执行下面的命令完成部署:
1 | kubectl apply -f kibana-deployment.yaml |
1 | # kibana-service.yaml |
执行下面的命令完成创建:
1 | kubectl apply -f kibana-service.yaml |
1 | # kibana-ingress.yaml |
执行下面的命令完成创建:
1 | kubectl apply -f kibana-ingress.yaml |
配置nginx暴露服务
新增下面的nginx配置:
1 | # /etc/nginx/conf.d/kibana.conf |
检查并重载nginx:
1 | nginx -t |
检查服务
确保相关pod都处在Running状态:
1 | kubectl get pod,svc,ingress -n logging | grep kibana |

访问页面
通过浏览器访问kibana.example.com
即可进入kibana的页面,输入在部署elasticsearch中设置的初始账号密码:elastic/elastic
。然后在kibana中创建Index patterns
就可以了。

访问kafka-manager观察,发现消息topic也创建出来并且有消息在队列中被logstash消费:
