采集 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_NAMESPACEvalue: k8s-prod

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

kubectl apply -f datakit.yaml
kubectl 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_LOGvalue: 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/logsname: varlog......volumes:- name: varlogemptyDir: {}         

日志路径支持 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 集群的各个业务系统的日志采集到观测云平台,实现日志采集、日志解析、查询分析、监控告警、归档备份等一整套解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用例整体执行及pytest.ini文件

在我们写代码的过程中,一般都是右键或者命令行去执行一个用例 但是当我们写完后,需要整体执行一遍。那应该怎么搞呢? 我们可以在根目录下新建一个main.py或者run.py之类的文件,文件内容如下: if __name__ "__ma…

Android --- SQlite数据存储

使用 SQLite 保存数据 | Android Developers (google.cn) SQLiteOpenHelper 类包含一组用于管理数据库的实用 API。当您使用此类获取对数据库的引用时,系统仅在需要时才执行可能需要长时间运行的数据库创建和更新操作,而不是在应用启动期间执行。您仅…

4-用户权限控制(后端)

在计算机系统中,用户权限控制是一种机制,用于限制用户对系统资源的访问和操作。它可以确保只有经过授权的用户可以执行特定的操作,并限制未经授权的用户的访问权限。 用户权限控制通常涉及以下几个方面: 用户认证:用户…

JAVA实现easyExcel批量导入

注解类型描述ExcelProperty导入指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。…

嵌入式前后台(Bare-Metal RTOS-Like)架构详解

前后台(Bare-Metal RTOS-Like)架构 在嵌入式系统开发中,针对资源有限的STM32微控制器,前后台(Bare-Metal RTOS-Like)架构是一种轻量级的实时性设计方法,它模拟了实时操作系统(RTOS&…

个人电脑本地部署LLM

普通电脑配置即可本地运行大模型,本地部署LLM最简单的方法 OLLAMA Ollama是一个开源框架,专门设计用于在本地运行大型语言模型(LLM)。它的主要功能是在Docker容器中部署和管理LLM,使得在本地运行大模型的过程变得非常…

python之List列表

1. 高级数据类型 Python中的数据类型可以分为:数字型(基本数据类型)和非数字型(高级数据类型) 数字型包含:整型int、浮点型float、布尔型bool、复数型complex 非数字型包含:字符串str、列表l…

CPPTest实例分析(C++ Test)

1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架,用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式,并且可以轻松添加新的输出格式。 CppTest下载地址:下载地址1  下载地址2 下面结合实例分析下CppTest如…

MAC系统升级问题记录

一、 场景 新购置一台MAC mini盒子作为开发使用,系统版本为macOS Sonoma 14.2, 由于是新机器,从新开始安装开发工具,从AppStore中获取XCode 15.3 版本,编译现有工程项目,报如下错误: SDK does not contai…

Vue3+ts(day03:ref和reactive)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】,记录一下学习笔记,用于自己复盘,有需要学…

传感器在机械自动化中的应用有哪些?

传感器在机械自动化领域扮演了非常关键的角色,它们是实现高效和精准控制的基础。传感器可以检测和测量机械系统中的各种物理量,如位置、速度、温度、压力等,并将这些物理量转换成电信号,以便控制系统能够进行分析和响应。以下是一…

vue使用外部的模板

在 Vue 2 中,如果你希望使用外部的 HTML 文件内容作为模板,有几种方法可以实现,但每种方法都有其局限性或需要注意的事项。下面是一些可能的方法: 1. 使用 AJAX 加载外部 HTML 你可以使用 AJAX 来异步加载外部的 HTML 文件&…

ARCGIS PRO3 三维模型OSGB转SLPK场景数据集

1.前言 因项目工作,需要将三维模型发布到arcgisserver上,但arcgisserver只支持slpk格式的模型,于是我开启了漫长的三维模型格式转换之旅,在这里记录下本人踩过的坑。 2.三维模型数据情况 2.1 模型大小:在20GB以上&a…

tcp inflight 守恒算法的自动收敛

inflight 守恒算法看起来只描述理想情况,现实很难满足,是这样吗? 从 reno 到 bbr,无论哪个算法都在描述理想情况,以 reno 和 bbr 两个极端为例,它们分别描述两种理想管道,reno 将 buffer 从恰好…

goroutinue和channel

goroutinue和channel 需求传统方式实现goroutinue进程和线程说明并发和并行go协程和go主线程MPG设置Go运行的cpu数 channel(管道)-看个需求使用互斥锁、写锁channel 实现 使用select可以解决从管道取数据的阻塞问题(无需手动关闭channel了)goroutinue中使…

Vue 3的性能优化策略

Vue 3有一些性能优化策略可以帮助提升应用的性能: 静态提升(Static Template Hoisting):Vue 3使用了模板编译提升技术,将模板编译为更高效的渲染函数。这个过程中,静态模板部分会被提升到编译阶段&#xff…

Rust 字符串基本使用教程及代码演示

文章目录 一、基本使用教程1、字符串类型String&str 2、创建字符串创建String创建&str 3、字符串操作索引切片格式化字符串比较 4、字符串和集合5、字符串的错误处理6、参考链接 二、代码演示1、代码演示2、执行结果 一、基本使用教程 在Rust中,字符串是编…

61、回溯-分割回文串

思路: 还是全排列的思路,列出每一种组合,然后验证是否是回文,如果是子串放入path中,在验证其他元素是否也是回文。代码如下: class Solution {// 主方法,用于接收一个字符串s并返回所有可能的…

油烟净化器控制食堂油烟排放:高效净化设备的必要性与实施策略

我最近分析了餐饮市场的油烟净化器等产品报告,解决了餐饮业厨房油腻的难题,更加方便了在餐饮业和商业场所有需求的小伙伴们。 在食堂环境中,油烟排放是一个普遍存在且备受关注的问题。选择高效的油烟净化设备对于保障空气质量、改善生活环境…

智能变频三模正弦波控制器

智能变频三模正弦波控制器 前言一、图片介绍总结 前言 不敢动,完全不敢动。多做笔记,完全了解之后再说吧 一、图片介绍 轮毂电机 主角登场 淘宝关于这款控制器的介绍 当然不同的型号功能不同 学习线插上就会转,可以使用继电器控制通断。 电门…