写点什么

采集 Kubernetes 容器日志最佳实践

作者:观测云
  • 2024-04-26
    上海
  • 本文字数:3515 字

    阅读完需:约 12 分钟

采集 Kubernetes 容器日志最佳实践

前言

指标、日志、链路是可观测的三大支柱,日志主要用于记录代码执行的痕迹,方便定位和排查问题。当前主流的应用都是以容器的方式运行在 Kubernetes 集群,由于容器的动态性,容器可能会频繁地创建和销毁。日志的采集和持久化变得尤为重要,以确保在容器生命周期结束后,仍然能够访问到运行时的信息。以下内容介绍如何利用观测云采集 Kubernetes 容器日志,并对采集的日志进行解析、查询、可视化分析和备份的整个流程。

接入方案

部署 DataKit 采集器

采集 Kubernetes 容器日志需要先部署 DataKit。


登录观测云控制台,点击「集成」 -「DataKit」 - 「Kubernetes」,下载 datakit.yaml ,拷贝第 3 步中的 token 。



编辑 datakit.yaml ,把 token 粘贴到 ENV_DATAWAY 环境变量值中“token=”后面,设置环境变量 ENV_CLUSTER_NAME_K8S 的值并增加环境变量 ENV_NAMESPACE,这两个环境变量的值一般和集群名称对应,一个工作空间集群名称要唯一。


        - name: ENV_NAMESPACE          value: k8s-prod
复制代码



把 datakit.yaml 上传到可以连接到 Kubernetes 集群的主机上,执行如下命令。


kubectl apply -f datakit.yamlkubectl get pod -n datakit
复制代码


当看到状态是 “Running”后表示部署 DataKit 成功。


控制台日志采集

DataKit 默认采集了所有容器输出到控制台的日志(stdout/stderr),这些日志的特点是通过 kubectl logs 可以查看到。登录观测云控制台,点击「日志」 -「查看器」 ,可以看到已经采集到的日志,其中数据源默认展示的是容器的名称,接下来的采集中,会使用自定义数据来源。



DataKit 也提供了自监控功能,实时查看采集情况。DataKit 默认部署在 datakit namespace 下面,执行 kubectl exec 命令进入 DataKit 容器。


kubectl exec -it datakit-6rjjp -n datakit bash
复制代码


再执行 datakit monitor,右下方的 logging/ 开头的行即是采集容器日志的实时监控数据。



默认的采集方式不是太灵活,这里推荐一种最佳的采集方式,把默认采集所有输出到控制台的日志关掉,通过染色的方式,在需要采集日志的 Deployment 部署文件中增加 annotation 方式指定是否需要采集、更改数据源名称以及为日志打 tags。


在 datakit.yaml 中增加下面的环境变量,即不采集任何控制台日志。


        - name: ENV_INPUT_CONTAINER_CONTAINER_EXCLUDE_LOG          value: image:*
复制代码



然后在应用的 Deployment yaml 文件中添加 annotation。


      annotations:        datakit/logs: |          [            {             "disable" : false,             "source": "log_stdout_demo",             "tags": {               "region": "hangzhou"               }            }          ]
复制代码



字段说明:


  • disable 是否禁用该容器的日志采集,默认是 false。

  • source 日志来源,非必填项。

  • tags key/value 键值对,添加额外的 tags,非必填项。


登录观测云控制台,点击「日志」 -「查看器」 ,可以看到已经采集到的日志。


容器内日志文件采集

对于容器内日志文件的采集,也是通过添加 annotations 的方式来实现采集的。


      annotations:        datakit/logs: |          [            {             "disable": false,             "type": "file",             "path":"/data/app/logs/log.log",             "source": "log_file_demo",             "tags": {               "region": "beijing"               }            }          ]
复制代码



字段说明:


  • disable 是否禁用该容器的日志采集,默认是 false。

  • type 默认为空是采集 stdout/stderr,采集文件必须写 file。

  • path 配置文件路径。如果是采集容器内文件,必须填写 volume 的 path,注意不是容器内的文件路径,是容器外能访问到的路径。

  • source 日志来源,非必填项。

  • tags key/value 键值对,添加额外的 tags,非必填项。


注意:需要把日志路径目录挂载到 emptyDir,这里挂的是 /data/app/logs。


        volumeMounts:        - mountPath: /data/app/logs          name: varlog      ......      volumes:      - name: varlog        emptyDir: {}         
复制代码


日志路径支持 glob 规则 进行批量指定,比如日志文件是 /tmp/opt/**/*.log ,挂载的目录必须高于通配的目录,比如挂载 /tmp 或 /tmp/opt。


登录观测云控制台,点击「日志」 -「查看器」 ,可以看到已经采集到的日志,当然也可以使用自定义的 tags 进行检索。


日志解析

为了通过日志中特定内容进行快捷筛选、关联分析,就需要使用 Pipeline 对日志进行结构化处理,比如提取 trace_id、日志状态等。


下面是一条业务日志和对应的 Pipeline。


2024-04-11 11:10:17.921 [http-nio-9201-exec-9] INFO  c.r.s.c.SysRoleController - [list,48] - ry-system-dd 2350624413051873476 1032190468283316 - 查询角色列表开始
复制代码


grok(_, "%{TIMESTAMP_ISO8601:time} %{NOTSPACE:thread_name} %{LOGLEVEL:status}%{SPACE}%{NOTSPACE:class_name} - \\[%{NOTSPACE:method_name},%{NUMBER:line}\\] - %{DATA:service} %{DATA:trace_id} %{DATA:span_id} - %{GREEDYDATA:msg}")default_time(time, "Asia/Shanghai")
复制代码




成功解析出 trace_id、span_id、service 等标签,方便后续的快捷筛选、关联分析。

日志查询

观测云支持通过多种操作对日志数据进行查询和分析

文本搜索

日志查看器支持关键词查询、通配符查询,* 表示匹配 0 或多个任意字符,? 表示匹配 1 个任意字符;若要将多个术语组合到一个复杂查询中,可以使用布尔运算符(AND/OR/NOT)连接。


术语可以是单词或者短语。比如:


  • 单个单词:guance;

  • 多个单词:guance test;(等同于 guance AND test)

  • 短语:"guance test"; (使用双引号可以将一组单词转换为短语)


搜索查询示例:


JSON 搜索

查看器原生支持对 JSON 格式 message 内容进行精确检索,搜索格式为: @key:value ,若为多层级 JSON 可用 “.” 承接,即 @key1.key2:value ,如图所示:


日志可视化分析

场景图表

观测云内置多种数据监控视图模版,用户可导入模板创建仪表板和查看器,并进行自定义编辑配置;或选择自定义创建方式,通过一系列设置构建数据洞察场景。比如,根据前面解析出来的 status 字段,统计一下 info、error 状态的日志分别有多少,可以通过以下步骤来创建可视化仪表板。


第一步:在场景->新建空白仪表板中,选择自己想要的视图类型。



第二步:选择日志数据源,设置过滤条件和分组,点击创建。


强大的关联能力

1、视图配置跳转链接

观测云提供链接功能,可以平滑跳转仪表板 & 查看器,实现数据联动分析、系统全面可观测。




  • 再点击视图中的数据,即可跳转到对应的日志查看器,快速实现视图与查看器联动分析。



2、绑定内置视图

观测云还支持将视图保存为内置视图,并绑定到查看器中,方便在查看日志数据的同时,分析其他维度的数据。



查看日志详情时,即可查看上面绑定的内置视图,也可以绑定其他维度的视图,比如主机的指标视图等等。


日志告警

观测云提供开箱即用的监控模板新建监控器;也支持自定义新建监控器,通过阈值检测、日志检测、突变检测、区间检测等十余种检测规则来设置检测规则和触发条件。开启监控器后,即可接收到由检测规则触发的相关异常事件告警。


其中,日志检测用于监控工作空间内基于日志采集器产生的的全部日志数据。支持基于日志的关键字设置告警,及时发现不符合预估行为的异常模式(如:日志文本数据中存在异常的标签),多适用于 IT 监控场景下的代码异常或任务调度检测等。


第一步:在监控->新建日志检测监控器。



第二步:设置检测规则和触发条件。


这里以日志内容包含"WARN"为例,设置超过 100 条时就触发告警。



第三步:编辑事件通知内容告警策略,点击创建即可。


日志备份

观测云提供日志数据转发到观测云的对象存储及转发到外部存储的功能(包含观测云备份日志、AWS S3、华为云 OBS、阿里云 OSS 和 Kafka 消息队列)。用户可以自由选择存储对象,灵活管理日志备份数据。

日志备份

第一步:点击日志->数据转发



第二步:点击转发规则->新建规则



第三步:设置需要备份的数据源,和相关筛选条件,点击确定即可。



注意:该规则下的日志数据最低存储默认为 180 天,可以前往管理 > 设置 > 变更数据存储策略中修改数据转发存储策略。

查看备份数据

第一步:点击日志->数据转发,在下拉框选定规则。



第二步:自定义时间范围查询,可选择多个日期及定义开始时间和结束时间,时间会精确到小时,即可查询到备份数据。



更多日志备份相关操作,也可以阅读官方文档的详细介绍。

总结

通过以上方式,可以快速将部署在 Kubernetes 集群的各个业务系统的日志采集到观测云平台,实现日志采集、日志解析、查询分析、监控告警、归档备份等一整套解决方案。

用户头像

观测云

关注

还未添加个人签名 2021-02-08 加入

云时代的系统可观测平台

评论

发布
暂无评论
采集 Kubernetes 容器日志最佳实践_#Kubernetes#_观测云_InfoQ写作社区