技巧 | 使用Filebeat收集K8S應用日誌


Logstash收集Kubernetes的應用日誌,

發現logstash十分消耗內存(大約500M),

而改用filebeat(大約消耗10多M內存)。

在進行日誌收集的過程中,我們首先想到的是使用Logstash,因爲它是ELK stack中的重要成員,但是在測試過程中發現,Logstash是基於JDK的,在沒有產生日誌的情況單純啓動Logstash就大概要消耗500M內存,在每個Pod中都啓動一個日誌收集組件的情況下,使用logstash有點浪費系統資源,經人推薦我們選擇使用Filebeat替代,經測試單獨啓動Filebeat容器大約會消耗12M內存,比起logstash相當輕量級。

方案選擇

Kubernetes官方提供了ELK的日誌收集解決方案,但是這種方案並不適合所有的業務場景,它本身就有一些侷限性,例如:

  • 所有日誌都必須是out前臺輸出,真實業務場景中無法保證所有日誌都在前臺輸出

  • 只能有一個日誌輸出文件,而真實業務場景中往往有多個日誌輸出文件

  • Fluentd並不是常用的日誌收集工具,我們更習慣用logstash,現使用filebeat替代

  • 我們已經有自己的ELK集羣且有專人維護,沒有必要再在kubernetes上做一個日誌收集服務

基於以上幾個原因,我們決定使用自己的ELK集羣。    

K8S日誌收集解決方案

方案1 每個app的鏡像中都集成日誌收集組件

優點:    部署方便,kubernetes的yaml文件無須特別配置,可以爲每個app自定義日誌收集配置

缺點:    強耦合,不方便應用和日誌收集組件升級和維護且會導致鏡像過大

方案2 單獨創建一個日誌收集組件跟app的容器一起運行在同一個pod中

優點:    低耦合,擴展性強,方便維護和升級

缺點:    需要對kubernetes的yaml文件進行單獨配置,略顯繁瑣

方案3 將所有的Pod的日誌都掛載到宿主機上,每臺主機上單獨起一個日誌收集Pod

優點: 完全解耦,性能最高,管理起來最方便

缺點:    需要統一日誌收集規則,目錄和輸出方式

綜合以上優缺點,我們選擇使用方案二。該方案在擴展性、個性化、部署和後期維護方面都能做到均衡,因此選擇該方案。

我們創建了自己的logstash鏡像。創建過程和使用方式見:

https://github.com/rootsongjc/docker-images

鏡像地址:

index.tenxcloud.com/jimmy/filebeat:5.4.0

測試

我們部署一個應用對logstash的日誌收集功能進行測試。

創建應用yaml文件fielbeat-test.yaml。

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: filebeat-test

  namespace: default

spec:

  replicas: 3

  template:

    metadata:

      labels:

        k8s-app: filebeat-test

    spec:

      containers:

      – image: sz-pg-oam-docker-hub-001.tendcloud.com/library/filebeat:5.4.0

        name: filebeat

        volumeMounts:

        – name: app-logs

          mountPath: /log

        – name: filebeat-config

          mountPath: /etc/filebeat/

      – image: sz-pg-oam-docker-hub-001.tendcloud.com/library/analytics-docker-test:Build_8

        name : app

        ports:

        – containerPort: 80

        volumeMounts:

        – name: app-logs

          mountPath: /usr/local/TalkingData/logs

      volumes:

      – name: app-logs

        emptyDir: {}

      – name: filebeat-config

        configMap:

          name: filebeat-config

apiVersion: v1

kind: Service

metadata:

  name: filebeat-test

  labels:

    app: filebeat-test

spec:

  ports:

  – port: 80

    protocol: TCP

    name: http

  selector:

    run: filebeat-test

apiVersion: v1

kind: ConfigMap

metadata:

  name: filebeat-config

data:

  filebeat.yml: |

    filebeat.prospectors:

    – input_type: log

      paths:

        – “/log/*”

        – “/log/usermange/common/*”

    output.elasticsearch:

      hosts: [“172.23.5.255:9200”]

    username: “elastic”

    password: “changeme”

    index: “filebeat-docker-test”

注意事項

  • 將app的/usr/local/TalkingData/logs目錄掛載到logstash的/log目錄下。

  • Filebeat容器大概需要10M左右內存。

  • 該文件可以在manifests/test/filebeat-test.yaml找到。

  • 我使用了自己的私有鏡像倉庫,測試時請換成自己的應用鏡像。

  • filebeat鏡像製作請參考https://github.com/rootsongjc/docker-images 

創建應用

部署Deployment

kubectl create -f filebeat-test.yaml

查看http://172.23.5.255:9200/_cat/indices將可以看到列表有這樣的indices:

green open filebeat-docker-test            7xPEwEbUQRirk8oDX36gAA 5 1   2151     0   1.6mb 841.8kb

訪問Kibana的web頁面,查看filebeat-docker-test的索引,可以看到filebeat收集到了app日誌。

本文轉移K8S技術社區-技巧 | 使用Filebeat收集K8S應用日誌

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章