当前位置:   article > 正文

日志收集系统Elasticsearch,Fluentd , Kibana

日志收集系统

全栈工程师开发手册 (作者:栾鹏)
架构系列文章


Fluentd配置的官网地址:https://docs.fluentd.org/v0.12/articles/in_tail 其中Parser用来过滤日志

为什么做日志系统

首先,什么是日志? 日志就是程序产生的,遵循一定格式(通常包含时间戳)的文本数据。

通常日志由服务器生成,输出到不同的文件中,一般会有系统日志、 应用日志、安全日志。这些日志分散地存储在不同的机器上。

通常当系统发生故障时,工程师需要登录到各个服务器上,使用 grep / sed / awk 等 Linux 脚本工具去日志里查找故障原因。在没有日志系统的情况下,首先需要定位处理请求的服务器,如果这台服务器部署了多个实例,则需要去每个应用实例的日志目录下去找日志文件。每个应用实例还会设置日志滚动策略(如:每天生成一个文件),还有日志压缩归档策略等。

这样一系列流程下来,对于我们排查故障以及及时找到故障原因,造成了比较大的麻烦。因此,如果我们能把这些日志集中管理,并提供集中检索功能,不仅可以提高诊断的效率,同时对系统情况有个全面的理解,避免事后救火的被动。

我认为,日志数据在以下几方面具有非常重要的作用:

数据查找:通过检索日志信息,定位相应的 bug ,找出解决方案
服务诊断:通过对日志信息进行统计、分析,了解服务器的负荷和服务运行状态
数据分析:可以做进一步的数据分析,比如根据请求中的课程 id ,找出 TOP10 用户感兴趣课程。
针对这些问题,为了提供分布式的实时日志搜集和分析的监控系统,我们采用了业界通用的日志数据管理解决方案 - 它主要包括 Elasticsearch 、 Logstash 和 Kibana 三个系统。通常,业界把这套方案简称为ELK,取三个系统的首字母,但是我们实践之后将其进一步优化为EFK,F代表Filebeat,用以解决Logstash导致的问题。

其实Logstash 包含多种替代方案(Filebeat、Fluentd、rsyslog、syslog-ng 以及 Logagent。而EFK中的F究竟指Filebeat还是Fluentd,小编也分不清楚了。

架构

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

EFK

Elasticsearch,Fluentd和Kibana(EFK)组合允许收集,索引,搜索和可视化日志数据(visualize log data)。是目前比较主流的日志中心化,可视化并提供索引,搜索,分析的开软软件组合。免费使用,只有当data volumes增加时可能需要一个收费license。
Elasticsearch是一个数据搜索引擎和分布式NoSQL数据库的组合,提过日志的存储和搜索功能。Fluentd是一个消息采集,转化,转发工具,目的是提供中心化的日志服务。Kibana是一个带有强大数据整理,分析的web前端,将数据以可视化的方式呈现给用户。

本文主要介绍如何在k8s上搭建EFK。

github地址:https://github.com/626626cdllp/k8s/tree/master/EFK

kubectl create ns logging
kubectl create -f ./es/elasticsearch-sa.yml
kubectl create -f ./es/elasticsearch-rbac.yml
kubectl create -f ./es/elasticsearch-svc.yml
kubectl create -f ./es/elasticsearch-sts.yml
kubectl create -f ./fluentd/fluentd-sa.yml
kubectl create -f ./fluentd/fluentd-rbac.yml
kubectl create -f ./fluentd/fluentd-es-cm.yml
kubectl create -f ./fluentd/fluentd-es-ds.yml
kubectl create -f ./kibana/kibana-svc.yml
kubectl create -f ./kibana/kibana-dp.yml
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述

我们构建的带有elasticsearch插件的fluentd以DaemonSet的形式部署在每一个节点上,主要收集如下几种日志:

containers log: /var/log/containers/*.log
docker log: /var/log/docker.log
kubelet log: /var/log/kubelet.log
kube-proxy log: /var/log/kube-proxy.log
kube-apiserver log: /var/log/kube-apiserver.log
kube-controller-manager log: /var/log/kube-controller-manager.log
kube-scheduler log: /var/log/kube-scheduler.log

需要注意的是,有些教程中DaemonSet只会运行在标记有beta.kubernetes.io/fluentd-ds-ready=true标签的节点上,所以想要收集节点上的日志,您需要先将节点打上此标签。

kubectl label nodes 节点名 beta.kubernetes.io/fluentd-ds-ready=true
  • 1

参考:https://www.jianshu.com/p/92a4c11e77ba

容器日志存在形式

目前容器日志有两种输出形式:

stdout,stderr标准输出
这种形式的日志输出我们可以直接使用docker logs查看日志,k8s集群中同样集群可以使用kubectl logs类似的形式查看日志。

日志文件记录
这种日志输出我们无法从以上方法查看日志内容,只能tail日志文件查看。

EFK集群启动时会在每个机器启动一个Fluentd agent收集日志然后发送给Elasticsearch。

实现方式是每个agent挂载目录/var/lib/docker/containers使用fluentd的tail插件扫描每个容器日志文件,直接发送给Elasticsearch。

当然也可以把Fluentd agent起在业务同一个pod中共享volume然后实现对日志文件的收集发送给Elasticsearch

配置

fluentd配置

配置文件在/etc/fluent/fluent.conf和/etc/fluent/config.d/文件夹下

Fluentd 是以 DaemonSet 的形式运行在 Kubernetes 集群中,这样就可以保证集群中每个 Node 上都会启动一个 Fluentd,我们在 Master 节点创建 Fluented 服务,最终会在各个 Node 上运行。

配置文件为采集过滤数据的设置,其实是在fluentd-es-cm.yml文件中写入到configmap,然后pod再关联configmap来实现设定采集过滤哪些数据的。

其中fluentd-es-cm.yml文件中output.conf部分是配置向elasticsearch发送数据。

elasticsearch配置

作为 Logging-agent 的 Fluentd 启动好了,现在要启动作为 Logging Backend 的 Elasticsearch 了,Elasticsearch 的主要作用是将日志信息进行分割,建立索引,配合下边 Kibana 展示数据使用。

elasticsearch的配置文件是elasticsearch.yml,在elasticsearch-6.1.0/config目录下,IP,port,集群都在这里面配置,每个配置项上面都有英文说明。具体深入需要自行查看官网文档。

kibana配置

kibana的配置文件在config\kibana.yaml

我们这里通过将kibana.yml创建成configmap,然后再将configmap挂载成pod文件,来实现将外部配置文件,添加为内部文件。

打开kibana的网页,在discover中添加一个es的index匹配模式。

每一个数据集导入到Elasticsearch后会有一个索引匹配模式,一个索引匹配模式就是一个字符串包含可选的通配符,它能匹配多个索引。fluentd push到es的log数据index为logstash-2018.10.24格式,你可以通过下面的命令查看es所有的index

curl -X GET 'http://192.168.2.177:31001/_cat/indices?v'
  • 1

这样我们可以添加一个logstash-2018*的匹配模式,这样再进入可视化就能看到fluentd推送来的所有log了

Logstash数据集包含时间系列的数据,所以在点击Add New按钮创建完模式匹配后,确保Index contains time-based events复选框勾选,并在Time-field name下拉列表中选择@timestamp字段。

在这里插入图片描述

点击Discover页面展示Kibana的数据发现功能。

在这里插入图片描述

fluentd采集数据push到es后,我们可以在kibana中Selected Fields包含kubernetes.container_name、kubernetes.namespace_name、log、stream 这样就能直接看到我们在pod中打印的日志了,不过也是按照设定的时间周期,来周期性的显示本周期的数据。

在标签页面的正下方,有一个查询框用于搜索你的数据。搜索需要一个特定的查询语法,它们能让你创建自己的搜索,点击查询框右边的按钮能保存这些搜索。在查询框的下方,当前的索引匹配模式显示在一个下拉选中,选择下拉选以改变匹配模式。你能用字段名和你感兴趣的值构建一个搜索,数字类型的数据可使用比较操作符比如>、<、=等,你可使用AND、OR、 NOT逻辑符连接元素,必须是大写。

参考:https://blog.csdn.net/ming_311/article/details/50619859

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/442460
推荐阅读
相关标签
  

闽ICP备14008679号