前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8S集群模式下fluent-bit日志收集方案设计和实践

K8S集群模式下fluent-bit日志收集方案设计和实践

作者头像
用户5166556
发布2020-06-07 11:23:10
3.4K0
发布2020-06-07 11:23:10
举报
文章被收录于专栏:让技术和时代并行

「随着 K8s 不断更新迭代,使用 K8s 日志系统建设的开发者,逐渐遇到了各种复杂的问题和挑战。本篇文章中结合作者使用经验,分析和设计 K8s 日志收集实践过程。」

下面我就直接介绍fluent-bit整体收集架构和插件,如果对整体有不理解的部分。

单纯的日志收集解决方案特别多,相对非常成熟,比如 ELK、EFK 等,这里不在赘述,本文只针对 Kubernetes 中使用 fluent-bit 日志收集,Kubernetes 下日志收集相对于之前的物理机或者虚拟机的方式略有不同,很大一部分是因为 Kubernetes 的扩容和弹性能力。日志形式种类更多,不仅业务日志,更要考虑 docker、Kubernetes 等组件日志。日志的动态性更强,Kubernetes 集群中节点宕机导致 Pod 自动转移、Pod 销毁、扩容缩容、某些场景提前无法预知。这将导致线上服务出现问题之后,不能集中查看日志、定位问题所在。

2、集中收集方案介绍

fluent-bit 以 ds 方式运行在各个节点,每个节点一个副本,收集完成后,统一发送到fluentd 进行集中日志查看。如下图所示:

DaemonSet 本身能够保证集群中所有节点(如果添加约束,可以控制在部分节点上运行)都运行一个 Pod 副本,当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。通过 Kubernetes DaemonSet 资源的特点,每个节点上运行 fluent-bit,保证每个节点的日志能够收集。

3、Kubernetes yaml实践

3.1、fluent-bit的配置存储在Kubernetes中ConfigMap中

代码语言:javascript
复制
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文件

代码语言:javascript
复制
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 服务端设置

5、总结:

本文主要介绍了 fluent-bit 通过 DaemonSet 方式运行、各个节点日志收集存储、集中的过程。

6、后记

当然只做这些离完成日志系统的搭建目标差的还很远,这些只是简单的把日志集中起来方便查看,更多是需要规范日志等级、日志内容输出、日志输出目标定义等。每台机器上部署的 DaemonSet fluent-bit 到了单 Agent 瓶颈就会出现问题,可能需要考虑换 Sidecar 、 kafaka 中间件、甚至在打印日志时就要考虑是否影响性能,当然这都是集群日志每天TB级别后需要考虑的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档