一、K8S日志采集难点
在 Kubernetes 中,日志采集相比传统虚拟机、物理机方式要复杂很多,最根本的原因是 Kubernetes 把底层异常屏蔽,提供更加细粒度的资源调度,向上提供稳定、动态的环境。因此日志采集面对的是更加丰富、动态的环境,需要考虑的点也更加的多。
- 对于运行时间很短的 Job 类应用,从启动到停止只有几秒的时间,如何保证日志采集的实时性能够跟上而且数据不丢?
- K8s 一般推荐使用大规格节点,每个节点可以运行 10-100+ 的容器,如何在资源消耗尽可能低的情况下采集 100+ 的容器?
- 在 K8s 中,应用都以 yaml 的方式部署,而日志采集还是以手工的配置文件形式为主,如何能够让日志采集以 K8s 的方式进行部署?
二、什么是EFK
EFK是三个软件的集合,通过三个软件构建了一个用于对各日志数据进行收集、分析、展示的平台
elasticsearch简称es:用来存储和检索数据
filebeat:用于收集网络中各个服务上的数据,将收集的数据存储到es中
kibana:用来展示数据,数据源自es
三、 elasticsearch
3.1 概述
Elasticsearch 是一个分布式搜索引擎,底层基于全文搜索引擎 Apache Lucene 实现。Elasticsearch 屏蔽了 Lucene 的底层细节,提供了分布式特性,同时对外提供了 Restful API。Elasticsearch 以其易用性迅速赢得了许多用户,被用在网站搜索、日志分析等诸多方面。由于 ES 强大的横向扩展能力,甚至很多人也会直接把 ES 当做 NoSQL 来用。
3.2 基本概念
将Elasticsearch和关系型数据术语对照表:
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
一个 Elasticsearch 集群可以包含多个索引,也就是说其中包含了很多类型。这些类型中包含了很多的文档,然后每个文档中又包含了很多的字段。Elasticsearch的交互,可以使用Java API,也可以直接使用HTTP的Restful API方式,比如我们打算插入一条记录,可以简单发送一个HTTP的请求:
PUT /megacorp/employee/1
{
"name" : "John",
"sex" : "Male",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
更新,查询也是类似这样的操作。
3.3 架构
1、第一层:Gateway层:elasticsearch支持的索引数据存储格式。Elasticsearch关闭再启动时或从gateway里面读取数据。
2、第二层:Distributed lucene directory层:elasticsearch是基于lucenu框架开发的。
3、第三层:elasticsearch对数据的加工处理方式,mapping:定义索引下面type字段的处理规则,比如:索引如何建立、数据类型等等,相当于关系型数据里面的schema。River是一个运行在elasticsearch集群内部的一个插件,主要是用来从外部获取异构数据,然后在elasticsearch里创建索引,常见的插件有rabbitmq、twitter river。index module(索引模块)控制index相关的所有方面,search module控制所有检索有关的方面。
4、第四层:是elasticsearch自动发现节点的机制。假如master出现了故障,不能工作了,那么其它节点会自动选举,然后产生一个新的master。
5、第五层:是elasticsearch的脚本执行功能,有了这个功能很方便的对查询出来的数据进行加工处理,脚本类型:mvel、js、python等。
6、第六层:3rd plugins:意思是elasticsearch支持安装很多第三方插件。
7、第七层:是elasticsearch的交互方式,支持三种协议:thrift、memcached、http,其中elasticsearch是默认用http协议传输的。
8、Restful Style API:是elasticse