背景
目前所有的K8S上的容器日志都被收集到了我们的ELK上,随着时间的推移,ELK上的日志所占的存储空间越来越多,我们需要一个定时清理的策略,以节约硬盘资源。
我们主要配置以下ELK里的这几个地方
- 通过kibana新增一个lifecycle policies
- 通过kibana新增一个index template,注意配置DataStreams
- logstash 的logstashPipeline
- filebeat的filebeat.yml文件
简要配置Kibana上添加 Lifecycle Policies
1.点击菜单栏的【management】->点击【stack management】
2.点击DATA目录下的【Index Lifecycle Policies】
3.点击【Create policy】创建一个新的生命周期规则
4.测试的话,规则就随便配置一个每10分钟迭代一个新的,删除超过1小时的index
期望效果:
对应的index会从00001开始每隔10分钟往上+1,同时最多存在7个index。
Kibana上添加Index Templates
1.点击菜单栏的【management】->点击【stack management】
2.点击DATA目录下的【Index Management】
3.点击【Index Templates】小标签,【Create template】创建模板
4.index patterns匹配我们logstash上传来的index,比如192*
5.Data stream的配置按钮打开6.index settings配置上我们上一步添加的Lifecycle Policies
7.mappings参数需要配置【mapped fields】和【Dynamic Template】内容可以从logstash的配置里完整复制过来
8.其他的诸如component telmpalte 和Aliases都不用配置了。保存这个index template就行了
logstash配置
因为要动态生成index,所以要写一些filter规则,这里就不贴出来了。关键注意output里要设置
"action" => "create"和ilm_enabled => false
logstash.conf: | input { beats { port => 5044 } tcp { port => 9999 } udp { port => 9998 } } filter { json { source => "message" } if [app_name] { mutate { add_field => { "index_name" => "%{app_name}" } } } else { mutate { add_field => { "index_name" => "non_index_log" } } } } output { elasticsearch { hosts => ["http://elasticsearch-master-headless:9200"] index => "%{index_name}" action => "create" ilm_enabled => false } stdout { codec => rubydebug } }
filebeat配置
因为有一些日志是通过filebeat传上来的,所以filebeat也要进行少量的配置,传一个app_name到logstash用于生成index
filebeat.inputs: - type: log paths: - "/log/*.log" processors: - decode_json_fields: fields: ["message"] process_array: false max_depth: 1 target: "" overwrite_keys: false - add_fields: target: '' fields: app_name: "{{ .Values.nodeSelector.internet_ip}}-frontend-v2-ux" output.logstash: hosts: ["{{ .Values.logs.logstash.host }}:{{ .Values.logs.logstash.beatport }}"]