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}