前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >KubeGems 与 Logging Operator 的美妙火花

KubeGems 与 Logging Operator 的美妙火花

作者头像
云原生小白
发布于 2022-04-13 07:28:05
发布于 2022-04-13 07:28:05
1.1K00
代码可运行
举报
文章被收录于专栏:LokiLoki
运行总次数:0
代码可运行

TL;DR

KubeGems Logging 服务主要面系统内部以及平台内租户提供日志采集、解析、传输和存储等相关的能力。依靠 Logging Operator 对日志的配置和路由管理,实现平台的终端用户可以对应用运行期间的日志进行实时查询和分析。KubeGems 日志持久化采用 Grafana Loki 实现。

更多信息在GitHub上搜索「kubegems」,或访问 https://kubegems.io

核心需求

多租户

KubeGems 是一个多租户平台,基于此场景。平台内部对于租户应用产生的日志应该具备独立的解析配置以及路由规则

系统鲁棒性

  • 高性能
    • 日志采集和转发性能至少需处理 10K line/sec
    • 支持采取日志限流策略
    • 日志延迟不得低于 5min
  • 可扩展
    • 架构支持灵活的水平扩展以提升整体日志吞吐量
    • 组件应满足无状态属性

可运维性

  • 可配置
    • 日志规则和路由的配置应 CRD 化,由 Operator 统一管理,并尽量做到配置简化。
    • 需支持常见的 json 解析字段增删改 等插件配置。
    • 应用日志应满足发送多种常见的数据管道或收集系统,诸如 kafka、elasticSearchMongoDB 等。
  • 可视化
    • 日志规则应在 UI 中由用户组合装配置日志的解析与输出规则。
  • 监控与告警
    • 日志采集的状态统计,包含组件运行状态以及日志流统计。
    • 需支持用户根据自定义日志片段进行设置告警规则。

需求边界

  • 对于应用日志没有输出到控制台(stdout)的场景,暂不纳入采集需求

可采取其他方式重定向内部日志到控制台,诸如s6-log

日志设计

Logging Operator

Logging Operator 是 BanzaiCloud 下开源的一个云原生场景下的日志采集方案。它在 2020 年 3 月的时候经过重构后的 v3 版本,底层凭借高效的 fluentbit 和插件丰富的 flunetd,Logging Operator几乎已经完美的适配了 kubernetes 模式下的日志采集场景。

在 KubeGems 1.20 的版本中,我们选择采用 Logging Operator 作为内部日志流传的核心框架。其主要原因如下:

  • 原生 Flow 和 Output 类资源作用域为 kubernetes 命名空间,这与 KubeGems 租户环境的资源独立性相谋和
  • 采用高性能的 fluentbit 作为日志采集客户端,fluentd 为日志聚合端。flunetd 在 logging 中通过 replicas 控制副本数,可根据吞吐量水平扩容
  • flunetd 支持的插件较为丰富,满足当前基本需求

Logging Operator 不足:

  • 核心资源 Flow 和 Output 交于用户配置较为困难,需要 KubeGems 将资源封装(需兼容源对象)
  • 可观测性功能较弱
  • 日志 Match 部分功能较弱,无法通过直接匹配 workload 进行关联

KubeGems 日志整体架构

由 Logging Operator 负责日志组件的运行管理和配置管理,租户侧资源以 CR 的方式在所属的环境空间中管理。Operator 将 CR 渲染为 Fluentd 的配置文件,用于处理日志的过滤和转发规则。可观测部分,由 KubeGems Plugins 服务初始化 ServiceMonitor,抓取组件运行期间的状态。

KubeGems Logging

KubeGems 对 Logging Operator 的封装仅满足简单的两种模式的场景:

  • 精简模式 开箱即用的日志采集模式,对于用户环境空间内的所有容器开启采集,并输出到 KubeGems 平台内置的 Loki 组件用于日志分析和告警等场景
  • 局部自定义模式 面向希望通过配置局部容器日志采集,且需要对接外部日志分析系统的场景时,由用户自定义 flows/outputs 镜像配置。
  • 原始模式 除此之外,对于希望能够完全掌握平台内的日志路由的高端用户,KubeGems 只需兼容对 Logging Operator 的原始 CR 资源即可。

精简模式

对于通用场景下的容器控制台日志采集,KubeGems 采用精简模式配置规则,仅需在用户界面中支持 一键配置开启日志采集 功能。一键启用功能的实现主要分为两部分

  1. KubeGems Installer 服务在对 kubernetes 集群启用 logging 插件时,将对 logging operator 以及关联的 clusteroutputs/containers-console资源进行初始化。 默认的clusteroutput 资源定义了容器日志的输出路径是 Loki
  2. 用户创建默认的容器采集规则时,LabelSelector 为空,即匹配当前命名空间下的所有 Pod。
  3. Flow 中只启用 Prometheus 插件用于统计采集状态。
  4. Flow 中关联系统默认的 clusteroutputs/containers-console

即在精简模式下,KubeGems 只在租户空间的接口中传入如下参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST  observe/log/<tenant_name>/flowlite?enabled=true&namespace=tenant

参数

释意

required

Type

enabled

启用环境空间的日志采集功能

True

Boolean

namespace

采集日志的目标命名空间

True

String

KubeGems 将 Flows 渲染为如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: logging.banzaicloud.io/v1beta1
kind: Flow
metadata:
  name: default
  namespace: tenant
spec:
  match:
    - select: {}
  filters:
  - prometheus:
      labels:
        container: $.kubernetes.container_name
        namespace: $.kubernetes.namespace_name
        node: $.kubernetes.host
        pod: $.kubernetes.pod_name
      metrics:
      - desc: Total number of log entries generated by either application containers
          or system components
        name: logging_entry_count
        type: counter
  globalOutputRefs:
  - containers-console

局部自定义模式

用户如果需要按照应用日志需求,局部对环境空内应用进行日志的规则和路由时,KubeGems 需要对 Logging Operator 的 CR 资源进行优化,以方面在用户界面中实现跟友好的交互。其中首先需要处理平台 应用元数据 相关的事务。默认情况下 Flow 的规则采用 labelSelector 对命名空间内资源做匹配,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: logging.banzaicloud.io/v1beta1
kind: Flow
metadata:
  name: default 
  namespace: tenant
spec:
  localOutputRefs:
    - defalt
  match:
    - select:
        labels:
          app: nginx

虽然通过 labelSelector可以灵活控制日志采集规则,但经过实际验证,这个逻辑仍然存在 反直觉的场景,用户大多需要的是在 Selector 阶段与应用资源直接关联 ,当然我们不能直接把label 与 workload 做等同映射。我们需要通过外部方式来对 Label 做通用性匹配。

KubeGems CommonLabels

KubeGems 通用标签 是根据用户上层操作而对 Kubernetes Workload 做自动注入的一组元数据。它是一组常量,被定义到common.go当中。当用户在 Kubernetes 中做资源对象的操作时,它会以 mutatingwebhook的方式自动注入的被管理的资源对象当中。

CommonLabel 中的 kubegems.io/applications 或者 Kubernetes 中的 app.kubernetes.io/nameapp共同声明了该应用的 workerload 标签。基于此,用户在创建日志规则是,可以通过 LabelSelector 定位到环境下的唯一资源。对于用户提交的 Flow ,同一种日志解析、路由规则类型的资源可以集中管理配置,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: logging.banzaicloud.io/v1beta1
kind: Flow
metadata:
  name: default
  namespace: tenant
spec:
  localOutputRefs:
    - default
  match:
    - select:
        labels:
          kubegems.io/applications: nginx
    - select:
        labels:
          kubegems.io/applications: mysql
    - select:
        labels:
          app.kubernetes.io/name: tomcat
局部模式下的用户流程

局部自定义模式下,开放普通用户配置有限功能的 Flow 以及 Outputs 资源。KubeGems 仍然需要对 CR 做简单接口封装。它的调用流程如下:

  1. 创建日志规则时,请求KubeGems listWorkload 返回当前环境空间下具备采集条件( CommonLabel)的资源列表,由用户在前端选择加入。
  2. 用户界面内提供插件列表,有用户自定义插件是否启用
  3. 通过请求 KubeGems listOutput 返回当前环境下可用的日志路由。普通用户同时也具备列出 ClusterOutput 资源(它由KubeGems 平台管理员创建)。
  4. 日志规则关联 localOutputRefs或者 globalOutputRefs后提交给 KubeGems 后台渲染 Flow 文件。
  5. Flow/Output 资源由 Logging Operator 处理,并返回资源validate结果和状态。

即在 局部自定义模式 下,KubeGems 在租户空间的接口中传入如下参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST  observe/log/<tenant_name>/flow?name=tenant&namespace=tenant&monitor=true&throttle=4000&geoip_keys=remote_addr&outputs=my-elasticsearch,my-kafka&clusteroutputs=loki

参数

释意

required

Type

name

日志采集规则名称

True

String

namespace

采集日志的目标命名空间

True

String

monitor

启用日志采集状态监控,default: true

False

Boolean

throttle

启用容器级日志条目限速,Lines / 10s

False

Int16

geoip_keys

启用 GEO IP

False

String

outputs

普通日志输出通道,多个通道用 ,逗号分割

At laeast one

String

clusteroutputs

日志输出通道,多个通道用 ,逗号分割

At laeast one

String

outputs 和 clusteroutputs 参数至少满足一个

KubeGems 将 Flow 渲染如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: logging.banzaicloud.io/v1beta1
kind: Flow
metadata:
  name: tenant
  namespace: tenant
spec:
  filters:
   - geoip:
       geoip_lookup_keys: remote_addr
       records:
         - city: ${city.names.en["remote_addr"]}
           location_array: '''[${location.longitude["remote"]},${location.latitude["remote"]}]'''
           country: ${country.iso_code["remote_addr"]}
           country_name: ${country.names.en["remote_addr"]}
           postal_code:  ${postal.code["remote_addr"]}
  - record_modifier:
      records:
      - throttle_group_key: ${record['kubernetes']['namespace_name']+record['kubernetes']['pod_name']}
  - prometheus:
      labels:
        container: $.kubernetes.container_name
        namespace: $.kubernetes.namespace_name
        node: $.kubernetes.host
        pod: $.kubernetes.pod_name
      metrics:
      - desc: Total number of log entries generated by either application containers
          or system components
        name: logging_entry_count
        type: counter
  - throttle:
      group_bucket_limit: 4000
      group_bucket_period_s: 10
      group_key: throttle_group_key
  localOutputRefs:
  - my-elasticsearch
  - my-kafka
  globalOutputRefs:
  - loki

原始模式

对于租户需要使用 Logging Operator 完整特性来做自定义日志解析场景,KubeGems 只需在页面中满足对 **Flow 原始格式 **的校验和提交即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST  observe/log/<tenant_name>/flow?raw=true

Body:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: logging.banzaicloud.io/v1beta1
kind: Flow
metadata:
  name: kafka
spec:
  filters:
   - tag_normaliser: {}
   - parser:
       remove_key_name_field: true
       reserve_data: true
       parse:
         type: multi_format
         patterns:
         - format: nginx
         - format: regexp
           expression: /foo/
         - format: none
  match:
    - select:
        labels:
          app.kubernetes.io/name: log-generator
  localOutputRefs:
    - kafka-output

KubeGems Log Observability

KubeGems 的日志可观测性主要满足以下几点需求

  • 用户环境空间内的日志采集速率分析
  • 用户环境空间内的错误日志统计
  • 用户自定义的日志告警规则

默认情况下 KubeGems Logging 插件集成了 Loki 实例用于持久化平台内容器日志。借有 Loki Ruler,可实现日志告警和错误日志分析相关功能。

日志可观测性流程

  1. KubeGems Installer 在 Kubernetes 集群初始化阶段负责将 Logging 插件下的 Loki 和 Recording Rules 配置。
  2. 普通用户在用户界面中创建日志告警规则,由 KubeGems 将告警规则以 Loki API 方式提交。
  3. 当产生Loki 产生日志告警时,经由 AlertManager 将告警事件推送给用户,并在 KubeGems Webhook 记录。

在上述流程中,KubeGems 日志告警中仅需提供 logrules 接口,用于管理用户告警内容。

Log Alerting Template

Loki 的 Rules 的语法规则和 Prometheus 一样,区别只在expr中体现。当前 KubeGems 中的 Metrics 告警采用的是预制模板 的方式,以支持用户更快的创建规则。在日志告警规则也可参考此方式,预制常见的 LogQL 模板。

普通模板

普通模板即用户只需要设置日志关键字符以管道的方式过滤字符。KubeGems 在后端组装语句 expr 并请求 Loki API 完成规则提交 。查询语句如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum by (pod,namespace,application) (count_over_time({pod="<pod>",namespace="<namespace>",applications="<applications>"}  |~ `<your_log_string>`  |~ `<your_log_string>`[1m]))
格式化模板(json/logfmt)

采用 LogQL 的格式化解析器提取日志,通过查找 key-values 的方式过滤结果。

  • json 解释器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum by  (pod,namespace,application) (count_over_time({pod="<pod>",namespace="<namespace>",applications="<applications>"}  | json |  <your_key>=<your_string>  |   __error__=""[1m]))
  • logfmt
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 sum by  (pod,namespace,application) (count_over_time({pod="<pod>",namespace="<namespace>",applications="<applications>"}  | logfmt |  <your_key>=<your_string>  |   __error__=""[1m]))
高级模式

采用 LogQL 原生语句直接提交 Rules。

上述 3 种 LogQL 预制模板,最终提交的格式化 alertrules 结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  - name: should_fire
    rules:
      - alert: <your_log_string>-alert
        expr: sum by (pod,namespace,application) (count_over_time({pod="<pod>",namespace="<namespace>",applications="<applications>"}  |~ `<$your_log_string>`  |~ `<$your_log_string>`[1m]))  >= <$your_thresholds>  
        for: 1m
        labels:
            severity: <$your_severity>
            pod: {{$labels.pod}}
            namespace: {{$labels.namespace}}
            application: {{labels.applicastions}}
        annotations:
            summary:  message <your_log_string> alerting ,now has {{$labels.value}}.

Log Recording Rules

Recording Rules 允许用户预先将需要进行大量计算的表达式的结果转化保存为一组新的时间序列,并将其通过 remote_write的方式写入 Prometheus。在 KubeGems 中,平台将接入 Logging Observability 的应用预制了通用性的 Error Log Rules。

与 Alerting Rules 一样,Recoring Rules 如要 Loki Ruler 的支持,这部分将在 KubeGems Installer 初始化中部署到您的集群。

关于 Loki Ruler 对 RemoteWrite 的配置,可查考loki/remote-write

Log Metrics

Log Metrics 在 KubeGems 中,由用户提交的日志采集器中声明,这部分采用 fluent-plugin-prometheus,核心部分即为每个进入管道的日志流创建一个 计数器(Counter)并记录其条目和元数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  - prrometheus:
      labels:
        container: $.kubernetes.container_name
        namespace: $.kubernetes.namespace_name
        node: $.kubernetes.host
        pod: $.kubernetes.pod_name
      metrics:
      - desc: Total number of log entries generated by either application containers
          or system components
        name: logging_entry_count
        type: counter

最终由 Prometheus 将指标logging_entry_count持久化到本地。

总结

KubeGems 中基于租户的日志采集方案整体设计采用 Logging Operator + Loki 架构,用户可根据企业自身组织结构对其进行管理和适配。对于在 Kubernetes 集群中操作原生的 CRD 资源复杂的场景下,KubeGems 尽量让用户在接入日志采集、监控和告警的三个方面做到开箱即用的功能,极大简化系统管理者或研发人员的是学习和接入成本。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生小白 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
Chrome 35个开发者工具的小技巧【动态图演示】
谷歌浏览器如今是Web开发者们所使用的最流行的网页浏览器。伴随每六个星期一次的发布周期和不断扩大的强大的开发功能,Chrome变成了一个必须的工具。大多数可能熟悉关于chorme的许多特点,例如使用c
前朝楚水
2018/04/02
8990
Chrome 35个开发者工具的小技巧【动态图演示】
Chrome开发者工具完全入门指南:零基础到日常调试
最常用图示说明:① Elements 元素 ② Console 控制台 ③ Sources 源代码来源 ④ Network 网络 ⑤ Performance 性能
小明互联网技术分享社区
2025/05/16
6950
Chrome开发者工具完全入门指南:零基础到日常调试
web调试优化-chrome开发者工具不完全指南
chrome,对于web开发者而言,都是很熟悉的一个浏览器,无论是从事的是前端,后端或者是测试!简单、快捷和功能强大使它受到了许多开发者的青睐!在浏览器排行上,chrome最多人使用,而且占了浏览器份额的半壁江山。可见其欢迎程度。作为一个前端开发者,我也是注重chrome的使用技巧。今天给大家分享下,希望能帮到大家,如果大家还有些什么好用的技巧,欢迎在评论补充,让大家交流意见,一起进步!
守候i
2018/08/22
8590
web调试优化-chrome开发者工具不完全指南
如何优雅的对网页截取长图
最近写文章想截个长图,才发现一直使用的QQ早有这个功能了,这里就整理几个pc上网页长截图的方案。
苏生不惑
2020/04/02
1.4K0
如何优雅的对网页截取长图
几个非常实用的 Chrome Devtools 技巧
关于 Chrome 浏览器,如果你是一名前端开发者,相信对此并不陌生,我们可以用它来查看 网络请求、分析网页性能、调试 JavaScript 功能 等。
唐志远
2023/10/23
7100
几个非常实用的 Chrome Devtools 技巧
前端浏览器调试小技巧
作为一个前端开发者,我们每时每刻都跟浏览器打交道,在开发的过程中,我们需要不断的在浏览器中查看编写的成果,合理使用浏览器的控制台功能,将有助我们快速开发,节约时间以获得 Work Life Balance 的体验。下面我们提一下几点调试的技巧。
Jimmy_is_jimmy
2022/04/29
4330
前端浏览器调试小技巧
Chrome DevTools中的这些骚操作,你都知道吗?
作为开发人员,平时用的最多的就是Chrome devtools了,但是可能很多同学都像我一样平时用的最多也就只是Console和Elements面板了。
前端森林
2020/05/26
1.6K0
Chrome DevTools中的这些骚操作,你都知道吗?
Chrome开发者工具的11个高级使用技巧
本文作者从开发者角度出发,介绍了几个关于 Chrome 开发者工具的高级用法。熟练使用这些高级用法可以大大地提高你的生产力。
深度学习与Python
2020/08/28
2.5K0
学会前端调试技巧,提升排错效率
我们系统程序的漏洞就叫 bug。世界上第一个 bug ,是 1946 年霍普发现了第一个电脑上的 bug,竟然是一只飞蛾“臭虫”。解决这些问题的过程叫做捉虫、调试,也就是 Debug。
黄啊码
2022/06/20
2.1K0
11+ chrome高级调试技巧,学会效率直接提升666%
chrome浏览器作为前端童鞋的老婆,相信你一定不陌生。调页面、写BUG、画样式、看php片少了它整个世界都不香了。
前端胖头鱼
2022/07/25
1K0
11+ chrome高级调试技巧,学会效率直接提升666%
chrome使用技巧(看了定不让你失望,不错)
之前有看过刘哇勇写的Chrome 控制台不完全指南,让我觉得瞬间对chrome的了解实在太浅了。对此特意了解了一番(也就是在他的博文上进行了一些总结和了解一些其它chrome使用方面的诀窍),写了两篇博文
bear_fish
2018/09/19
9690
chrome使用技巧(看了定不让你失望,不错)
10个 Chrome 开发工具和技巧
最近开源了一个 Vue 组件,还不够完善,欢迎大家来一起完善它,也希望大家能给个 star 支持一下,谢谢各位了。
前端小智@大迁世界
2021/01/30
8950
11 个很酷的 Chrome Devtools 技巧
英文 | https://javascript.plainenglish.io/11-cool-chrome-devtools-tips-and-tricks-i-wish-i-knew-already-a9e2e078f78
winty
2022/11/07
1K0
11 个很酷的 Chrome Devtools 技巧
Chrome浏览器调试技巧大全!
注:本文测试、截图均为Edge浏览器(内核是Chromium),浏览器内核可了解《有哪些浏览器/内核?[1]》
zz_jesse
2024/07/04
4620
Chrome浏览器调试技巧大全!
炫酷浏览器调试小技巧,别跟我说你全知道?
翻译原文:Cool Chrome DevTools tips and tricks you wish you knew already
掘金安东尼
2024/01/27
1930
炫酷浏览器调试小技巧,别跟我说你全知道?
Chrome代码调试指南
安装此插件后,如果网页是由 react 开发的,那么开发者工具会多出一个 react 的选项,并且插件图标是点亮的。
Dreamy.TZK
2020/08/20
2.4K0
Chrome代码调试指南
分享一些Chrome开发工具的用法
在元素面板选择一个元素,然后在控制台输入$0,就会在控制台中得到刚才选中的元素。如果页面中已经包含了 jQuery,你也可以使用$($0)来进行选择。
javascript.shop
2020/02/17
1.1K0
Web开发前端调试小技巧——Chrome控制台
Hello大家好,兔妞总觉得写代码很重要,调试也很重要,特别是前端,不光要看日志,还要调整样式,浏览器兔妞最喜欢用Chrome了,所以今天就为大家带来Chrome的调试技巧啦~~
萌兔IT
2019/07/25
2.2K0
Web开发前端调试小技巧——Chrome控制台
前端必须知道的开发调试知识 - 笔记
小技巧:不同类型的数据从 console 中打印出的颜色也不相同,可以借此判断数据类型
TagBug
2023/03/17
1.2K0
前端必须知道的开发调试知识 - 笔记
Chrome 调试技巧
想必大家都在用console.log在控制台输出点东西,其实console还有其它的方法:
前端教程
2018/10/25
2.4K0
Chrome 调试技巧
推荐阅读
相关推荐
Chrome 35个开发者工具的小技巧【动态图演示】
更多 >
LV.3
腾讯行业应用产品经理
目录
  • TL;DR
  • 核心需求
    • 多租户
    • 系统鲁棒性
    • 可运维性
    • 需求边界
  • 日志设计
    • Logging Operator
    • KubeGems 日志整体架构
  • KubeGems Logging
    • 精简模式
    • 局部自定义模式
      • KubeGems CommonLabels
      • 局部模式下的用户流程
    • 原始模式
  • KubeGems Log Observability
    • 日志可观测性流程
    • Log Alerting Template
      • 普通模板
      • 格式化模板(json/logfmt)
      • 高级模式
    • Log Recording Rules
    • Log Metrics
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档