作者/李康
前言
看到这篇文章的同学相信对K8S已经有一定的了解了,现在很多公司都使用K8S来部署自己的应用,使用K8S来发布应用确实很好,但是日志查看方面还是有诸多的不便,比如主机权限不能随便开放,并且公司层面的K8S集群内应用数和副本数都比较多,问题定位时不知道从那个副本的日志开始查看,还有一个是容器的重启后想查看重启之前的日志等等问题,造成了在K8S集群查看日志的诸多不便。所以引申出下面的方案设计。
方案说明
此方案使用ELK+Filebeat的架构。本来ELK就能实现日志采集,查询和展示,由于Logstash资源占用比较大(800M+内存),官方使用GO语言重写了一个Filebeat实现了部分Logstash的功能,资源占用(30M+) 指数级的资源占用下降,但是日志解析方面还做得不到位,所以我们使用Filebeat采集日志,Logstash来进行解析的设计。Filebeat使用DaemonSet部署负责收集每个节点的所有应用日志数据上报 Logstash,Logstash对数据进行一次处理,推送到ES,最后使用Kibana进行展示。
架构图
画了一个简易架构图来说明:K8S的应用,默认会把标准输出日志,生成一个文件,通过软链接的方式挂载到节点主机的 /var/log/containers 目录,我们在每个节点部署一个Filebeat去采集这个目录下的内容就OK了。
安装部署
相关的chart已经上传,复制
https://github.com/zj-likang/ELK-F
进入github下载原码或者复制
https://gitee.com/zj_likang/ELK-F
进入码云下载。
我们这里使用helm来安装,主要是chart编写。如果需要了解学习 helm ,复制
https://helm.sh/docs/intro/quickstart/
进入helm的学习文档,chart包的安装命令在文章最后。
安装部署中的一些问题总结
ELK的部署不需要修改内容,这里讲讲Filebeat的采集配置内容,filebeat/values.yaml文件下的配置解释。
filebeat.yml: | filebeat.inputs: - type: container paths: - /var/log/containers/*.log processors: - add_kubernetes_metadata: host: ${NODE_NAME} matchers: - logs_path: logs_path: "/var/log/containers/" multiline.type: pattern multiline.pattern: '^[[:space:]]+(at|\.{3})[[:space:]]+\b|^Caused by:' multiline.negate: false multiline.match: after output.logstash: hosts: ["lsh-mcp-logstash-lsh-mcp-logstash"]
根据ES官方文档 容器类型日志采集,类型一定要设置成type:container,这样才会附带容器的一些信息:比如pod的命名空间,labels值等等,方便后面搜索过滤日志。
printf("hello world!");multiline.type: patternmultiline.pattern: '^[[:space:]]+(at|\.{3})[[:space:]]+\b|^Caused by:'multiline.negate: falsemultiline.match: after
multiline相关配置是多行合并,java等应用一个事件有时会输出成多行日志,不方便查看,使用此配置进行合并。
K8S标准输入文件的路径:paths:/var/log/containers/*.log
另外有一个需要特别注意的地方就是,K8S标准输出文件是一个经过两次软链接汇总到一起的文件,需要把两次软链接指向的目录都通过目录形式挂载到filebeat pod内,不然会采集不到内容。挂载配置如下:
volumeMounts: - name: data mountPath: /usr/share/filebeat/data - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true - name: data-docker-containers mountPath: /data/docker/containers - name: varlog mountPath: /var/log readOnly: true volumes: - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers - name: varlog hostPath: path: /var/log - name: data-docker-containers hostPath: path: /data/docker/containers
此部署的ELK,除Filebeat外都是单副本,采集所有的K8S pod标准输出日志,ES以pod标准输出文件名称创建index,如需要更多的副本,请自行修改values.yaml中的replicas:1
如果数据量大需要考虑添加缓存:kafka reids 等Filebeat数据推送到缓存,Logstash从缓存中取出数据处理到ES中。
Kibanan的端口设置的是:30961
如需要修改开放端口号请修改 kibana/values.yaml下的nodePort: 30961为自己想要开放的端口。
service: type: NodePort loadBalancerIP: "" port: 5601 nodePort: 30961
以上提到的内容都已经在chart中修改过了,只需要执行下面的安装命令就可以部署。
安装命令
使用helm3安装
1.安装ES
helm3 install elasticsearch lsh-mcp-elasticsearch
安装完成后查看pod运行情况。
2.安装Logstash
helm3 install logstash lsh-mcp-logstash
安装完成后查看pod运行情况。
3.安装Filebeat
helm3 install filebeat lsh-mcp-filebeat
安装完成后查看pod运行情况。
4.安装Kibana
helm3 install kibana lsh-mcp-kibana
安装完成后查看pod运行情况。
如果使用的是hlem2则命令是helm install --name elasticsearch lsh-mcp-elasticsearch其它同上,以helm开头--name指定安装名称,后面一个参数是文件夹名称。
最后的展示效果:
-End-