代码之家  ›  专栏  ›  技术社区  ›  Dushmantha

从部署为kubernetes守护进程的filebeat进入es的多行日志

  •  1
  • Dushmantha  · 技术社区  · 7 年前

    我在kubernetes中设置了filebeat作为守护进程,将日志从docker容器转发到es+kibana。 (通过引用 https://www.elastic.co/guide/en/beats/filebeat/master/running-on-kubernetes.html ) 日志转发成功。

    问题是当存在多行日志时,它们作为单独的日志行转发给ES。

    下面是我配置了多行过滤器filebeat-kuberneeded.yaml的部分。

    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: filebeat-prospectors
      namespace: kube-system
      labels:
        k8s-app: filebeat
        kubernetes.io/cluster-service: "true"
    data:
      kubernetes.yml: |-
        - type: docker
          containers.ids:
          - "${data.kubernetes.container.id}"
          processors:
            - add_kubernetes_metadata:
                in_cluster: true
          multiline:
            pattern: '^[[:space:]]'
            negate: false
            match: after
    ---
    

    这是我的完整文件beat-kuberneeded.yaml文件

    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: filebeat-config
      namespace: kube-system
      labels:
        k8s-app: filebeat
        kubernetes.io/cluster-service: "true"
    data:
      filebeat.yml: |-
        filebeat.config:
          prospectors:
            # Mounted `filebeat-prospectors` configmap:
            path: ${path.config}/prospectors.d/*.yml
            # Reload prospectors configs as they change:
            reload.enabled: true
          modules:
            path: ${path.config}/modules.d/*.yml
            # Reload module configs as they change:
            reload.enabled: false
    
        filebeat.autodiscover:
          providers:
            - type: kubernetes
              templates:
                - condition:
                    or:
                      - equals:
                          kubernetes.container.name: customer-infor-service
                    config:
                    - type: docker
                      containers.ids:
                        - "${data.kubernetes.container.id}"
                      multiline.pattern: '^[[:space:]]'
                      multiline.negate: false
                      multiline.match: after
    
        processors:
          - add_cloud_metadata:
    
        cloud.id: ${ELASTIC_CLOUD_ID}
        cloud.auth: ${ELASTIC_CLOUD_AUTH}
    
        output.elasticsearch:
          hosts: [ "192.168.1.245:9200"]
          username: ""
          password: ""
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: filebeat-prospectors
      namespace: kube-system
      labels:
        k8s-app: filebeat
        kubernetes.io/cluster-service: "true"
    data:
      kubernetes.yml: |-
        - type: docker
          containers.ids:
          - "${data.kubernetes.container.id}"
          processors:
            - add_kubernetes_metadata:
                in_cluster: true
    ---
    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
      name: filebeat
      namespace: kube-system
      labels:
        k8s-app: filebeat
        kubernetes.io/cluster-service: "true"
    spec:
      template:
        metadata:
          labels:
            k8s-app: filebeat
            kubernetes.io/cluster-service: "true"
        spec:
          serviceAccountName: filebeat
          terminationGracePeriodSeconds: 30
          containers:
          - name: filebeat
            image: docker.elastic.co/beats/filebeat:6.2.4
            args: [
              "-c", "/etc/filebeat.yml",
              "-e",
            ]
            env:
            - name: ELASTICSEARCH_HOST
              value: "192.168.1.245"
            - name: ELASTICSEARCH_PORT
              value: "9200"
            - name: ELASTICSEARCH_USERNAME
              value: ""
            - name: ELASTICSEARCH_PASSWORD
              value: ""
            - name: ELASTIC_CLOUD_ID
              value:
            - name: ELASTIC_CLOUD_AUTH
              value:
            securityContext:
              runAsUser: 0
            resources:
              limits:
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 100Mi
            volumeMounts:
            - name: config
              mountPath: /etc/filebeat.yml
              readOnly: true
              subPath: filebeat.yml
            - name: prospectors
              mountPath: /usr/share/filebeat/prospectors.d
              readOnly: true
            - name: data
              mountPath: /usr/share/filebeat/data
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
          volumes:
          - name: config
            configMap:
              defaultMode: 0600
              name: filebeat-config
          - name: varlibdockercontainers
            hostPath:
              path: /var/lib/docker/containers
          - name: prospectors
            configMap:
              defaultMode: 0600
              name: filebeat-prospectors
          - name: data
            emptyDir: {}
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: filebeat
    subjects:
    - kind: ServiceAccount
      name: filebeat
      namespace: kube-system
    roleRef:
      kind: ClusterRole
      name: filebeat
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: filebeat
      labels:
        k8s-app: filebeat
    rules:
    - apiGroups: [""] # "" indicates the core API group
      resources:
      - namespaces
      - pods
      verbs:
      - get
      - watch
      - list
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: filebeat
      namespace: kube-system
      labels:
        k8s-app: filebeat
    ---
    

    但是,我能够成功地在Docker上应用FileBeat多行过滤器,而不需要Kubernetes,也不需要Docker部署。所以我想问题出在我的filebeat-kuberneeded.yaml配置文件上。

    我的filebeat-kuberneeded.yaml配置中是否缺少某些内容?.

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dushmantha    7 年前

    最后能够解决这个问题,使用多行滤波器 filebeat.autodiscover:

          filebeat.autodiscover:
          providers:
            - type: kubernetes
              templates:
                - condition:
                    or:
                      - equals:
                          kubernetes.container.name: car-search
                      - equals:
                          kubernetes.container.name: cart-service
                  config:
                    - type: docker
                      containers.ids:
                        - "${data.kubernetes.container.id}"
                      multiline.pattern: '^[[:space:]]'
                      multiline.negate: false
                      multiline.match: after
    
        processors:
          - add_cloud_metadata:
    

    裁判 https://github.com/moby/moby/issues/22920

    推荐文章