Kubernetes 中带有 ELK 堆栈 运行 的 Filebeat 不会在日志中捕获 pod 名称
Filebeat with ELK stack running in Kubernetes does not capture pod name in logs
我正在使用 ELK 堆栈(elasticsearch、logsash、kibana)在 Kubernetes (minikube) 环境中进行日志处理和分析。为了捕获日志,我正在使用 filebeat。日志从 filebeat 成功传播到 elasticsearch,并且可以在 Kibana 中查看。
我的问题是无法获取实际pod发布日志记录的pod名称。相反,我只得到正在收集日志文件的 filebeat podname,而不是产生日志记录的 pod 的名称。
我从filebeat可以得到的信息是(在Kibana中查看)
- beat.hostname:该字段的值为filebeat pod name
- beat.name: 值为 filebeat pod 名称
- host: 值为 filebeat pod 名称
我还可以 see/discern Kibana 中从 filebeat / logstash / elasticsearch 流经的容器信息:
- 应用程序:值为 {log-container-id}-json.log
- 来源:值为 /hostfs/var/lib/docker/containers/{log-container-id}-json.log
如上所示,我好像可以获取到容器Id,但获取不到pod名称。
为了缓解这种情况,我可能会在实际的日志消息中嵌入 pod-name 并从那里解析它,但我希望有一个解决方案,我可以在其中配置 filebeat 以发出实际的 pod 名称。
现在有人知道如何配置 filebeat(或其他组件)以在其日志中捕获 kubernetes (minikube) pod 名称吗?
我当前的 filebeat 配置如下:
ConfigMap如下图:
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat
namespace: logging
labels:
component: filebeat
data:
filebeat.yml: |
filebeat.prospectors:
- input_type: log
tags:
- host
paths:
- "/hostfs/var/log"
- "/hostfs/var/log/*"
- "/hostfs/var/log/*/*"
exclude_files:
- '\.[0-9]$'
- '\.[0-9]\.gz$'
- input_type: log
tags:
- docker
paths:
- /hostfs/var/lib/docker/containers/*/*-json.log
json:
keys_under_root: false
message_key: log
add_error_key: true
multiline:
pattern: '^[[:space:]]+|^Caused by:'
negate: false
match: after
output.logstash:
hosts: ["logstash:5044"]
logging.level: info
DamemonSet如下图所示:
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: filebeat
namespace: logging
spec:
template:
metadata:
labels:
component: filebeat
spec:
containers:
- name: filebeat
image: giantswarm/filebeat:5.2.2
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 100m
requests:
cpu: 100m
volumeMounts:
- name: config
mountPath: /etc/filebeat
readOnly: true
- name: hostfs-var-lib-docker-containers
mountPath: /hostfs/var/lib/docker/containers
readOnly: true
- name: hostfs-var-log
mountPath: /hostfs/var/log
readOnly: true
volumes:
- name: config
configMap:
name: filebeat
- name: hostfs-var-log
hostPath:
path: /var/log
- name: hostfs-var-lib-docker-containers
hostPath:
path: /var/lib/docker/containers
免责声明:我是一名节拍开发者
filebeat 尚不支持您想做的事情,但我们肯定会在这方面付出一些努力,因此您可以期待未来的版本支持这种映射。
同时,我认为你的做法是正确的。你可以将你需要的信息附加到你的日志中,这样你就可以在 elasticsearch
通过将一组特定的 pods 分配给命名空间,我已经实现了您想要的,现在可以使用命名空间、pod 名称和容器名称的组合来查询我要查找的日志也包含在生成的日志中,如您在此处看到的那样,无需任何额外的努力就可以通过文件节拍进行传输
对于未来的人来说,它现在已经在 filebeat 处理器中就位:
filebeat.prospectors:
- type: log
enabled: true
paths:
- /var/log/*.log
- /var/log/messages
- /var/log/syslog
- type: docker
containers.ids:
- "*"
processors:
- add_kubernetes_metadata:
in_cluster: true
- drop_event:
when:
equals:
kubernetes.container.name: "filebeat"
helm 图表默认值:https://github.com/helm/charts/blob/master/stable/filebeat/values.yaml
文档:https://www.elastic.co/guide/en/beats/filebeat/current/add-kubernetes-metadata.html
我正在使用 ELK 堆栈(elasticsearch、logsash、kibana)在 Kubernetes (minikube) 环境中进行日志处理和分析。为了捕获日志,我正在使用 filebeat。日志从 filebeat 成功传播到 elasticsearch,并且可以在 Kibana 中查看。
我的问题是无法获取实际pod发布日志记录的pod名称。相反,我只得到正在收集日志文件的 filebeat podname,而不是产生日志记录的 pod 的名称。
我从filebeat可以得到的信息是(在Kibana中查看)
- beat.hostname:该字段的值为filebeat pod name
- beat.name: 值为 filebeat pod 名称
- host: 值为 filebeat pod 名称
我还可以 see/discern Kibana 中从 filebeat / logstash / elasticsearch 流经的容器信息:
- 应用程序:值为 {log-container-id}-json.log
- 来源:值为 /hostfs/var/lib/docker/containers/{log-container-id}-json.log
如上所示,我好像可以获取到容器Id,但获取不到pod名称。
为了缓解这种情况,我可能会在实际的日志消息中嵌入 pod-name 并从那里解析它,但我希望有一个解决方案,我可以在其中配置 filebeat 以发出实际的 pod 名称。
现在有人知道如何配置 filebeat(或其他组件)以在其日志中捕获 kubernetes (minikube) pod 名称吗?
我当前的 filebeat 配置如下:
ConfigMap如下图:
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat
namespace: logging
labels:
component: filebeat
data:
filebeat.yml: |
filebeat.prospectors:
- input_type: log
tags:
- host
paths:
- "/hostfs/var/log"
- "/hostfs/var/log/*"
- "/hostfs/var/log/*/*"
exclude_files:
- '\.[0-9]$'
- '\.[0-9]\.gz$'
- input_type: log
tags:
- docker
paths:
- /hostfs/var/lib/docker/containers/*/*-json.log
json:
keys_under_root: false
message_key: log
add_error_key: true
multiline:
pattern: '^[[:space:]]+|^Caused by:'
negate: false
match: after
output.logstash:
hosts: ["logstash:5044"]
logging.level: info
DamemonSet如下图所示:
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: filebeat
namespace: logging
spec:
template:
metadata:
labels:
component: filebeat
spec:
containers:
- name: filebeat
image: giantswarm/filebeat:5.2.2
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 100m
requests:
cpu: 100m
volumeMounts:
- name: config
mountPath: /etc/filebeat
readOnly: true
- name: hostfs-var-lib-docker-containers
mountPath: /hostfs/var/lib/docker/containers
readOnly: true
- name: hostfs-var-log
mountPath: /hostfs/var/log
readOnly: true
volumes:
- name: config
configMap:
name: filebeat
- name: hostfs-var-log
hostPath:
path: /var/log
- name: hostfs-var-lib-docker-containers
hostPath:
path: /var/lib/docker/containers
免责声明:我是一名节拍开发者
filebeat 尚不支持您想做的事情,但我们肯定会在这方面付出一些努力,因此您可以期待未来的版本支持这种映射。
同时,我认为你的做法是正确的。你可以将你需要的信息附加到你的日志中,这样你就可以在 elasticsearch
通过将一组特定的 pods 分配给命名空间,我已经实现了您想要的,现在可以使用命名空间、pod 名称和容器名称的组合来查询我要查找的日志也包含在生成的日志中,如您在此处看到的那样,无需任何额外的努力就可以通过文件节拍进行传输
对于未来的人来说,它现在已经在 filebeat 处理器中就位:
filebeat.prospectors:
- type: log
enabled: true
paths:
- /var/log/*.log
- /var/log/messages
- /var/log/syslog
- type: docker
containers.ids:
- "*"
processors:
- add_kubernetes_metadata:
in_cluster: true
- drop_event:
when:
equals:
kubernetes.container.name: "filebeat"
helm 图表默认值:https://github.com/helm/charts/blob/master/stable/filebeat/values.yaml
文档:https://www.elastic.co/guide/en/beats/filebeat/current/add-kubernetes-metadata.html