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

1、回顾

随着集群规模不断扩大,日志收集问题将一直萦绕在我们耳边,前段时间我用七篇文章安利了使用 fluentd 及 fluent-bit 好处,具体可以参考如下链接:

  • Kubernetes日志收集解决方案

  • Kubernetes集群环境下fluentd日志收集方案介绍

  • 日志收集工具fluentd安装配置及使用介绍

  • 一文了解日志收集工具fluent-bit

  • 轻量级日志收集转发 | fluent-bit指令详解(一)

  • 轻量级日志收集转发 | fluent-bit配置详解(二)

  • 轻量级日志收集转发 | fluent-bit外部插件详解(三)

下面我就直接介绍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中

apiVersion: v1
kind: ConfigMap
metadata:name: fluent-bit-configlabels:k8s-app: fluent-bit
data:
# Configuration files: server, input, filters and output
# ======================================================fluent-bit.conf: |[SERVICE]Flush         1Log_Level     infoDaemon        off@INCLUDE input-kubernetes.conf@INCLUDE output-file.confinput-kubernetes.conf: |[INPUT]Name        tailPath        /home/logs/biz/biz*.logDb          /tmp/biz_log.dbDb.sync     FullTag         biz-${NODE_NAME}[INPUT]Name              tailTag               kube.*Path              /var/log/containers/*.logParser            dockerDB                /var/log/flb_kube.dbMem_Buf_Limit     5MBSkip_Long_Lines   OnRefresh_Interval  10output-file.conf: |[OUTPUT]Name        forwardMatch       *Host        110.223.1.1Port        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-bitlabels:k8s-app: fluent-bit-loggingversion: v1kubernetes.io/cluster-service: "true"
spec:updateStrategy:type: RollingUpdatetemplate:metadata:labels:k8s-app: fluent-bit-loggingversion: v1kubernetes.io/cluster-service: "true"spec:containers:- name: fluent-bitimage: fluent/fluent-bit:1.3imagePullPolicy: IfNotPresentcommand: ["/fluent-bit/bin/fluent-bit","-c", "/fluent-bit/etc/fluent-bit.conf"]env:- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: MY_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: MY_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: MY_POD_IPvalueFrom:fieldRef:fieldPath: status.podIPresources:requests:cpu: 5mmemory: 20Milimits:cpu: 60mmemory: 60MivolumeMounts:- name: varlogmountPath: /var/log- name: varlibdockercontainersmountPath: /var/lib/docker/containersreadOnly: true- name: fluent-bit-configmountPath: /fluent-bit/etc/- name: biz-logsmountPath: /home/logs/- name: fluent-bit-configmountPath: /fluent-bit/etc/terminationGracePeriodSeconds: 10volumes:- name: varloghostPath:path: /var/log- name: varlibdockercontainershostPath:path: /var/lib/docker/containers- name: biz-logshostPath:path: /home/logs/- name: fluent-bit-configconfigMap: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级别后需要考虑的问题。

推荐


Kubernetes入门培训(内含PPT)

从Ice到Kubernetes容器技术,微服务架构经历了什么?


原创不易,随手关注或者”在看“,诚挚感谢!

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

  1. strom-1.1.0模拟单词统计功能,Spout编写,Bolt编写,TopologyDriver编写,本地模式运行,集群模式运行,集群模式下看输出结果

    统计文本中的单词出现的频率,其中文本内容如下: 创建项目 项目结构如下: 创建pom.xml,代码如下: <?xml version="1.0" encoding=" ...

  2. shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份

    shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份 需求说明 功能实现 shell 脚本实现 shell 使用方式 前置工具环境安装 dump-k8s-yaml.sh 使用 ...

  3. RSF-Center,集群模式下-协调数据结构

    为什么80%的码农都做不了架构师?>>>    RSF是一个轻量化的分布式服务框架.支持点对点调用,也支持分布式调用.典型的应用场景是,将同一个服务部署在多个Server上提供 re ...

  4. 如何访问集群中指定的服务器,【Nacos源码之配置管理 六】集群模式下服务器之间是如何互相感知的...

    前言 我们用Nacos当配置中心的时候,上一篇文章中 [Nacos源码之配置管理 五]为什么把配置文件Dump到磁盘中 知道了,所有的配置文件都会Dump到服务器的本地磁盘中, 那么集群模式下: 服务 ...

  5. 关于Redis集群模式下,使用mget通过keys批量获取value时的解决方案

    关于Redis集群模式下,使用mget通过keys批量获取value时的解决方案 今天在做项目的时候,需要使用到mget命令,通过一个批量的key去获取对应的value集合,但是取值的时候,报了这个错 ...

  6. zookeeper专题:zookeeper集群模式下,leader选举流程分析

    文章目录 Zookeeper 集群模式一共有三种类型的角色 1. zookeeper启动时leader选举流程 1.1 加载配置文件,设置基本信息 1.2 指定快速选举算法,启动多级队列.线程 1.3 ...

  7. quartz集群模式下qrtz_triggers表trigger_state变ERROR分析

    最近在正式环境新增了一个定时任务,项目启动后,新增的任务总是跑一两次就不跑了,排查发现trigger_state变为ERROR了. 一.Quartz重要表含义 1)qrtz_calendars:以Bl ...

  8. Hadoop框架:集群模式下分布式环境搭建

    本文源码:GitHub·点这里 || GitEE·点这里 一.基础环境配置 1.三台服务 准备三台Centos7服务,基础环境从伪分布式环境克隆过来. 133 hop01,134 hop02,136 ...

  9. redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...

    在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2. ...

  10. rocketMq双master集群模式下故障演练

    在上一篇,我们简单搭建了rocketMq双master的集群,沿用这个思路,这一篇我们用代码来模拟一下rocketMq集群故障情况下完成自动切换的效果. 1.启动两个节点的broker和nameser ...

最新文章

  1. DL之GRU:GRU算法相关论文、建立过程(基于TF)、相关思路配图集合、TF代码实现
  2. 215. 数组中的第K个最大元素 BFPRT最牛解法
  3. Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理
  4. traceroute命令原理
  5. 分配和释放 BSTR 的内存
  6. torchtext建立词表build_vocab()时使用自己的word2vec模型
  7. 基于event 实现的线程安全的优先队列(python实现)
  8. android+qq底部界面,Android 高仿QQ 界面滑动效果
  9. java滥用接口_接口滥用问题
  10. mx350显卡天梯图_显卡天梯图2020年终整理发布
  11. Solidity教程:初学Solidity
  12. linux dmesg带时间戳,linux 时间戳转换/dmesg 时间转换
  13. 五笔输入法 快速入门 二小时基本了解五笔
  14. <EDEM CFD案例01>EDEM2018 + FLUENT19.2 Coupling Interface Compiling
  15. H5抽奖十二宫格声音问题
  16. linux命令里的xz是干嘛的,Ubuntu中的xz命令使用
  17. 控制台PHP安装composer,生产线安装composer及php cli配置
  18. 有时候内卷也可以走捷径,比如几行代码也可以霸榜朋友圈~
  19. 在 Beagleboard-x15 上配置 spi 和 GPIO
  20. 具统计全国淘宝村增至211个 直接就业超过28万人

热门文章

  1. android 电视盒子 软件安装,电视盒子无法安装第三方软件怎么办?当贝市场这样一招搞定...
  2. (转)比较全的OA模板
  3. R从网页抓取到文本分析全教程:影评的获取与分析
  4. 利用Python的PyPDF2库,根据论文标题批量修改pdf的文件名
  5. CCS安装教程——学习DSP的第一步
  6. 【VS】Installer Projects生成英文安装包
  7. 中国制鞋机械行业调研与投资战略报告(2022版)
  8. Shell脚本学习指南(一)——基本概念
  9. openvpen最新安卓中文版_ins下载官方安卓最新版-ins下载安卓版中文版下载v2.5.46 手机版-西西软件下载...
  10. 使用Dotfuscator混淆winphone8应用XAP