赞
踩
全栈工程师开发手册 (作者:栾鹏)
架构系列文章
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,小编也分不清楚了。
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
我们构建的带有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
参考: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
配置文件在/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发送数据。
作为 Logging-agent 的 Fluentd 启动好了,现在要启动作为 Logging Backend 的 Elasticsearch 了,Elasticsearch 的主要作用是将日志信息进行分割,建立索引,配合下边 Kibana 展示数据使用。
elasticsearch的配置文件是elasticsearch.yml,在elasticsearch-6.1.0/config目录下,IP,port,集群都在这里面配置,每个配置项上面都有英文说明。具体深入需要自行查看官网文档。
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'
这样我们可以添加一个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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。