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中查看)

我还可以 see/discern Kibana 中从 filebeat / logstash / elasticsearch 流经的容器信息:

如上所示,我好像可以获取到容器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