EFK的学习(Elasticsearch + Fluentd+ Kibana)

1. 安装部署参考https://www.qikqiak.com/post/install-efk-stack-on-k8s/

2. Fluentd对应的yaml配置方式,配置文件一般为fluentd-es-configmap.yaml

日志源配置

比如我们这里为了收集 Kubernetes 节点上的所有容器日志,就需要做如下的日志源配置:

<source>

@id fluentd-containers.log

@type tail

path /var/log/containers/*.log

pos_file /var/log/fluentd-containers.log.pos

time_format %Y-%m-%dT%H:%M:%S.%NZ

tag raw.kubernetes.*

format json

read_from_head true

</source>

上面配置部分参数说明如下:

  • id:表示引用该日志源的唯一标识符,该标识可用于进一步过滤和路由结构化日志数据
  • type:Fluentd 内置的指令,tail表示 Fluentd 从上次读取的位置通过 tail 不断获取数据,另外一个是http表示通过一个 GET 请求来收集数据。
  • path:tail类型下的特定参数,告诉 Fluentd 采集/var/log/containers目录下的所有日志,这是 docker 在 Kubernetes 节点上用来存储运行容器 stdout 输出日志数据的目录。
  • pos_file:检查点,如果 Fluentd 程序重新启动了,它将使用此文件中的位置来恢复日志数据收集。
  • tag:用来将日志源与目标或者过滤器匹配的自定义字符串,Fluentd 匹配源/目标标签来路由日志数据。

路由配置

上面是日志源的配置,接下来看看如何将日志数据发送到 Elasticsearch:

<match **>

@id elasticsearch

@type elasticsearch

@log_level info

include_tag_key true

type_name fluentd

host "#{ENV['OUTPUT_HOST']}"

port "#{ENV['OUTPUT_PORT']}"

logstash_format true

<buffer>

@type file

path /var/log/fluentd-buffers/kubernetes.system.buffer

flush_mode interval

retry_type exponential_backoff

flush_thread_count 2

flush_interval 5s

retry_forever

retry_max_interval 30

chunk_limit_size "#{ENV['OUTPUT_BUFFER_CHUNK_LIMIT']}"

queue_limit_length "#{ENV['OUTPUT_BUFFER_QUEUE_LIMIT']}"

overflow_action block

</buffer>

  • match:标识一个目标标签,后面是一个匹配日志源的正则表达式,我们这里想要捕获所有的日志并将它们发送给 Elasticsearch,所以需要配置成**。
  • id:目标的一个唯一标识符。
  • type:支持的输出插件标识符,我们这里要输出到 Elasticsearch,所以配置成 elasticsearch,这是 Fluentd 的一个内置插件。
  • log_level:指定要捕获的日志级别,我们这里配置成info,表示任何该级别或者该级别以上(INFO、WARNING、ERROR)的日志都将被路由到 Elsasticsearch。
  • host/port:定义 Elasticsearch 的地址,也可以配置认证信息,我们的 Elasticsearch 不需要认证,所以这里直接指定 host 和 port 即可。
  • logstash_format:Elasticsearch 服务对日志数据构建反向索引进行搜索,将 logstash_format 设置为true,Fluentd 将会以 logstash 格式来转发结构化的日志数据。
  • Buffer: Fluentd 允许在目标不可用时进行缓存,比如,如果网络出现故障或者 Elasticsearch 不可用的时候。缓冲区配置也有助于降低磁盘的 IO。

3. Elasticsearch数据存储 

日志数据是存放于 Elasticsearch POD中,但是默认情况下它使用的是emptyDir存储类型,所以当 POD被删除或重新调度时,日志数据也就丢失了。以下讲解使用NFS 服务器手动(静态)创建PV 持久化保存日志数据的例子。

ES数据写入原理

es建索引写入数据,数据最先是存在内存buffer里的,然后再刷入到lucene的底层文件segment中;
写入segment完毕后再执行refresh操作,refresh操作后,数据将commit到磁盘中。
数据刷入到了磁盘,就可以执行查询操作了。

ES数据持久化

如何创建NFS服务器参考:

https://github.com/easzlab/kubeasz/blob/master/docs/guide/nfs-server.md

ES索引操作

具体命令参考:https://blog.csdn.net/hong2511/article/details/81808517

 

查用的es操作命令(查询时以实际ip为准)

 

9200作为Http协议端口,用于节点和外部通讯。
9300作为Tcp协议端口,用于节点与节点之间、节点与TCPClient之间的通讯。

 

常用用_cat API检测集群是否健康。 确保9200端口号可用:curl  localhost:9200/_cat/health?V

 

获取集群的节点列表:curl  localhost:9200/_cat/nodes?V

 

列出所有索引:curl localhost:9200/_cat/indices?V

 

删除索引

curl -XDELETE http://localhost:9200/twitter,my_index

curl -XDELETE http://localhost:9200/*

 

创建索引

curl -XPUT 'localhost:9200/customer?pretty'

往集群索引中插入数据

curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '

  {

           "name": "John Doe"

}'

获取刚刚插入的数据curl -XGET 'localhost:9200/customer/external/1?pretty'

更新索引

id为1数据的name字段更新为Jane Doe同时增加字段age为20

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '

  {

    "doc": { "name": "Jane Doe", "age": 20 }

  }'

 

 

索引操作的通用格式

curl -X<REST Verb> <Node>:<Port>/<Index>/<Type>/<ID>

  <REST Verb>:REST风格的语法谓词

  <Node>:节点ip

  <port>:节点端口号,默认9200

  <Index>:索引名

  <Type>:索引类型

  <ID>:操作对象的ID号

 

$ curl localhost:9200/_cat

=^.^=

/_cat/allocation

/_cat/shards

/_cat/shards/{index}

/_cat/master

/_cat/nodes

/_cat/indices

/_cat/indices/{index}

/_cat/segments

/_cat/segments/{index}

/_cat/count

/_cat/count/{index}

/_cat/recovery

/_cat/recovery/{index}

/_cat/health

/_cat/pending_tasks

/_cat/aliases

/_cat/aliases/{alias}

/_cat/thread_pool

/_cat/plugins

/_cat/fielddata

/_cat/fielddata/{fields}

/_cat/nodeattrs

/_cat/repositories

/_cat/snapshots/{repository}

上一篇:Redis消息订阅发布介绍


下一篇:Python日志记录 – 当前安装的记录器/处理程序的概述