huanggzeK零SK壹S
- 已编辑
用户使用 KubeSphere 平台每天会产生大量的日志。其中,一部分是与业务紧密相关的应用服务日志,另外一部分是平台运维日志。KubeSphere 提供多种灵活的方式对日志进行深度分类、筛检、导出。本文介绍如何在 KubeSphere(版本 2.1.0) 上实践一周业务应用日志收集、导出到本地,并根据日期、项目名分类归档,以满足业务分析的需求。预期实验结果如下:
$ tree /var/log
/var/log
├── 2019-11-24 # 按日期分类
├── 2019-11-25
├── 2019-11-26
│ ├── staging
│ ├── testing_1 # 按项目名分类
│ └── testing_2
│ ├── kube-apiserver-ks-allinone_kube-apiserver.log # 文件名 <pod_name>_<container_name>.log
│ └── kube-controller-manager-ks-allinone_kube-controller-manager.log
└── tmp
├── buffer.b5982621746985534ac4536bcad395daf.log
├── buffer.b5982621746985534ac4536bcad395daf.log.meta
├── buffer.b598262174702bca7ec48db84544e36db.log
└── buffer.b598262174702bca7ec48db84544e36db.log.meta
部署 Fluentd
KubeSphere 日志采集系统是基于 C 语言的 Fluent Bit 方案,目前 KubeSphere 界面上支持将日志转发到 ElasticSearch、Kafka 和 Fluentd 三种日志接受者。使用 Fluentd 作为日志接受者非常适合我们的需求场景。Fluentd 与 Fluent Bit 都是开源的数据收集器,但 Fluentd 项目更早,采用 Ruby 语言,较 Fluent Bit 功能也更完善。本实践中的整体架构如下
现在,我们部署一个 Fluentd 作为日志接受者。首先,需要为一周的日志申领容量足够的持久化卷。如果对每日日志体量没有预估的,可以调用 cat API 查看 pri.store.size (主分片存储大小):
curl elasticsearch-logging-data.kubesphere-logging-system.svc:9200/_cat/indices?v
持久化卷推荐使用 local 类型的 provisioner,参考 buf_file Limitation。
Caution, file buffer implementation depends on the characteristics of local file system. Don’t use file buffer on remote file system, e.g. NFS, GlusterFS, HDFS and etc. We observed major data loss by using remote file system.
然后,创建一个名为 fluentd-conf 的 ConfigMap,键为 fluent.conf(这是 Fluentd 默认的配置文件名),值如下。该配置规则指定了 Fluentd 在 24224 端口接受数据。并只选出 my-workspace 项目下的日志,输出到 path 路径。更多 Fluentd 的配置规则可以参考官方文档。
# input 插件类型为 forward
<source>
@type forward
port 24224
<parse>
@type json
time_format %Y-%m-%dT%H:%M:%S.%NZ
time_type string
</parse>
</source>
# filter 插件可以过滤指定的数据,
# 以下例子选出项目名以 testing_ 或 staging 开头的日志
# (可以根据你的场景调整)
#
# 说明:KubeSphere 的 Fluent Bit 采集器使用了
# Kuberenetes Filter 插件,为每条日志增加 kubernetes 字段
# "kubernetes": {
# "pod_name": <string>
# "namespace_name" <string>
# "container_name" <string>
# }
<filter **>
@type grep
<regexp>
key $.kubernetes.namespace_name
pattern /(^testing_|^staging)/
</regexp>
</filter>
# output 插件类型为 file,数据会保存到文件
# path 定义了文件路径为 /var/log/<年-月-日>/<项目名>/<容器组名>_<容器名>.log
<match **>
@type file
path /var/log/%Y-%m-%d/${$.kubernetes.namespace_name}/${$.kubernetes.pod_name}_${$.kubernetes.container_name}
append true
# 在 tmp 目录缓存 1 天的日志后 flush
<buffer $.kubernetes.namespace_name,$.kubernetes.pod_name,$.kubernetes.container_name,time>
@type file
path /var/log/tmp
timekey 1d
timekey_wait 0
</buffer>
# 输出日志格式,仅输出 log 字段值
# 不额外添加换行符
<format>
@type single_value
message_key log
add_newline false
</format>
</match>
现在我们可以创建 Fluentd Deployment 和 Service。直接选择创建【服务】-【无状态服务】
填写镜像 fluent/fluentd:v1.7.4-1.0,选择【使用默认端口】,确定下一步
挂载第一步创建的存储卷,我们在配置中设置了输出路径为 /var/log,所以这里需要选择【读写】,填充挂载路径为 /var/log
另外,我们还需要挂载前面创建的 ConfigMap,选择【只读】,填充挂载路径为 /fluentd/etc,这是 Fluentd 默认的配置读取文件路径。
全部准备完成后,就可以确认部署了。
在平台设置中开启/关闭 Fluentd
添加日志收集者 Fluentd,服务地址填 <fluentd_svc>.<namespace_name>.svc,端口默认 24224。完成后等待 Fluent Bit 生效,一段时间后,就可以在 /var/log 下看到日志被采集了。
缓存的日志暂时放在 /log/var/tmp 中,每天会 flush 到 %Y-%m-%d 文件夹下。
一周日志收集完成后,即可暂停 Fluentd 日志收集