K8S集群模式下fluent-bit日志收集方案设计和实践
「随着 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日志收集方案设计和实践相关推荐
- strom-1.1.0模拟单词统计功能,Spout编写,Bolt编写,TopologyDriver编写,本地模式运行,集群模式运行,集群模式下看输出结果
统计文本中的单词出现的频率,其中文本内容如下: 创建项目 项目结构如下: 创建pom.xml,代码如下: <?xml version="1.0" encoding=" ...
- shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份
shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份 需求说明 功能实现 shell 脚本实现 shell 使用方式 前置工具环境安装 dump-k8s-yaml.sh 使用 ...
- RSF-Center,集群模式下-协调数据结构
为什么80%的码农都做不了架构师?>>> RSF是一个轻量化的分布式服务框架.支持点对点调用,也支持分布式调用.典型的应用场景是,将同一个服务部署在多个Server上提供 re ...
- 如何访问集群中指定的服务器,【Nacos源码之配置管理 六】集群模式下服务器之间是如何互相感知的...
前言 我们用Nacos当配置中心的时候,上一篇文章中 [Nacos源码之配置管理 五]为什么把配置文件Dump到磁盘中 知道了,所有的配置文件都会Dump到服务器的本地磁盘中, 那么集群模式下: 服务 ...
- 关于Redis集群模式下,使用mget通过keys批量获取value时的解决方案
关于Redis集群模式下,使用mget通过keys批量获取value时的解决方案 今天在做项目的时候,需要使用到mget命令,通过一个批量的key去获取对应的value集合,但是取值的时候,报了这个错 ...
- zookeeper专题:zookeeper集群模式下,leader选举流程分析
文章目录 Zookeeper 集群模式一共有三种类型的角色 1. zookeeper启动时leader选举流程 1.1 加载配置文件,设置基本信息 1.2 指定快速选举算法,启动多级队列.线程 1.3 ...
- quartz集群模式下qrtz_triggers表trigger_state变ERROR分析
最近在正式环境新增了一个定时任务,项目启动后,新增的任务总是跑一两次就不跑了,排查发现trigger_state变为ERROR了. 一.Quartz重要表含义 1)qrtz_calendars:以Bl ...
- Hadoop框架:集群模式下分布式环境搭建
本文源码:GitHub·点这里 || GitEE·点这里 一.基础环境配置 1.三台服务 准备三台Centos7服务,基础环境从伪分布式环境克隆过来. 133 hop01,134 hop02,136 ...
- redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...
在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2. ...
- rocketMq双master集群模式下故障演练
在上一篇,我们简单搭建了rocketMq双master的集群,沿用这个思路,这一篇我们用代码来模拟一下rocketMq集群故障情况下完成自动切换的效果. 1.启动两个节点的broker和nameser ...
最新文章
- DL之GRU:GRU算法相关论文、建立过程(基于TF)、相关思路配图集合、TF代码实现
- 215. 数组中的第K个最大元素 BFPRT最牛解法
- Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理
- traceroute命令原理
- 分配和释放 BSTR 的内存
- torchtext建立词表build_vocab()时使用自己的word2vec模型
- 基于event 实现的线程安全的优先队列(python实现)
- android+qq底部界面,Android 高仿QQ 界面滑动效果
- java滥用接口_接口滥用问题
- mx350显卡天梯图_显卡天梯图2020年终整理发布
- Solidity教程:初学Solidity
- linux dmesg带时间戳,linux 时间戳转换/dmesg 时间转换
- 五笔输入法 快速入门 二小时基本了解五笔
- <EDEM CFD案例01>EDEM2018 + FLUENT19.2 Coupling Interface Compiling
- H5抽奖十二宫格声音问题
- linux命令里的xz是干嘛的,Ubuntu中的xz命令使用
- 控制台PHP安装composer,生产线安装composer及php cli配置
- 有时候内卷也可以走捷径,比如几行代码也可以霸榜朋友圈~
- 在 Beagleboard-x15 上配置 spi 和 GPIO
- 具统计全国淘宝村增至211个 直接就业超过28万人
热门文章
- android 电视盒子 软件安装,电视盒子无法安装第三方软件怎么办?当贝市场这样一招搞定...
- (转)比较全的OA模板
- R从网页抓取到文本分析全教程:影评的获取与分析
- 利用Python的PyPDF2库,根据论文标题批量修改pdf的文件名
- CCS安装教程——学习DSP的第一步
- 【VS】Installer Projects生成英文安装包
- 中国制鞋机械行业调研与投资战略报告(2022版)
- Shell脚本学习指南(一)——基本概念
- openvpen最新安卓中文版_ins下载官方安卓最新版-ins下载安卓版中文版下载v2.5.46 手机版-西西软件下载...
- 使用Dotfuscator混淆winphone8应用XAP