如何在Kubernetes的ECK中为Elastic Agent(Fleet)配置自定义ILM策略?
在ECK的Fleet环境中配置Elastic Agent自定义ILM策略
你之前在Elasticsearch配置块中添加setup.ilm无效的原因很明确:setup.ilm是独立部署Beats的配置项,既不属于Elasticsearch节点配置,也不会被Fleet管理的Elastic Agent读取,自然无法生效。
以下是适配ECK+Fleet环境的可行方案,实现每日滚动、保留90天数据的ILM策略:
步骤1:创建自定义ILM策略
首先需要在Elasticsearch中创建目标ILM策略,你可以选择手动执行API调用,或者用K8s Job自动化操作。
方式1:手动通过API创建
- 进入Elasticsearch Pod:
kubectl exec -it <elasticsearch-pod-name> -- bash
- 执行curl命令创建策略(替换
${ELASTIC_PASSWORD}为实际密码,可从elasticsearch-es-elastic-userSecret中获取):
curl -u elastic:${ELASTIC_PASSWORD} -X PUT "http://localhost:9200/_ilm/policy/logs-90d-rollover" -H 'Content-Type: application/json' -d '{ "policy": { "phases": { "hot": { "actions": { "rollover": { "max_age": "1d" } } }, "delete": { "min_age": "90d", "actions": { "delete": {} } } } } }'
方式2:用K8s Job自动化创建
创建一个Job资源,自动执行策略创建操作,避免手动登录Pod:
apiVersion: batch/v1 kind: Job metadata: name: create-logs-ilm-policy spec: template: spec: containers: - name: curl-client image: curlimages/curl:latest command: ["sh", "-c"] args: - > curl -u elastic:$(ELASTIC_PASSWORD) -X PUT "http://elasticsearch-es-http.default.svc:9200/_ilm/policy/logs-90d-rollover" -H 'Content-Type: application/json' -d '{ "policy": { "phases": { "hot": { "actions": { "rollover": { "max_age": "1d" } } }, "delete": { "min_age": "90d", "actions": { "delete": {} } } } } }' env: - name: ELASTIC_PASSWORD valueFrom: secretKeyRef: name: elasticsearch-es-elastic-user key: elastic restartPolicy: OnFailure
执行创建:
kubectl apply -f create-ilm-job.yaml
步骤2:关联ILM策略到Elastic Agent数据流
Fleet管理的Elastic Agent默认使用数据流存储数据,需要将ILM策略关联到对应数据流的索引模板中,有两种方式:
方式1:通过Fleet UI配置集成
- 登录Kibana的Fleet界面,进入目标集成(比如Kubernetes日志集成)的配置页面
- 展开「高级选项」,找到「索引模板设置」,添加以下配置:
index: lifecycle: name: logs-90d-rollover
- 保存配置,Agent会自动更新索引模板,后续生成的数据流将使用该ILM策略。
方式2:通过ECK AgentPolicy自定义资源配置
如果你用YAML管理Agent策略,直接在AgentPolicy资源的数据流配置中指定ILM策略:
apiVersion: agent.k8s.elastic.co/v1alpha1 kind: AgentPolicy metadata: name: kubernetes-logs-policy spec: agentTemplateRef: name: elastic-agent namespace: default policy: id: kubernetes-logs-policy name: Kubernetes Logs Policy inputs: - type: logfile id: kubernetes-container-logs name: Kubernetes Container Logs config: paths: - /var/log/containers/*.log processors: - add_kubernetes_metadata: {} streams: - data_stream: dataset: kubernetes.container_logs type: logs index_template: settings: index.lifecycle.name: logs-90d-rollover
执行更新:
kubectl apply -f agent-policy.yaml
注意事项
- Fleet管理的数据流会自动处理索引滚动,无需像独立Beats那样指定
pattern参数 - 若已有存量数据流,需要手动更新其关联的ILM策略:
curl -u elastic:${ELASTIC_PASSWORD} -X PUT "http://localhost:9200/_data_stream/logs-kubernetes.container_logs/_ilm/policy" -H 'Content-Type: application/json' -d '{ "policy": "logs-90d-rollover" }'
内容的提问来源于stack exchange,提问作者Daniel Paulus
相关产品推荐
相关产品推荐

