K8S集群模式下Fluent-bit日志回收方案


隨着K8s不斷更新迭代,使用使用 K8s 日志系統建設的開發者,逐漸遇到了各種復雜的問題和挑戰。本篇文章中結合作者使用經驗,分析和設計 K8s 日志收集實踐過程。

1.回顧

下面我就將介紹fluent-bit整體收集架構和插件。

單純的日志收集解決方案特別多,相對非常成熟,比如 ELK、EFK 等,這里不在贅述,本文只針對 Kubernetes 中使用 fluent-bit 日志收集,Kubernetes 下日志收集相對於之前的物理機或者虛擬機的方式略有不同,很大一部分是因為 Kubernetes 的擴容和彈性能力。日志形式種類更多,不僅業務日志,更要考慮 docker、Kubernetes 等組件日志。日志的動態性更強,Kubernetes 集群中節點宕機導致 Pod 自動轉移、Pod 銷毀、擴容縮容、某些場景提前無法預知。這將導致線上服務出現問題之后,不能集中查看日志、定位問題所在。

2.集中收集方案介紹

 fluent-bit 以 ds 方式運行在各個節點,每個節點一個副本,收集完成后,統一發送到fluentd 進行集中日志查看。如下圖所示:

image

 DaemonSet 本身能夠保證集群中所有節點(如果添加約束,可以控制在部分節點上運行)都運行一個 Pod 副本,當有 Node 加入集群時,也會為他們新增一個 Pod 。當有 Node 從集群移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創建的所有 Pod。通過 Kubernetes DaemonSet 資源的特點,每個節點上運行 fluent-bit,保證每個節點的日志能夠收集。

3.Kubernetes yaml實踐

3.1 fluent-bit的配置存儲在Kubernetes中ConfigMap中
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
  labels:
    k8s-app: fluent-bit
data:
# Configuration files: server, input, filters and output
# ======================================================
  fluent-bit.conf: |

    [SERVICE]
        Flush         1
        Log_Level     info
        Daemon        off

    @INCLUDE input-kubernetes.conf
    @INCLUDE output-file.conf

input-kubernetes.conf: |
    [INPUT]
        Name        tail
        Path        /home/logs/biz/biz*.log
        Db          /tmp/biz_log.db
        Db.sync     Full
        Tag         biz-${NODE_NAME}

     [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/*.log
        Parser            docker
        DB                /var/log/flb_kube.db
        Mem_Buf_Limit     5MB
        Skip_Long_Lines   On
        Refresh_Interval  10
 output-file.conf: |
    [OUTPUT]
        Name        forward
        Match       *
        Host        110.223.1.1
        Port        24221

  如上利用了Kubernetes 分布式配置 ConfigMap 的能力,其中 fluent-bit 配置主要分成了三部分;

  • Service 用於定義 fluent-bit 服務啟動設置;

  • INPUT 用於定義日志輸入信息;

  • OUTPUT 用於定義日志輸出目的地址,示例中使用了 forward,當然 fluent-bit 本身支持常見數據收集組件,比如:ES、KAFAKA 等。

3.2 Kubernetes ds文件
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluent-bit
  labels:
    k8s-app: fluent-bit-logging
    version: v1
    kubernetes.io/cluster-service: "true"
spec:
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s-app: fluent-bit-logging
        version: v1
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
      - name: fluent-bit
        image: fluent/fluent-bit:1.3
        imagePullPolicy: IfNotPresent
        command: ["/fluent-bit/bin/fluent-bit","-c", "/fluent-bit/etc/fluent-bit.conf"]
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        resources:
          requests:
            cpu: 5m
            memory: 20Mi
          limits:
            cpu: 60m
            memory: 60Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc/
        - name: biz-logs
          mountPath: /home/logs/
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc/
      terminationGracePeriodSeconds: 10
      volumes:
       - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: biz-logs
        hostPath:
          path: /home/logs/
      - name: fluent-bit-config
        configMap:
          name: fluent-bit-config

DaemonSet是Kubernetes中資源對象,在定義過程中有三點需要注意

  • 添加resource,即Kubernetes資源配額,保證服務質量,確保正常情況下日志的性能消耗不超過整體 CPU 占用的 5%;

  • 日志輸出路徑要通過hostpath方式掛載到容器內部,否則將無法收集日志信息;

  • env本身用於定義環境變量,根據自身需求,eg : 項目需要獲取具體節點信息,如上ConfigMap所示,甚至需要獲取pod或者容器信息。通過設置 env 可以在 fluent-bit 運行過程中動態獲取環境變量。

4. fluentd 服務端設置

fluentd 安裝使用具體參考:

面對海量日志,為什么選用fluentd作為核心組件?

日志收集工具fluentd安裝配置及使用介紹

5.總結:

  本文主要介紹了 fluent-bit 通過 DaemonSet 方式運行、各個節點日志收集存儲、集中的過程。

6.后記

  當然只做這些離完成日志系統的搭建目標差的還很遠,這些只是簡單的把日志集中起來方便查看,更多是需要規范日志等級、日志內容輸出、日志輸出目標定義等。每台機器上部署的 DaemonSet fluent-bit 到了單 Agent 瓶頸就會出現問題,可能需要考慮換 Sidecar 、 kafaka 中間件、甚至在打印日志時就要考慮是否影響性能,當然這都是集群日志每天TB級別后需要考慮的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM