桥接云端和本地日志处理

现代云原生架构需要强大、可扩展和安全的日志处理解决方案来监控分布式应用程序。本研究提出了一种混合解决方案,使用Azure Kubernetes服务(AKS)进行日志生成,使用Fluent Bit进行日志收集,使用Azure EventHub进行中间聚合,并在本地部署在Apache CloudStack集群上的Splunk进行全面的日志索引和可视化。

我们详细介绍了该系统的设计、实施和评估,展示了这种架构如何支持可靠和可扩展的云原生工作负载日志处理,同时保留对本地数据的控制。

介绍

集中式日志解决方案已成为不可或缺。现代应用程序,特别是构建在微服务架构上的应用程序,生成大量日志,通常以多种格式和多个来源。这些日志是监控应用程序性能、诊断问题和确保系统整体可靠性的关键来源。然而,管理如此庞大的日志数据量带来了重大挑战,特别是在跨越本地和基于云的基础设施的混合云环境中。

传统的日志解决方案在单体应用程序方面表现有效,但在微服务架构的要求下很难扩展。微服务的动态特性表现为独立部署和频繁更新,产生了不断变化格式和结构的日志流。这些日志必须实时摄取、处理和分析,以提供可操作的见解。此外,随着应用程序越来越多地跨越混合环境运行,确保安全性和个人身份信息数据变得至关重要,考虑到各种合规性和监管要求。

本文介绍了一种综合解决方案,通过充分利用AzureApache CloudStack资源的综合能力来解决这些挑战。通过将Azure的可伸缩性和分析能力与CloudStack的本地基础设施的灵活性和成本效益相结合,该解决方案提供了一种强大的、统一的集中日志记录方法。

文献综述

微服务中的集中日志收集面临网络延迟、多样化数据格式以及跨多个层次的安全性等挑战。虽然像Fluent Bit和FluentD这样的轻量级代理广泛使用,但高效的日志传输仍然是一个挑战。

ELK堆栈和Azure Monitor等解决方案提供了集中式日志处理,但通常涉及仅云端或仅本地部署,从而限制了混合部署的灵活性。混合云解决方案允许组织利用云端的可扩展性,同时保留对本地环境中敏感数据的控制。特别是使用事件流技术的混合日志处理管道,解决了可扩展的日志传输和聚合需求。

系统架构

下图所示的架构集成了Azure EventHub和AKS与本地的Apache CloudStack和Splunk。每个组件都经过优化,以实现跨环境的高效日志处理和安全数据传输。

 

组件描述

  • AKS:托管容器化应用程序,并通过Kubernetes的日志聚合层生成可访问的日志。
  • Fluent Bit:部署为DaemonSet,从AKS节点收集日志。每个Fluent Bit实例从/var/log/containers捕获日志,对其进行过滤,并以JSON格式转发到EventHub。
  • Azure EventHub:充当高吞吐量消息代理,聚合来自Fluent Bit的日志,并临时存储,直到被Splunk重型转发器拉取。
  • Apache Kafka:充当Fluent Bit和Splunk之间可靠的桥梁。Fluent Bit使用其Kafka输出插件将日志转发到Kafka,在那里日志被临时存储和处理。然后,Splunk使用连接器(如Kafka Connect Splunk Sink或自定义脚本)从Kafka消费日志,确保可扩展和解耦的架构。
  • Splunk Heavy Forwarder (HF):安装在Apache CloudStack中,Heavy Forwarder使用从Azure EventHub检索日志。这个附加组件提供了无缝集成,使得Heavy Forwarder能够安全连接到EventHub,近乎实时地检索日志,并在转发到Splunk的索引器进行存储和处理之前根据需要对其进行转换。
  • 在Apache CloudStack上的Splunk:提供日志索引、搜索、可视化和警报。

数据流

  1. 在AKS中的日志收集:Fluent Bit监视/var/log/containers中的日志文件,过滤掉不必要的日志,并为每个日志附加元数据(例如容器名称、命名空间)。
  2. 转发到EventHub:使用Fluent Bit的azure_eventhub输出插件通过HTTPS将日志发送到EventHub,确保安全的数据传输。
  3. Apache Kafka:AKS的日志通过作为DaemonSet运行的Fluent Bit收集,Fluent Bit解析并通过其Kafka输出插件将日志转发到Apache Kafka。Kafka充当高吞吐量缓冲区,存储和分区日志以实现可伸缩性。Splunk使用连接器或脚本从Kafka摄取这些日志,实现索引、分析和实时监控。
  4. 使用Splunk Heavy Forwarder拉取日志:Apache CloudStack中的Heavy Forwarder使用EventHubs SDK连接到EventHub并拉取日志,将其转发到本地Splunk索引器进行存储和处理。
  5. 在Splunk中进行存储和分析:日志在Splunk中进行索引,实现实时搜索、仪表盘可视化以及基于日志模式的警报。

方法论

AKS中的Fluent Bit DaemonSet部署

Fluent Bit的配置存储在ConfigMap中,并部署为DaemonSet。以下是Fluent Bit DaemonSet的扩展配置:

Lua

 

Name:         fluentbit-cm
Namespace:    fluentbit
Labels:       k8s-app=fluentbit
Annotations:  
Data
crio-logtag.lua:
local reassemble_state = {}
function reassemble_cri_logs(tag, timestamp, record)
  -- 验证传入记录
  if not record or not record.logtag or not record.log or type(record.log) == 'table' then
    return 0, timestamp, record
  end
  -- 根据流和标签生成唯一键以进行重组
  local reassemble_key = (record.stream or "unknown_stream") .. "::" .. tag
  -- 处理日志片段(logtag == 'P')
  if record.logtag == 'P' then
    -- 将片段存储在重组状态中
    reassemble_state[reassemble_key] = (reassemble_state[reassemble_key] or "") .. record.log
    return -1, 0, 0 -- Do not forward this fragment
  end
  -- 处理分段日志的结尾
  if reassemble_state[reassemble_key] then
    -- 将存储的片段与当前日志组合
    record.log = (reassemble_state[reassemble_key] or "") .. (record.log or "")
    -- 清除此键的存储状态
    reassemble_state[reassemble_key] = nil
    return 1, timestamp, record -- Forward the reassembled log
  end
  -- 如果不需要重新组装,则按原样转发日志
  return 0, timestamp, record
end
INCLUDE filter-kubernetes.conf
filter-kubernetes.conf:
[FILTER]
    Name kubernetes
    Match test.app.splunk.*
    Kube_URL https://kubernetes.default.svc:443
    Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
    Kube_Tag_Prefix test.app.splunk.var.log.containers
    Merge_Log On
    Merge_Log_Key log_processed
    K8S-Logging.Parser On
    K8S-Logging.Exclude On
    Labels Off
    Annotations Off
    Keep_Log Off
 
fluentbit.conf:
[SERVICE]
    Flush         1
    Log_Level     info
    Daemon        on
    Parsers_File  parsers.conf
    HTTP_Server   On
    HTTP_Listen   0.0.0.0
    HTTP_Port     2020
    Health_Check On 
    HC_Errors_Count 1
    HC_Retry_Failure_Count 1 
    HC_Period 5    

INCLUDE input-kubernetes.conf
INCLUDE output-kafka.conf

input-kubernetes.conf:
[INPUT]
    Name           tail
    Tag              test.app.splunk*
    Alias            test.app.splunk-input
    Path              /var/log/containers/*test.app.splunk.log
    Parser            cri
    DB                /var/log/flb_kube.db
    Buffer_Chunk_Size 256K
    Buffer_Max_Size   24MB
    Mem_Buf_Limit     1GB
    Skip_Long_Lines   On
    Refresh_Interval  5

output-kafka.conf:
[OUTPUT]
    Name           kafka
    Alias             test.app.splunk-output
    Match             test.app.splunk.*
    Brokers            prod-region-logs-premium.servicebus.windows.net:9094
    Topics            test.app.splunk
    Retry_Limit       5
    rdkafka.security.protocol SASL_SSL
    rdkafka.sasl.mechanism    PLAIN
    rdkafka.sasl.username     $ConnectionString
    rdkafka.sasl.password      Endpoint=sb://prod-region-logs-premium.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=***********************************************=
[OUTPUT]

parsers.conf:
[PARSER]
    Name         cri
    Format       regex
    Regex        ^(?

  • [输入]部分指定从/var/log/containers目录收集日志。
  • [过滤器]部分使用Kubernetes元数据丰富日志。
  • [输出]部分配置Fluent Bit以JSON格式将日志转发到EventHub。

Azure EventHub配置

EventHub需要命名空间、特定的EventHub实例,并通过共享访问策略进行访问控制。

  • 命名空间和EventHub设置:在Azure中创建命名空间和EventHub实例,设置发送策略,并检索连接字符串。
  • 用于高吞吐量的配置:EventHub配置具有较高的分区计数,以支持可伸缩性、缓冲和从Fluent Bit并发数据流。

Apache CloudStack中Splunk重型转发器配置

Splunk重型转发器从EventHub检索日志并将其转发到Splunk的索引器。

  • Microsoft云服务的附加组件:安装附加组件以启用EventHub连接。在inputs.conf中配置输入:
Lua

 

[azure_eventhub://eventhub_name]
index = <index_name>
eventhub_namespace = <namespace>
shared_access_key_name = <access_key_name>
shared_access_key = <access_key>
batch_size = 500
interval = 30
sourcetype = _json
disabled = 0

  • 批处理:将batch_size设置为500,将间隔设置为30秒,以优化数据摄取并减少网络调用的频率。

Splunk索引和可视化

  • 数据丰富:在Splunk中使用字段提取对日志进行附加元数据丰富。
  • 搜索和仪表板:SPL查询实现实时搜索,自定义仪表板可可视化日志模式。
  • 警报:配置警报以触发特定日志模式,如高错误率或特定容器重复警告。

性能和可伸缩性

测试显示系统可以处理高吞吐量的日志摄取,EventHub的缓冲功能可在网络中断期间防止数据丢失。AKS节点上的Fluent Bit资源使用保持最低水平,Splunk的索引器通过适当的索引和过滤配置有效处理日志量。

安全

AKS和EventHub之间使用HTTPS进行通信安全,Splunk HF使用安全密钥与EventHub进行身份验证。管道中的每个组件都实现重试机制以保持数据完整性。

资源利用

  • Fluent Bit在AKS节点上平均使用100-150 MiB内存和0.2-0.3 CPU。
  • 根据分区和吞吐量配置,EventHub的资源使用会动态调整。
  • Splunk HF的负载通过批处理进行平衡,优化数据传输,避免过载Apache CloudStack资源。

可靠性和容错性

该解决方案使用EventHub的缓冲功能,确保在下游故障情况下保留日志。EventHub还支持重试策略,进一步增强数据完整性和可靠性。

讨论

混合云架构的优势

这种架构通过将Azure服务与本地控制相结合,提供了灵活性、可扩展性和安全性。它还利用基于云的流媒体和缓冲能力,而不会损害数据主权。

局限性

虽然EventHub提供可靠的数据聚合,但随着吞吐量单位的增加,成本也会增加,因此优化日志转发配置至关重要。此外,云与本地环境之间的数据传输可能导致潜在的延迟。

未来应用

这种架构可以通过集成机器学习来进行日志异常检测,或者添加对多个云提供商的支持,以进一步扩展日志处理和多云弹性。

结论

这项研究展示了利用云和本地资源构建混合日志处理管道的有效性。通过集成Azure Kubernetes Service(AKS)、Azure EventHub和Splunk on Apache CloudStack,我们为集中式日志管理和分析创建了一个可扩展和具有弹性的解决方案。该架构解决了分布式日志记录中的关键挑战,包括高数据吞吐量、安全性和容错性。

在AKS中使用Fluent Bit作为轻量级日志收集器可确保以最小的资源开销进行高效数据收集。Azure EventHub的缓冲能力可实现可靠的日志聚合和临时存储,使其非常适合处理可变的日志流量,并在连接问题发生时保持数据完整性。Splunk Heavy Forwarder和Apache CloudStack中的Splunk部署使组织能够保留对日志存储和分析的控制,同时受益于云资源的可扩展性和灵活性。

这种方法为需要混合云设置的组织提供了明显优势,例如增强对数据的控制、符合数据驻留要求以及根据需求扩展的灵活性。未来的工作可以探讨整合机器学习以增强日志分析、自动异常检测,并扩展到多云设置以增强弹性和多样性。这项研究提供了一个适应现代企业环境中不断演变需求的基础架构。

参考资料 

Azure Event Hubs和Kafka

混合监控和日志记录

  • 混合云和多云监控模式
  • 混合云监控策略

Splunk集成

  • 将Azure事件中心传送到Splunk
  • 将Azure数据导入Splunk平台

AKS部署

Source:
https://dzone.com/articles/bridging-cloud-and-on-premises-log-processing