在Kubernetes中运行ELK堆栈的Filebeat不会捕获日志

时间:2017-03-27 16:56:29

标签: elasticsearch logging logstash kubernetes filebeat

我正在使用ELK堆栈(elasticsearch,logsash,kibana)在Kubernetes(minikube)环境中进行日志处理和分析。要捕获日志,我正在使用filebeat。日志从filebeat成功传播到elasticsearch,并且可以在Kibana中查看。

我的问题是我无法获取实际发布日志记录的pod名称。相反,我只获取收集日志文件的filebeat podname,而不是发起日志记录的pod的名称。

我可以从filebeat获得的信息(在Kibana中查看)

  • beat.hostname:此字段的值为filebeat pod name
  • beat.name:value是filebeat pod名称
  • host:value是filebeat pod名称

我还可以看到/识别Kibana中从filebeat / logstash / elasticsearch流过的容器信息:

  • app:value是{log-container-id} -json.log
  • source:value是/ hostfs / var / lib / docker / containers / {log-container-id} -json.log

如上所示,我似乎能够获得容器ID但不能获取容器名称。

为了缓解这种情况,我可能会将pod-name嵌入到实际的日志消息中并从那里解析它,但我希望有一个解决方案,我可以配置filebeat来发出实际的pod名称。

现在有人如何配置filebeat(或其他组件)来捕获日志中的kubernetes(minikube)pod名称?

我目前的文件配置如下:

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

3 个答案:

答案 0 :(得分:1)

免责声明:我是一名节拍开发者

filebeat尚不支持您想要做的事情,但绝对是我们想要付出一些努力的事情,因此您可以期待将来的版本支持这种映射。

与此同时,我认为您的方法是正确的。您可以将所需信息附加到日志中,以便将其存储在elasticsearch

答案 1 :(得分:1)

通过将一组特定的pod分配给命名空间,我已经实现了您所寻找的目标,现在可以使用命名空间,pod名称和容器名称的组合来查询我查找的日志,该名称也包含在生成的日志中如你所见,没有任何额外的努力,通过文件节拍进行管道传输 image

答案 2 :(得分:0)

对于将来来这里的人们来说,它已经在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 chart默认值:https://github.com/helm/charts/blob/master/stable/filebeat/values.yaml

doc:https://www.elastic.co/guide/en/beats/filebeat/current/add-kubernetes-metadata.html