DataStreams+logstash+ILM进行日志定时删除,节省硬盘资源
背景
目前所有的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就行了
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}}-aimp-frontend-v2-ux"
output.logstash:
hosts: ["{{ .Values.logs.logstash.host }}:{{ .Values.logs.logstash.beatport }}"]