在 Kubernetes 的生态系统中,日志收集和统计是非常重要的一项功能。Fluentd 是 Kubernetes 中默认启用的日志收集和统计组件,它具有高可靠性、高可扩展性、高度可定制化的特点,这些特点使得 Fluentd 成为 Kubernetes 中最流行的日志采集工具之一。
Fluentd 架构介绍
Fluentd 的架构由三部分组成:输入插件(input plugins)、输出插件(output plugins)和过滤器(filter plugins)。
输入插件用于从各种数据源中接收数据,例如:文件、标准输入、HTTP 请求、数据库等。输出插件用于把数据传递到最终的目的地,例如:文件、标准输出、HTTP 请求、数据库等。过滤器则用于转换数据,例如:添加、删除、重命名字段等操作。
Fluentd 在 Kubernetes 中的应用
在 Kubernetes 中,Fluentd 通常运行在每个工作负载(Pod)的容器中,用于采集工作负载的日志数据,并将日志数据发送到后端日志存储系统。
Fluentd 通过 Kubernetes API 获取工作负载的元数据信息,并利用这些信息对日志数据进行标注(例如工作负载名称、命名空间、标签等),这些标注可以用于后续的日志搜索和过滤。
Fluentd 的配置方式
Fluentd 的配置文件采用 Ruby 语言编写,配置文件通常称为 Fluentd 插件(Fluentd plugin),包括输入插件、输出插件和过滤器。
下面是一个简单的 Fluentd 配置文件示例,用于读取 nginx 日志,并将日志发送到 Elasticsearch:
<source> @type tail path /var/log/nginx/access.log pos_file /var/log/td-agent/nginx-access.log.pos tag nginx.access format nginx </source> <match nginx.access> @type elasticsearch host localhost port 9200 logstash_format true flush_interval 10s index_name fluentd-nginx-access </match>
Fluentd 的进阶应用
处理多行日志
在日志文件中,一条日志可能会被拆分成多行,在采集日志时,需要组合多行日志以形成完整的日志。
Fluentd 提供 multiline 插件用于解决这个问题。下面是一个配置示例,用于处理多行日志:
<source> @type tail path /var/log/nginx/error.log pos_file /var/log/td-agent/nginx-error.log.pos tag nginx.error <parse> @type multiline format_firstline /^\[[^]]+\d+ \d+:\d+:\d+/ format1 /^\[[^]]+\d+ \d+:\d+:\d+/ </parse> </source> <match nginx.error> @type elasticsearch host localhost port 9200 logstash_format true flush_interval 10s index_name fluentd-nginx-error </match>
在多行日志的第一行中,我们使用正则表达式 format_firstline /^\[[^]]+\d+ \d+:\d+:\d+/'
匹配日志头,表示一条新日志的开始。在下面的 format1 /^\[[^]]+\d+ \d+:\d+:\d+/'
中表示余下的行。
日志采集过滤器
在采集日志时,有时候需要过滤掉一部分日志,或者对日志进行修改,以方便后续的处理。这时候可以使用 Fluentd 的过滤器来过滤或者修改日志数据。
下面是一个配置示例,用于过滤掉 nginx 日志中的特定 URI:
<source> @type tail path /var/log/nginx/access.log pos_file /var/log/td-agent/nginx-access.log.pos tag nginx.access format nginx </source> <filter nginx.access> @type grep regexp1 uri /health invert true </filter> <match nginx.access> @type elasticsearch host localhost port 9200 logstash_format true flush_interval 10s index_name fluentd-nginx-access </match>
在上面的配置中,我们使用 <filter>
标签来指定 filter 插件,对标签名为 nginx.access
的数据进行过滤操作。<filter>
标签中的 @type
标识了过滤器的类型,这里我们使用的是 grep
插件,表示通过-regexp1 来匹配 uri 中是否包含 health 字符串。invert true
表示忽略 uri 中包含 health 字符串的日志。
总结
使用 Fluentd 作为 Kubernetes 中的日志采集和统计组件是非常方便的,它不仅提供了高可靠性、高可扩展性、高度可定制化的特点,还提供了丰富的输入插件、输出插件和过滤器,可以帮助开发者快速实现自定义的日志采集方式。
最后,希望这篇文章对初学者对 Kubernetes 日志采集与处理提供帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a4fd88add4f0e0ffd5ea8f