• 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级别后需要考虑的问题。

  • 相关阅读:
    MyEclipse和Eclipse非常方便的快捷键
    java面试题及答案
    Java笔试题解答
    Spring自定义注解
    Spring MVC上传文件
    JS实现购物车特效
    MySQL软件基本管理
    初识数据库
    Python3-IO模型
    Python3-协程
  • 原文地址:https://www.cnblogs.com/irkstpdl/p/12650513.html
Copyright © 2020-2023  润新知