云原生日志采集管理方案--Logging Operator

本文涉及的产品
对象存储 OSS,20GB 3个月
日志服务 SLS,月写入数据量 50GB 1个月
文件存储 NAS,50GB 3个月
简介: Logging Operator是BanzaiCloud开源的一个云原生场日志采集方案,它整合了fluent 社区的两个开源日志采集器 FluentBit、Fluentd,以 operator 的方式自动化配置 k8s 日志采集pipeline。

背景

Fluentd/Fluent Bit作为云原生场景的可观测采集器,致力于打造云原生场景下的日志采集方案。Fluentd/Fluent Bit官方虽然提供了一些K8s的采集部署方案,但是总体来说自动化程度不高,操作也比较繁琐。所以也就催生出了各类Operator,比较有名的是Fluent Operator、Logging Operator,本文将重点介绍Logging Operator的原理及实战。

Logging Operator是BanzaiCloud开源的一个云原生场日志采集方案,它整合了fluent 社区的两个开源日志采集器 FluentBit、Fluentd,以 operator 的方式自动化配置 k8s 日志采集pipeline。

Logging Operator原理

Logging operator 可以自动部署和配置Kubernetes 日志采集pipeline。该operator会在每个节点上部署Fluent Bit DaemonSet,用于从节点文件系统中收集容器和应用程序日志;同时,Fluent Bit会查询 Kubernetes API 并使用有关 pod 的元数据丰富日志,并将日志和元数据都传输到 Fluentd。Fluentd接收后,经过过滤处理,最终传输给第三方存储系统。 整个日志的采集、传输过程始终在经过身份验证和加密的通道上传输。

使用者可以配置如下的CRD配置Logging operator:

  • logging:定义了FleuntBit、Fleuntd的基础配置;可以指定controlNamespace。
  • output:定义了namespace级别的日志输出配置。
  • flow:定义了namespaces级别的日志filtersoutputs流
  • clusteroutput:定义了cluster级别的日志输出配置。
  • clusterflow:定义了cluster级别的日志filtersoutputs流

CRD详解

flow/clusterflow

  • 作用:用来处理日志流的,决定了数据从哪里采集、如何过滤、路由分发。
  • match定义了哪些容器的日志会被采集。可以通过select、exclude表示选择或排除;字段可以是namespaces、labels、container_names等。
  • filters为Logging Operator的日志处理插件。常见的有:Parser(支持nginx、apache2、syslog、csv、json等)、Prometheus(可以对日志进行统计)、Tag Normaliser(tag修改器)等。
  • 示例1:将default命名空间下标签为app=nginx的容器日志,采集后按照nginx日志格式解析,最终日志的 tag 在 fluentd 最终汇总时设置为${namespace_name}.${pod_name}.${container_name} 格式。

apiVersion: logging.banzaicloud.io/v1beta1

kind: Flow  

metadata:

 name: default-flow

 namespace: default ##定义收集日志的命名空间

spec:

 filters:  ##定义过滤器,一个flow可以定义一个或者多个

   - parser:

       remove_key_name_field: true

       parse: ##parse支持apache2, apache_error, nginx, syslog, csv, tsv, ltsv, json, multiline, none, logfmt类型解析

         type: nginx

   - tag_normaliser:

       format: ${namespace_name}.${pod_name}.${container_name} ##在fluentd里面使用${namespace_name}.${pod_name}.${container_name}的格式

 localOutputRefs:

   - "elasticsearch-output" ## 定义Output

 match:  ## Kubernetes标签来定义哪些日志需要被采集

   - select:

       labels: ## 使用标签匹配采集日志

         app: nginx

  • 示例2: Prometheus 插件

apiVersion: logging.banzaicloud.io/v1beta1

kind: Flow  

metadata:

 name: default-flow

 namespace: default ##定义收集日志的命名空间

spec:

 filters:

   - parser:

       remove_key_name_field: true

       parse: ##parse支持apache2, apache_error, nginx, syslog, csv, tsv, ltsv, json, multiline, none, logfmt类型解析

         type: nginx ##采集日志按照Nginx格式进行处理

   - prometheus: ##Pormetheus插件

       metrics:

         - desc: The total number of nginx in log. ##指标说明

           name: nginx_log_total_counter  ##指标名称

           type: counter ##指标Prometheus类型

           labels: ## 指标标签

             app: nginx

       labels: ##指标标签

         host: ${hostname}

         tag: ${tag}

         namespace: $.kubernetes.namespaces

   - tag_normaliser:

       format: ${namespace_name}.${pod_name}.${container_name} ##在fluentd里面使用${namespace_name}.${pod_name}.${container_name}的格式

 localOutputRefs:

   - "es-output" ## 定义Output

 match:  ## Kubernetes标签来定义哪些日志需要被采集

   - select:

       labels: ## 使用标签匹配采集日志

         app: nginx

output/clusteroutput

  • 作用:表示处理完成的日志应该输出到哪里。
  • 示例:Output-Kafka配置

apiVersion: logging.banzaicloud.io/v1beta1

kind: Output  

metadata:

 name: kafka-output

spec:

 kafka:

   brokers: kafka-headless.kafka.svc.cluster.local:29092 ##kafka地址

   default_topic: topic

   topic_key: kafka-output ##kafka topic名称;

   sasl_over_ssl: false ##是否使用ssl

   format:

     type: json  ##类型

   buffer: ##发送buff配置

     tags: topic

     timekey: 1m

     timekey_wait: 30s

     timekey_use_utc: true

Logging Operator实战:Nginx Access Logs访问日志采集到Kafka

  • 安装logging-operator

$ helm repo add banzaicloud-stable https://kubernetes-charts.banzaicloud.com

$ helm repo update

$ helm upgrade --install --wait --create-namespace --namespace logging logging-operator banzaicloud-stable/logging-operator


$ kubectl get deployment -n logging

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE

logging-operator             1/1     1            1           10h

  • 安装Demo应用

$ helm upgrade --install --wait --create-namespace --namespace logging logging-demo banzaicloud-stable/logging-demo \

 --set "kafka.enabled=True"

  • 部署logging CRD

# 配置

$ kubectl -n logging apply -f - <<"EOF"

apiVersion: logging.banzaicloud.io/v1beta1

kind: Logging

metadata:

 name: default-logging-simple

spec:

 fluentd: {}

 fluentbit: {}

 controlNamespace: logging

EOF


# 结果查看

## 生成DaemonSet的fluentbit

$ kubectl get ds -n logging

NAME                               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE

default-logging-simple-fluentbit   2         2         2       2            2           <none>          9h


## 生成StatefulSet的fluentd

$ kubectl get statefulset -n logging

NAME                             READY   AGE

default-logging-simple-fluentd   1/1     9h


## pod信息

$ kubectl get pods -n logging

NAME                                                  READY   STATUS      RESTARTS   AGE

default-logging-simple-fluentbit-n9b25                1/1     Running     1          9h

default-logging-simple-fluentbit-rdzqk                1/1     Running     0          9h

default-logging-simple-fluentd-0                      2/2     Running     0          9h


## fluentbit保密字典配置。会将采集的日志输出到default-logging-simple-fluentd中。

$ kubectl get secret default-logging-simple-fluentbit -n logging -o jsonpath='{.data.fluent-bit\.conf}'|base64 --decode

[SERVICE]

   Flush        1

   Grace        5

   Daemon       Off

   Log_Level    info

   Parsers_File parsers.conf

   Coro_Stack_Size    24576

   storage.path  /buffers


[INPUT]

   Name         tail

   DB  /tail-db/tail-containers-state.db

   Mem_Buf_Limit  5MB

   Parser  docker

   Path  /var/log/containers/*.log

   Refresh_Interval  5

   Skip_Long_Lines  On

   Tag  kubernetes.*

[FILTER]

   Name        kubernetes

   Buffer_Size  0

   Kube_CA_File  /var/run/secrets/kubernetes.io/serviceaccount/ca.crt

   Kube_Tag_Prefix  kubernetes.var.log.containers

   Kube_Token_File  /var/run/secrets/kubernetes.io/serviceaccount/token

   Kube_URL  https://kubernetes.default.svc:443

   Match  kubernetes.*

   Merge_Log  On

   Use_Kubelet  Off


[OUTPUT]

   Name          forward

   Match         *

   Host          default-logging-simple-fluentd.logging.svc.cluster.local

   Port          24240


   Retry_Limit  False

  • 配置output、flow CRD

$ kubectl -n logging apply -f - <<"EOF"

apiVersion: logging.banzaicloud.io/v1beta1

kind: Output

metadata:

name: kafka-output

spec:

kafka:

  brokers: kafka-headless.kafka.svc.cluster.local:29092

  default_topic: topic

  format:

    type: json

  buffer:

    tags: topic

    timekey: 1m

    timekey_wait: 30s

    timekey_use_utc: true

EOF


$ kubectl -n logging apply -f - <<"EOF"

apiVersion: logging.banzaicloud.io/v1beta1

kind: Flow

metadata:

 name: kafka-flow

spec:

 filters:

   - tag_normaliser: {}

   - parser:

       remove_key_name_field: true

       reserve_data: true

       parse:

         type: nginx

 match:

   - select:

       labels:

         app.kubernetes.io/name: log-generator

 localOutputRefs:

   - kafka-output

EOF


// 进入fluentd容器,查看配置文件。说明已经完整转发到kafka的配置。

$ cat fluentd/app-config/fluentd.conf

<source>

 @type forward

 @id main_forward

 bind 0.0.0.0

 port 24240

</source>

<label @bd16f9a1a7328cf1691828de4bc6fc89>

 <match kubernetes.**>

   @type tag_normaliser

   @id flow:logging:kafka-flow:0

   format ${namespace_name}.${pod_name}.${container_name}

 </match>

 <filter **>

   @type parser

   @id flow:logging:kafka-flow:1

   key_name log

   remove_key_name_field true

   reserve_data true

   <parse>

     @type nginx

   </parse>

 </filter>

 <match **>

   @type kafka2

   @id flow:logging:kafka-flow:output:logging:kafka-output

   brokers .....

   default_topic logging-operator-test

   sasl_over_ssl false

   <buffer topic>

     @type file

     chunk_limit_size 8MB

     path /buffers/flow:logging:kafka-flow:output:logging:kafka-output.*.buffer

     retry_forever true

     timekey 1m

     timekey_use_utc true

     timekey_wait 30s

   </buffer>

   <format>

     @type json

   </format>

 </match>

</label>

...

  • 部署demo

kubectl -n logging apply -f - <<"EOF"

apiVersion: apps/v1

kind: Deployment

metadata:

name: log-generator

spec:

selector:

  matchLabels:

    app.kubernetes.io/name: log-generator

replicas: 1

template:

  metadata:

    labels:

      app.kubernetes.io/name: log-generator

  spec:

    containers:

    - name: nginx

      image: banzaicloud/log-generator:0.3.2

EOF

  • 结果验证

参考资料

Logging Operator官方文档

漫谈三种k8s日志架构以及开源选择

Logging Operator - 优雅的云原生日志管理方案

Rancher 2.6 全新 Logging 快速入门


关于iLogtail

iLogtail作为阿里云SLS提供的可观测数据采集器,可以运行在服务器、容器、K8s、嵌入式等多种环境,支持采集数百种可观测数据(日志、监控、Trace、事件等),已经有千万级的安装量。目前,iLogtail已正式开源,欢迎使用及参与共建。

GitHub:https://github.com/alibaba/ilogtail

社区版文档:https://ilogtail.gitbook.io/ilogtail-docs/about/readme

企业版官网:https://help.aliyun.com/document_detail/65018.html

钉钉群:iLogtail社区

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
4月前
|
监控 Kubernetes Go
日志采集效能跃迁:iLogtail 到 LoongCollector 的全面升级
LoongCollector 在日志场景中实现了全面的重磅升级,从功能、性能、稳定性等各个方面均进行了深度优化和提升,本文我们将对 LoongCollector 的升级进行详细介绍。
392 86
|
2月前
|
数据采集 存储 大数据
大数据之路:阿里巴巴大数据实践——日志采集与数据同步
本资料全面介绍大数据处理技术架构,涵盖数据采集、同步、计算与服务全流程。内容包括Web/App端日志采集方案、数据同步工具DataX与TimeTunnel、离线与实时数仓架构、OneData方法论及元数据管理等核心内容,适用于构建企业级数据平台体系。
|
存储 运维 开发工具
警惕日志采集失败的 6 大经典雷区:从本地管理反模式到 LoongCollector 标准实践
本文探讨了日志管理中的常见反模式及其潜在问题,强调科学的日志管理策略对系统可观测性的重要性。文中分析了6种反模式:copy truncate轮转导致的日志丢失或重复、NAS/OSS存储引发的采集不一致、多进程写入造成的日志混乱、创建文件空洞释放空间的风险、频繁覆盖写带来的数据完整性问题,以及使用vim编辑日志文件导致的重复采集。针对这些问题,文章提供了最佳实践建议,如使用create模式轮转日志、本地磁盘存储、单线程追加写入等方法,以降低日志采集风险,提升系统可靠性。最后总结指出,遵循这些实践可显著提高故障排查效率和系统性能。
533 20
|
3月前
|
存储 运维 开发工具
警惕日志采集失败的 6 大经典雷区:从本地管理反模式到 LoongCollector 标准实践
本文总结了日志管理中的六大反模式及优化建议,涵盖日志轮转、存储选择、并发写入等常见问题,帮助提升日志采集的完整性与系统可观测性,适用于运维及开发人员优化日志管理策略。
|
4月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
本文介绍了阿里集团A+流量分析平台的日志查询优化方案,针对万亿级日志数据的写入与查询挑战,提出基于Flink、Paimon和StarRocks的技术架构。通过Paimon存储日志数据,结合StarRocks高效计算能力,实现秒级查询性能。具体包括分桶表设计、数据缓存优化及文件大小控制等措施,解决高并发、大数据量下的查询效率问题。最终,日志查询耗时从分钟级降至秒级,显著提升业务响应速度,并为未来更低存储成本、更高性能及更多业务场景覆盖奠定基础。
|
2月前
|
JSON 安全 网络安全
LoongCollector 安全日志接入实践:企业级防火墙场景的日志标准化采集
LoonCollector 是一款轻量级日志采集工具,支持多源安全日志的标准化接入,兼容 Syslog、JSON、CSV 等格式,适用于长亭 WAF、FortiGate、Palo Alto 等主流安全设备。通过灵活配置解析规则,LoonCollector 可将原始日志转换为结构化数据,写入阿里云 SLS 日志库,便于后续查询分析、威胁检测与合规审计,有效降低数据孤岛问题,提升企业安全运营效率。
|
5月前
|
监控 算法 测试技术
突破极限: 高负载场景下的单机300M多行正则日志采集不是梦
在当今数字化时代,日志数据已成为企业 IT 运营和业务分析的关键资源。然而,随着业务规模的扩大和系统复杂度的提升,日志数据的体量呈现爆发式增长,给日志采集和处理系统带来了巨大挑战。
460 99
|
4月前
|
消息中间件 存储 JSON
日志采集 Agent 性能大比拼——LoongCollector 性能深度测评
为了展现 LoongCollector 的卓越性能,本文通过纵向(LoongCollector 与 iLogtail 产品升级对比)和横向(LoongCollector 与其他开源日志采集 Agent 对比)两方面对比,深度测评不同采集 Agent 在常见的日志采集场景下的性能。
530 33
|
2月前
|
存储
WGLOG日志管理系统可以采集网络设备的日志吗
WGLOG日志审计系统提供开放接口,支持外部获取日志内容后发送至该接口,实现日志的存储与分析。详情请访问:https://www.wgstart.com/wglog/docs9.html
|
5月前
|
人工智能 运维 监控
阿里云携手神州灵云打造云内网络性能监测标杆 斩获中国信通院高质量数字化转型十大案例——金保信“云内网络可观测”方案树立云原生运维新范式
2025年,金保信社保卡有限公司联合阿里云与神州灵云申报的《云内网络性能可观测解决方案》入选高质量数字化转型典型案例。该方案基于阿里云飞天企业版,融合云原生引流技术和流量“染色”专利,解决云内运维难题,实现主动预警和精准观测,将故障排查时间从数小时缩短至15分钟,助力企业降本增效,形成可跨行业复制的数字化转型方法论。
216 6

相关产品

  • 日志服务