问题描述
在使用ELK(Elasticsearch, Logstash, Kibana)时,注意到xpack monitoring已经被标记为即将废弃,建议使用其他解决方案。用户希望找到一个简单的解决方案,在Kubernetes上使用Metricbeat监控ELK,并且能够在任何地方部署。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案
以下是一个简单的解决方案,需要为每个被监控的实体部署一个额外的Metricbeat实例。这个方法也适用于其他非Kubernetes环境,比如使用docker-compose,只需要稍作调整。
- 部署一个sidecar容器来监控某个实体(在这个例子中是Logstash,但是对于Elasticsearch或Kibana来说,只需要替换监控模块和可能的指标端口即可)。
- 在logstash.yml(或elastic/kibana)中设置
xpack.monitoring.enabled: false
。 - 使用Metricbeat通过本地主机的9600端口获取指标。
- 使用挂载的configmaps配置Metricbeat。
以下是一个示例配置,假设没有使用TLS/RBAC连接到Elasticsearch,如果使用了TLS,需要相应地修改配置:
# Configmaps for metricbeat conf files
apiVersion: v1
kind: ConfigMap
metadata:
name: metricbeat-modules
namespace: logstash
data:
logstash-xpack.yml: |-
- module: logstash
xpack.enabled: true # 这是打开xpack监控指标导出的开关
period: 10s
hosts: ["localhost:9600"] # 使用pod内部的localhost连接到logstash的指标API
apiVersion: v1
kind: ConfigMap
metadata:
name: metricbeat-config
namespace: logstash
data:
metricbeat.yml: |-
metricbeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
reload.period: 10s
metricbeat.modules: # 禁用系统指标
- module: system
enabled: false
output.elasticsearch:
hosts: ["http://elasticsearch:9200"] # 你可能需要修改elasticsearch的URL
setup.ilm.enabled: true
在上面的示例中,我们定义了两个configmaps:metricbeat-modules
和metricbeat-config
。metricbeat-modules
包含了Metricbeat的监控配置,metricbeat-config
包含了Metricbeat的全局配置。
然后,在Pod的容器部分,我们添加一个名为metricbeat-sidecar
的容器,并挂载上述的configmaps:
containers:
- name: metricbeat-sidecar
image: docker.elastic.co/beats/metricbeat:7.14.0
volumeMounts:
- name: config
mountPath: /usr/share/metricbeat/metricbeat.yml
readOnly: true
subPath: metricbeat.yml
- name: modules
mountPath: /usr/share/metricbeat/modules.d
readOnly: true
最后,在volumes部分,我们将configmaps挂载到容器中:
volumes:
- name: config
configMap:
defaultMode: 0640
name: metricbeat-config
- name: modules
configMap:
defaultMode: 0640
name: metricbeat-modules
请注意,以上示例中的配置是基于Kubernetes的部署,如果你使用其他平台或工具,请根据实际情况进行相应的调整。
参考资料
- Stack Overflow: Creating sidecar metricbeat with AWS EKS Fargate
- Elasticsearch Logstash Monitoring with Metricbeat
更新:对于Kibana的类似解决方案,可以参考以下配置:
# Configmaps for metricbeat conf files
apiVersion: v1
kind: ConfigMap
metadata:
name: kibana-metricbeat-modules
namespace: elk
data:
xpack.yml: |-
- module: kibana
xpack.enabled: true # 这是打开报告的开关
period: 10s
hosts: ["localhost:5601"]
apiVersion: v1
kind: ConfigMap
metadata:
name: kibana-metricbeat-config
namespace: elk
data:
metricbeat.yml: |-
metricbeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
reload.period: 10s
metricbeat.modules: # 禁用系统指标
- module: system
enabled: false
output.elasticsearch:
hosts: ["http://elasticsearch:9200"]
setup.ilm.enabled: true
在Pod的容器部分,添加一个名为metricbeat-sidecar
的容器,并挂载上述的configmaps:
containers:
- name: metricbeat-sidecar
image: docker.elastic.co/beats/metricbeat:7.14.0
volumeMounts:
- name: config
mountPath: /usr/share/metricbeat/metricbeat.yml
readOnly: true
subPath: metricbeat.yml
- name: modules
mountPath: /usr/share/metricbeat/modules.d
readOnly: true
最后,在volumes部分,将configmaps挂载到容器中:
volumes:
- name: config
configMap:
defaultMode: 0640
name: kibana-metricbeat-config
- name: modules
configMap:
defaultMode: 0640
name: kibana-metricbeat-modules
以上是一个简单的解决方案,根据实际情况进行相应的调整。
希望对你有帮助!