使用 Logging Operator 4.0 版本增强 Kubernetes 日志记录

距离我们上次撰写有关 Logging 运算符的文章已经有一段时间了。在幕后,我们一直在开发出色的新功能,以使 Kubernetes 日志记录尽可能方便和轻松。在其新功能中,有一项功能脱颖而出,因为它为 Logging 运算符带来了全新的功能:可以使用syslog-ng作为 Logging 操作员的中央处理元素。

伐木操作员

为什么要为 Kubernetes 日志添加另一个工具?

Kubernetes 日志记录已经有很多工具了,所以你可能会想:为什么还要再加一个?Logging Operator 的最初计划始终是成为 Kubernetes 日志记录的独立于收集器的解决方案。虽然许多人将自己锁定在 Kubernetes 仪表板中,但有时你需要更强大的解决方案。

我们选择 Fluent Bit 和 Fluentd 作为我们的首选方案,因为当时这些是使用最广泛的工具,而且团队对它们有丰富的经验。我们很高兴看到 Logging 操作员蓬勃发展并吸引越来越多的用户。当然,这带来了新的挑战,我们需要重新评估操作员的工作方式。

我们从一位 Logging 操作员用户那里得到了一个有趣的案例。他们拥有相对较大的集群,其应用程序设置需要大约 100-150 个流来处理不同类型的应用程序。我们最初为 Fluentd 实施的路由有其局限性:

它是一个单线程 Ruby 插件。
由于功能的性质,您无法进行批处理:您需要根据每个事件做出决策。
因此,对于每个传入消息,都会多次评估日志流的计算密集型正则表达式匹配过滤器。
我们与该客户密切合作,优化了他们的配置,并成功将日志处理的性能提高了三倍,但很明显,大型集群会产生大量日志消息。我们围绕 Fluentd 进行的优化无法跟上大规模生产流量。我们必须跳出 Logging Operator 的思维框架,添加一个可以大规模路由和处理日志流量的新工具。

为什么选择 syslog-ng?

目前有大量不同的工具可用于构建 Kubernetes 日志,因此我们收集了对新工具的期望要求列表:

占用空间小:边缘资源可能非常有限。我们不想对端点的性能产生重大影响。
广泛的配置选项:Logging Operator 使用简化的配置层来解决复杂问题。这意味着可以将简单的规则编译成几个相关的小配置单元。要实现这一点,底层语言必须提供很大的自由度。
热重载:在运行时重新加载配置似乎微不足道,但在配置频繁更改的大型集群中,热重载可以为您节省大量开销。您需要从磁盘持久化/恢复数据。
插件:将所有内容嵌入到一个工具中几乎是不可能的。使用插件可以让我们轻松扩展功能,而无需重新编译或重建整个工具集。我们甚至可以排除不必要的组件。
反应迅速且乐于助人的开发人员:充满活力的开发人员社区是我们在第三方组件中寻找的关键价值之一。快速修复和最新的安全补丁对于保持堆栈健康至关重要。
开源:毋庸置疑,在嵌入 Kubernetes 仪表板或软件堆栈时,开源软件具有许多好处。
Syslog-ng 是一款成熟的开源日志管理工具,已被大型企业使用超过二十年,具有广泛的功能和出色的性能。它得到了积极的维护和开发,拥有庞大的全球用户群,并且几乎可以应用于从电子阅读器到汽车和飞机的所有设备。

我们与 syslog-ng 开发人员密切合作,并决定携手合作。扩展 syslog-ng 功能以在 Kubernetes 上顺利运行的范围比评估全新工具和彻底测试基本功能的范围要小得多。我们并不是说其他​​工具,例如向量,震颤,或OpenTelemetry Collector无法完成这项工作,但我们信任 syslog-ng。

但是,syslog-ng 不支持开箱即用的云原生 Kubernetes 用例,如果其配置频繁更改,则会出现一些奇怪的行为。此外,其配置格式需要一些时间来适应。为了克服这些问题,我们采取了以下措施:

为 Logging 操作器添加了特定于 syslog-ng 的新自定义资源。这样,您可以使用熟悉的 YAML 格式的 Logging 操作器对象配置 医师数据库 这些操作器会自动从这些 CR 生成 syslog-ng 配置。
与 syslog-ng 开发人员和社区合作,为 syslog-ng 添加 Kubernetes 支持。
提交并修复在 Kubernetes 中运行 syslog-ng 时出现的错误和问题,并改进其 JSON 支持。

特殊数据

结果

我们与客户合作,并在他们的环境中测试了 Logging Operator 中的 syslog-ng 支持,以确保它满足他们的要求。目前,他们已经在生产中使用它,而且该解决方案很稳定,并解决了他们的性能问题。

日志操作符架构

Fluentd 和 syslog-ng、支持和功能

Fluentd 在 Logging Operator 中仍然完全受支持,并且 Logging Operator 4.0 与旧版本 3.x 完全兼容。

Logging 操作员可以使用 和为日志转发器来接收、过滤和转换传入的日志,并将它们传输到一个或多个目标输出具有各自的功能 确保突出显示任何一个 并且它们支持自己的目标输出(当然,有重叠)。目前,Logging 操作员中只有有限数量的 syslog-ng 输出可用,但我们正在积极扩展列表。但是,如果您要将日志发送到 Sumo Logic 或通用 HTTP 输出,您可能需要尝试 syslog-ng。

高级路由示例

使用 syslog-ng 进行路由比使用 Fluentd 灵活得多。您可以将字符串或正则表达式与消息的任何部分匹配,例如,从容器路由精确类型的消息。例如,仅匹配 Nginx 访问日志中的 4XX 代码。

我们计划在未来从 Logging Operator 中提供更多 syslog-ng 功能,并基于 syslog-ng 为 Logging Operator 添加新功能。有关详细信息,请参阅记录操作员文档并输出快速入门指南。

Logging Operator 4.0 中的其他变化

自 3.0.0 以来的所有更改列表会让人不知 bw列表 所措:我们差不多三年前发布了 3.0.0,即使是上一个次要版本 (3.17.0) 也已经一年多了。因此,为了简短易懂,让我们看看自上一个补丁版本 (3.17.10) 以来的显著更改和错误修复:

改进了 Fluentd concat 支持,以处理 Flow 和 ClusterFlow 清单中的拆分 containerd/cri 日志
您现在可以启用“Loki 输出中的include_thread_label ”选项
你可以在 OpenShift 中部署 SCC以在特权模式下运行 Fluent Bit
您现在可以为 Fluent Bit 元数据设置 TTL,以避免不必要的重启
日志操作员现在使用最新的 prometheus-operator(版本 0.62.0)
在缓存的 RESTMapper 构造函数中正确处理刷新错误

伐木者搬迁到新地方

如果您正在关注 Logging 运算符项目,您可能已经注意到一些重大变化。原因是 Logging 运算符背后的团队希望在该项目上投入更多时间。因此,Logging 运算符有了自己的组织,前团队(现为Axoflow)和思科将共同努力,确保项目取得成功。

变化的内容:

该项目存储库现已在单独的构建 Kubernetes 日志并不复杂。Logging Operator 4.0 可确保您在不增加日志复杂性的情况下完成更多工作。但如果您想详细了解它是如何改变事物的,您可以查看 Cisco Outshift 上Logging Operator 之前出现过的位置。

贡献者致谢

我们要感谢 syslog-ng 开发人员付出的时间和帮助,使 syslog-ng 为 Kubernetes 世界做好准备。(例如,使syslog-ng 的 ARM 版本可用。)

当然,除了更大的功能之外,各种 Logging 操作符插件和输出中还有许多更小的添加和微调,我们想向所有积极支持该项目的贡献者表示最诚挚和最诚挚的感谢。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注