本文基于 KubeSphere 可观测性与边缘计算负责人霍秉杰在北美 KubeCon 的 Co-located event Open Observability Day 闪电演讲的内容进行整理。

整理人:米开朗基杨、大飞哥

Fluent Operator 简介

2019 年 1 月 21 日,KubeSphere 社区为了满足以云原生的方式管理 Fluent Bit 的需求开发了 FluentBit Operator,并在 2020 年 2 月 17 日发布了 v0.1.0 版本。此后产品不断迭代,一直维护到 v0.8.0,实现了 Fluent Bit 配置的热加载,而无需重启整个 Fluent Bit 容器。2021 年 8 月,Kubesphere 团队将该项目捐献给 Fluent 社区,并从 v0.9.0 一直持续迭代到 v0.13.0。

2022 年 3 月,FluentBit Operator 正式更名为 Fluent Operator,因为我们增加了对 Fluentd 的支持,而且把 FluentBit CRDs 定义范围从命名空间扩大到集群级别,并于 2022 年 3 月 25 日发布了里程碑版本 v1.0.0。

整体架构预览

Fluent Operator 可以构建完整的云原生日志采集通道。FluentBit 小巧轻量,适合作为 Agent 收集日志;Fluentd 插件丰富功能强大,适合对日志进行集中处理,二者可以独立使用,也可以协作共存,使用方案非常灵活。

仅使用 Fluent Bit 收集日志

Fluent Operator 可以非常便捷地部署 FluentBit Daemonset 服务,运行于各计算节点。当然集群层级的 FluentBit CRD 也可以配置各种 Input,Filter,Parser,Output 等。Fluent Bit 支持将日志直接导出到 ElasticSearch,Kafka,Loki,S3 等众多目标服务,这些只需配置 CRD 即可。

仅使用 Fluentd 收集日志

Fluent Operator 可以非常便捷地将 Fluentd 部署为 Statefulset 服务,应用可以通过 HTTP,Syslog 等方式发送日志,同时 Fluentd 还支持级联模式,即 Fluentd 可以接收来自另一个 Fluentd 服务的日志。类比于 Fluent Bit,Fluentd 也支持集群级别的 CRD 配置,可以方便的配置 Input,Filter,Parser,Output 等。Fluentd 内置支持上百种插件,输入输出都非常丰富。

同时使用 Fluentd 和 Fluent Bit

Fluentd 和 Fluent Bit 在设计架构上极为相似,都有着丰富的社区插件支持,但二者侧重的使用场景有所差异。Fluent Bit 小巧精致,资源消耗少,更适合作为 Agent 来采集日志,而 Fluentd 相对前者功能更加丰富,作为数据中转站或数据治理服务更为贴切。所以绝大多数场景中,二者配合可以构建出灵活高效且扩展性极强的日志收集流水线。

v1.0 后的重要更新

至 Fluent Operator 发布 v1.0.0 至今,仍然在高速迭代。v1.1.0 版本新增了对 OpenSearch 输出的支持;v1.5.0 新增了对 Loki 输出的支持,同时还增加了对监控指标(Metrics)采集的支持,支持清单如下:

  • Node Exporter 指标采集
  • Prometheus Scrape 指标采集
  • Fluent Bit 指标采集
  • Prometheus 远程写入的输出信息采集
  • OpenTelemetry 输出采集

正是基于对监控指标采集的支持,Fluent Operator 才可以完美构建云边统一的可观测性。

以上内容关注的是对云端资源的数据采集,下面我们来看看 Fluent Operator 在边缘计算场景下的支持情况。

我们使用的边缘计算框架是 KubeEdge,下面我给大家介绍下 KubeEdge 这个项目。

KubeEdge 介绍

KubeEdge 是 CNCF 孵化的面向边缘计算场景、专为边云协同设计的云原生边缘计算框架,除了 KubeEdge 之外还有很多其他的边缘计算框架,比如 K3s。K3s 会在边缘端创建完整的 K8s 集群,而 KubeEdge 只是在边缘端创建几个边缘节点(Edge Node),边缘节点通过加密隧道连接到云端的 K8s 集群,这是 KubeEdge 与 K3s 比较明显的差异。

KubeEdge 的边缘节点会运行一个与 Kubelet 类似的组件叫 Edged,比 Kubelet 更轻量化,用来管理边缘节点的容器。Edged 也会暴露 Prometheus 格式的监控指标,而且暴露方式和 Kubelet 保持一致,都是这种格式:127.0.0.1:10350/metrics/cadvisor

统一可观测性方案架构

下面着重讲解如何使用 Fluent Bit 来实现云边统一的可观测性

直接来看架构图,云端部署了一个 K8s 集群,边缘端运行了一系列边缘节点。云端通过 Prometheus Agent 从 Node Exporter、Kubelet 和 kube-state-metrics 等组件中收集监控指标,同时还部署了一个 Fluent Operator 用来同时管理和部署云端和边缘端的 Fluent Bit Daemonset 实例。

对于边缘节点来说,情况就不那么乐观了,因为边缘节点资源有限,无法部署以上这些组件来收集可观测性数据。因此我们对边缘端的监控指标收集方案进行了改良,将 Prometheus (Agent) 替换为 Fluent Bit,并移除了 Node Expoter,使用更轻量的 Fluent Bit Node Exporter Metrics 插件来替代,同时使用 Fluent Bit Prometheus Scrape Metrics 插件来收集边缘端 Edged 和工作负载的监控指标。

这个架构的优点是只需要在边缘端部署一个组件 Fluent Bit,而且可以同时收集边缘节点和边缘应用的日志和监控指标,对于资源紧张的边缘节点来说,这是一个非常完美的方案。

统一可观测性方案实践

最后给大家演示下如何在边缘端部署 Fluent Bit,并使用它来收集边缘节点的监控指标和日志数据。Fluent Bit 的部署方式通过自定义资源(CR)FluentBit 来声明,内容如下:

apiVersion: fluentbit.fluent.io/v1alpha2
kind: FluentBit
metadata:
name: fluentbit-edge
namespace: fluent
labels:
app.kubernetes.io/name: fluent-bit
spec:
image: kubesphere/fluent-bit:v1.9.9
positionDB:
hostPath:
path: /var/lib/fluent-bit/
resources:
requests:
cpu: 10m
memory: 25Mi
limits:
cpu: 500m
memory: 200Mi
fluentBitConfigName: fluent-bit-config-edge
tolerations:
- operator: Exists
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/edge
operator: Exists
hostNetwork : true
volumes:
- name: host-proc
hostPath:
path: /proc/
- name: host-sys
hostPath:
path: /sys/
volumesMounts:
- mountPath: /host/sys
mountPropagation: HostToContainer
name: host-sys
readOnly: true
- mountPath: /host/proc
mountPropagation: HostToContainer
name: host-proc
readOnly: true

我们通过 Node Affinity 将 Fluent Bit 指定部署到边缘节点。为了能够替代 Node Exporter 组件的功能,还需要将 Node Exporter 用到的主机路径映射到容器中。

接下来需要通过自定义资源 ClusterInput 创建一个 Fluent Bit Prometheus Scrape Metrics 插件来收集边缘端工作负载的监控指标:

apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterInput
metadata:
name: prometheus-scrape-metrics-edge
labels:
fluentbit.fluent.io/enabled: "true"
node-role.kubernetes.io/edge: "true"
spec:
prometheusScrapeMetrics:
tag: kubeedge.*
host: 127.0.0.1
port: 10350
scrapeInterval: 30s
metricsPath : /metrics/cadvisor

并通过自定义资源 ClusterInput 再创建一个 Fluent Bit Node Exporter Metrics 插件来收集边缘节点的监控指标(替代 Node Exporter):

apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterInput
metadata:
name: node-exporter-metrics-edge
labels:
fluentbit.fluent.io/enabled: "true"
node-role.kubernetes.io/edge: "true"
spec:
nodeExporterMetrics:
tag: kubeedge.*
scrapeInterval: 30s
path :
procfs: /host/proc
sysfs : /host/sys

最后还需要通过自定义资源 ClusterOutput 创建一个 Fluent Bit Prometheus Remote Write 插件,用来将边缘端收集到的监控指标写入到 K8s 集群的 Prometheus 长期存储中。

apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterOutput
metadata:
name: prometheus-remote-write-edge
labels:
fluentbit.fluent.io/enabled: "true"
node-role.kubernetes.io/edge: "true"
spec:
matchRegex: (?:kubeedge|service)\.(.*)
prometheusRemoteWrite:
host: <cloud-prometheus-service-host>
port: <cloud-prometheus-service-port>
uri: /api/v1/write
addLabels :
app : fluentbit
node: ${NODE_NAME}
job : kubeedge

基于上述步骤,最终我们通过 Fluent Bit 实现了云边统一的可观测性。

总结

虽然 Fluent Bit 的初衷是收集日志,但最近也开始支持收集 Metrics 和 Tracing 数据,这一点很令人兴奋,这样就可以使用一个组件来同时收集所有的可观测性数据(Log、Metrics、Tracing)了。如今 Fluent Operator 也支持了这些功能,并通过自定义资源提供了简单直观的使用方式,想要使用哪些插件直接通过自定义资源声明即可,一目了然。

当然,Fluent Operator 这个项目还很年轻,也有很多需要改进的地方,欢迎大家参与到该项目中来,为其添砖加瓦。

本文由博客一文多发平台 OpenWrite 发布!

使用 Fluent Bit 实现云边统一可观测性的更多相关文章

  1. 阿里云基于OSS的云上统一数据保护方案2.0技术解析

    近年来,随着越来越多的企业从传统经济向数字经济转型,云已经渐渐成为数据经济IT新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源. 阿里云基于 ...

  2. 阿里云基于OSS的云上统一数据保护方案2.0正式发布

    近年来,随着越来越多的企业从传统经济向数字经济转型,云已经渐渐成为数据经济IT新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源.阿里云基于O ...

  3. 多云混合云之多集群统一管理:基于阿里云ACK统一纳管多个不同Kubernetes集群

    目前阿里云云原生产品家族已经支持多集群管理功能,允许使用阿里云容器服务Kubernetes(简称ACK)控制台或kubectl命令接入.统一纳管其他公有云.客户IDC自建K8s集群,集中管理部署K8s ...

  4. OpenTelemetry - 云原生下可观测性的新标准

    CNCF 简介 CNCF(Cloud Native Computing Foundation),中文为"云原生计算基金会",CNCF是Linux基金会旗下的基金会,可以理解为一个非 ...

  5. 阿里云ECOS 集群方案

    转载 https://it.toggle.cn/article_detail/7e6f674b2564d6c319f807b4fda87eac.html 架构说明 前端由阿里云SLB统一分发Web请求 ...

  6. 《Kubernetes与云原生应用》系列之容器设计模式

    http://www.infoq.com/cn/articles/kubernetes-and-cloud-native-app-container-design-pattern <Kubern ...

  7. 【云计算】IBM开放云架构

    IBM 的开放云架构 通过改变业务和社会运行的方式,云计算开启了丰富的创新途径.开发人员现在正将记录系统与参与性系统相结合,一种新的基于云的应用程序风格正在出现:交互系统.这些应用程序要可持续发展,云 ...

  8. [案例分析] 政务云市场面临的复杂格局——重庆政务云模式的启示:多厂商竞争化、PaaS 化

    新闻背景: 2019 年 9 月底,重庆市大数据应用发展管理局发布政务云平台采购公告,预算金额为 5000 万元,以上 4 家入选. 最终项目被项目被阿里云.腾讯云.华为云.紫光云 4 家瓜分. 50 ...

  9. 腾讯云IPv6技术拿了个一等奖!1.5亿人已经用上

    中国通信学会在其官网上公布了2019年中国通信学会科学技术奖的评选结果,腾讯云和中国移动通信集团,中国信息通信研究院.以及华为联合申报的“移动互联网IPv6技术攻关及规模应用”项目荣获今年科学技术一等 ...

  10. 阿里云应用上边缘云解决方案助力互联网All in Cloud

    九月末的杭州因为一场云栖大会变得格外火热. 9月25日,吸引全球目光的2019杭州云栖大会如期开幕.20000平米的展区集结数百家企业,为数万名开发者带来了一场前沿科技的饕餮盛宴. 如同往年一样,位于 ...

随机推荐

  1. ROS(机器人操作系统)的基本了解

    参考: https://blog.csdn.net/qq_51963216/article/details/125754175 https://zhuanlan.zhihu.com/p/5956062 ...

  2. (HASEE)神州笔记本 还原手册 —— 笔记本系统还原

    新买了一个笔记本,神州笔记本(HASEE),随机所带的手册,为防止丢失故把内容记录下来. 开机时按:CTRL + H 进入还原界面,点击"系统还原",点击"恢复出厂备份& ...

  3. SMU Summer 2024 Contest Round 5

    SMU Summer 2024 Contest Round 5 Robot Takahashi 思路 按照 \(W_i\) 排个序,算一下前缀后缀 1 和 0 的个数就行了.答案大概是一个 \(\ma ...

  4. 【CMake系列】03-cmake 注释、常用指令 message、set、file、for_each、流程控制if

    本文给出了 cmake 中的 一些常用的 指令,可以快速了解,为后面的内容深入 打点基础. 本专栏的详细实践代码全部放在 github 上,欢迎 star !!! 如有问题,欢迎留言.或加群[3927 ...

  5. Elsa V3学习之Hello Word

    前面文章介绍了Elsa的基础节点内容,接下来我们来开始实践一下. 启动项目 启动源码目录src\bundles中的Elsa.ServerAndStudio.Web的项目.这个项目包含Elsa Serv ...

  6. luoguP3330 [ZJOI2011] 看电影--组合数学--高精度

    \(luoguP3330\) [ZJOI2011] 看电影 废了老命想题解 $$luogu$$ $$HZOI$$ 题意 到了难得的假期,小白班上组织大家去看电影.但由于假期里看电影的人太多,很难做到让 ...

  7. win指令学习收集

    要执行多句,需要用到逻辑判断 1 & 2 1成不成功都会执行2 1 && 2 1成功才会执行2 1 || 2 1不成功才会执行2

  8. C#应用 - 破解注入外挂必备神器Harmony

    目录 前言 1,快速开始 1.1 SomeGameClass类 1.2 Patch01类 1.3 MyPatcher类 1.4 跑起来 2,破解 2.1 类库项目 2.2 winform项目 3,注入 ...

  9. 【Python自动化】之利用JS操作页面滚动条(新)

    如何操作页面中的滚动条,有以下几个方法: 一.查找可见元素进行滚动页面(通用) 方法一: ①移动到元素element对象的"顶端",与当前窗口的"顶部"对齐(默 ...

  10. 2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从这n个孩子中选出k个孩子。 在筛选过程中,每轮选择一个孩子时,所有尚未选

    2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从这n个孩子中选出k个孩子. 在筛选过程中,每轮选择一个孩子时,所有尚未选 ...