本文基于 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. NVIDIA公司官宣最新最高性能的GPU芯片及平台 —— Blackwell GPU

    官宣视频: https://www.youtube.com/watch?v=bMIRhOXAjYk 相关: https://baijiahao.baidu.com/s?id=1793921686210 ...

  2. 七牛云-存储区域代码:报错:"statusCode": 400,"error": incorrect region, please use up-cn-east-2.qiniup.com ——【图床】Typora 七牛云图床 配置文件

    使用PicList对七牛云配置图床,报错信息: 2023-12-13 19:52:19 [PicList ERROR] { "method": "POST", ...

  3. ubuntu18.04 安装wine64出现错误: X 64-bit development files not found.

    ubuntu18.04 编译源码方式安装  wine6.11 ,   报错: 缺少依赖,解决方法如下: sudo apt install xserver-xorg-dev 参考: https://bl ...

  4. Python多进程共享numpy 数组

    引用:https://zhuanlan.zhihu.com/p/32513483 共享 numpy 数组 需要用到 numpy 时往往是数据量较大的场景,如果直接复制会造成大量内存浪费.共享 nump ...

  5. Git 使用中的一些例子

    本文紧接前文: .gitignore文件的使用方法(学习总结版)-- .gitignore 文件的配合用法 ============================================= ...

  6. XXL-JOB系统化图文教程

    1.背景 大纲 调度任务在系统中中经常用到, 比如 定时发送营销短信 定时检查订单状态 等等..... 总之我们经常会用到定时任务 官方文档:https://www.xuxueli.com/xxl-j ...

  7. .NET 免费开源工业物联网网关

    前言 IoTClient 是一个针对物联网 (IoT) 领域的开源客户端库,它主要用于实现与各种工业设备之间的通信.这个库是用 C# 编写的,并且基于 .NET Standard 2.0,这意味着可以 ...

  8. 使用 extract_sqlaudit_proc 存过分析ob性能问题

    最近在某个金融单位核心系统项目做ob的性能压测,期间遇到不少问题,现场两周了每天都加班到凌晨一两点左右,真的是累死. 我其实进ob之前有心理预期,卷就卷吧,八九点下班也能接受,没想到真到了干项目的情况 ...

  9. spring手动事务控制

    在项目开发中需要用到手动事务进行控制.现说下遇到的问题以及解决方案: 如果程序需要使用嵌套事务,则需要在配置文件中添加一个配置属性,如下: <bean id="transactionM ...

  10. Go进程内存占用那些事(一)

    为什么要探究这个问题? 作为基础设施供应商,自己的服务占用多少内存,为什么要占用这么多内存,需要能说的清楚.作为一个云计算开发,这点问题都弄不清楚,说不过去. § 0x01 范围 讨论的只限于Linu ...