解决方案:Kubernetes 下日志采集、存储与处理技术实践

优采云 发布时间: 2022-11-27 13:16

  解决方案:Kubernetes 下日志采集、存储与处理技术实践

  在 Kubernetes 服务化、实时日志处理、集中式日志存储的趋势下,Kubernetes 日志处理也遇到了新的挑战,包括动态容器采集

、大流量性能瓶颈、日志路由管理等。

  本文介绍“Logtail +

  日志服务+生态“架构,并介绍了Logtail客户端在Kubernetes日志采集场景中的优势。作为基础设施,日志服务是满足实时读写和HTAP日志记录的强大日志记录需求的一站式解决方案。日志服务数据的开放性,结合云产品和开源社区,为用户提供了丰富的实时计算、可视化和采集选择。Kubernetes

  日志处理的趋势和挑战:Kubernetes 无服务化

  Kubernetes 容器技术促进了技术栈的解耦,通过引入栈层分层,让开发者更加关注自己的应用和业务场景。从 Kubernetes 本身的角度来看,这种技术解耦也在走得更远,容器化的一个趋势是这些容器都将在无服务器基础设施上运行。说到基础设施,首先想到的是云,

  它目前在AWS,阿里云和Azure上提供无服务器Kubernetes服务。在无服务器 Kubernetes 上,我们将不再关心集群和机器,只需要声明容器的镜像、CPU、内存和外部服务模式即可启动应用。

  如上图所示,左右两侧是经典 Kubernetes 和无服务器 Kubernetes 的形式。日志采集

在从左到右的过程中也会变得复杂:

  对实时日志的需求正在增加

  首先需要强调的是,并不是所有的日志都需要实时处理,目前很多“T+1”时间日志下发还是很重要的,比如:BI可能有一天级的延迟就够了,CTR估计有1小时的日志也可以。

  然而,在

  部分场景下,秒级或更高时效日志是前提,下图中横坐标从左到右对比,可见实时数据对决策的重要性。

  让我们谈谈关于实时日志对决策的重要性的两个场景:

  集中存储日志日志

  的来源很多,常见的有:文件、数据库审计日志、网络数据包等。此外,对于同一数据,日志数据可以针对不同的用户(如开发、运维、运营等)和不同的目的(如告警、数据清洗、实时检索、批量计算等)以多种方式重复消费。

  在日志数据的系统集成中,从数据源到存储节点再到计算节点,都可以定义为流水线。如下图所示,从上到下的变化是:日志处理正在从 O(N^2) 管道演变为 O(N) 管道。

  过去,各种日志都是以特定的方式存储的,采集到计算环节没有通用和复用的条件,流水线非常复杂,数据存储可能是重复和冗余的。在当前日志数据集成方面,依托集线器简化了日志架构的复杂性,优化了存储利用率。这个基础设施级中心非常重要,需要支持实时发布/订阅,能够处理高并发的写入和读取请求,并提供海量存储空间。

  Kubernetes 日志采集

解决方案的演变

  上一节总结了 Kubernetes 日志处理的趋势,因此我将盘点 Kubernetes 上的几种常见日志采集

实践。

  命令行工具

  查看日志

  一个 Kubernetes 集群,最基本的方式就是登录机器,运行 kubectl 日志查看容器写入的 stdout/stderr。

  基本解决方案不能满足更多需求:

  显示节点日志文件

  要在

  Kubernetes 节点维度,docker 引擎将容器的 stdout/stderr 重定向到 logdriver,并且可以在 logdriver 上配置各种形式的去持久化日志,比如将 JSON 格式的文件保存到本地存储。

  与 kubectl 命令行相比,它进一步本地化了日志的存储。像grep/awk这样的Linux工具可以用来分析日志文件的内容。

  这个方案相当于回到了物理机时代,但还有很多问题没有解决:

  基于此解决方案的进化版本是在 Node 上部署日志采集

客户端,并将日志上传到集中式日志存储设施。这是目前推荐的模式,将在下一节中介绍。

  客户端采集

的挎斗模式日志

  一个配套模式,在 Pod 内部,除了业务容器之外,还有一个日志客户端容器。此日志客户端容器负责采集

Pod 内容的标准输出、文件和指标数据,并将其上报给服务器。

  该解决方案解决了日志持久存储等基本功能需求,但有两个方面需要改进:

  如果一个节点上运行 N 个 Pod,则 N 个日志客户端同时运行,导致 CPU、内存、端口等资源浪费。

  在 Kubernetes 下,需要单独采集

和配置每个 pod(采集

日志目录、采集

规则、存储目标等),维护起来并不容易。

  日志直写

  直写方案一般是通过修改应用本身,在程序内部组织多个日志,然后调用类似HTTP的API将数据发送到日志存储后端来实现的。

  好处是:日志格式可以按需DIY,日志源和目标的路由可以任意配置。

  

" />

  您还可以看到使用限制:

  入侵代码会直接依赖于业务转型,推动业务转型一般较长。

  当应用程序在向远端发送数据时遇到异常(如网络抖动或服务器上收到内部错误)时,需要将数据缓存在有限的内存中重试,最终可能导致数据丢失。

  Kubernetes 日志处理架构

  来自社区的架构

  在今天看到的架构中,采集

工作是通过在每个 Kubernetes 节点上安装日志客户端来完成的:

  日志客户端格式化数据,使用指定的协议上传到存储终端,常见的选择是Kafka。Kafka 支持实时订阅、重复消费,后期根据业务需求将数据同步到其他系统,如:业务日志转弹性搜索进行关键词查询,结合 Kibana 进行日志可视化分析;要在财务场景中长期保留日志,您可以选择将 Kafka 数据交付到经济高效的存储,例如 AWS S3。

  这种架构看起来简单有效,但在 Kubernetes 中有一些细节需要解决:

  日志服务的 Kubernetes 日志架构实践

  我们提出一种基于阿里云日志服务的 Kubernetes 日志处理架构,作为社区解决方案的补充,解决 Kubernetes 场景下日志处理的一些详细体验问题。这种架构可以概括为:“Logtail + 日志服务 + 生态”。

  首先,Logtail 是日志服务的数据采集

客户端,针对 Kubernetes 场景中的一些痛点而设计。这也符合 Kubernetes 官方的建议,每个节点上只部署一个 Logtail 客户端,负责该节点上的所有 Pod 日志采集

  其次,对于关键词搜索和SQL统计这两个基本的日志需求:日志服务提供了基本的LogHub功能,支持实时数据写入和订阅。基于LogHub存储,您可以选择启用数据索引分析功能,该功能在启用索引后可以支持日志关键词查询和SQL语法分析。

  最后,开放日志服务数据。索引数据可以通过JDBC协议与第三方系统连接,SQL查询结果可以轻松与阿里云DataV等Grafana系统和开源社区集成。日志服务的高通量实时读写能力支持与流计算系统的互联互通,Spark Streaming、Blink、Jstorm等流计算系统上的连接器支持。

  您还可以通过全托管交付功能将数据写入阿里云的对象存储(OSS),该功能支持行存储(CSV,JSON)和列存储(parquet)格式,可以作为长期低成本备份,或者通过“OSS存储+E-MapReduce计算”架构将数据仓库。

  日志服务的优势

  从四个角度描述日志服务的特点:

  回顾第一节提到的 Kubernetes 日志处理的趋势和挑战,以下是日志服务的三大优势:

  日志服务结合社区力量进行 Kubernetes 日志分析

  Kubernetes

  源于社区,使用开源软件进行 Kubernetes 日志处理在某些场景下也是一个不错的选择。

  日志服务保证数据的开放性,在采集、计算、可视化等方面与开源社区对接,帮助用户享受社区的技术成果。

  如下图所示,举一个简单的例子:使用流计算引擎flink实时消费日志服务日志数据库数据,对源日志数据库和flink任务的分片并发进行动态负载均衡,用MySQL完成数据连接处理后,再将连接器流式传输到另一个日志服务日志数据库进行可视化查询。

  Logtail在Kubernetes日志采集

场景中的设计

  在本文的第二部分,我们回顾了 Kubernetes 日志采集解决方案演进过程中遇到的问题,第三部分介绍了基于阿里云日志服务的功能和生态系统。

  本节将重点介绍 Logtail 采集

端的设计和优化,以及 Logtail 如何解决 Kubernetes 日志采集

的痛点。

  收购 Kubernetes 的难点

  Container stdout/stderr

  容器应用日志

  主机日志

  开放协议:系统日志,HTTP等

  在性能方面,既要满足单节点上的*敏*感*词*流量日志场景,又要兼顾实时采集

  解决容器日志波动性问题

  在所有情况下,都尽可能保证所采集

数据的完整性

  自动发现用于扩展和缩减的容器的要求

  降低 Kubernetes 部署的复杂性

  如何部署和管理集合配置

  不同用途的 Pod 日志需要存储在不同的类别中,以及如何管理数据路由

  Logtail 非常可靠

  Logtail支持至少一次采集的语义保证,通过文件和内存两级的检查点机制,保证容器重启场景下的断点传输。

  在日志采集过程中,我们可能会遇到来自系统或用户配置的各种错误,例如日志格式化和解析错误,我们需要及时调整解析规则。Logtail提供采集和监控功能,可以向日志库上报异常和统计,支持查询告警。

  

" />

  Logtail优化计算性能,解决单节点*敏*感*词*日志采集问题,在不格式化日志字段的情况下,实现每CPU核心约100MB/s的处理性能(单行模式)。对于通过网络发送的慢速 IO 操作,客户端批处理会将多个日志提交到服务器以实现持久性,同时考虑实时采集

和高吞吐量能力。

  在阿里巴巴集团内部,Logtail目前拥有数百万个客户端部署,稳定性不错。

  丰富的数据源支持

  为了应对 Kubernetes 环境中复杂多样的采集需求,Logtail 可以支持 stdout/stderr、容器、主机日志文件、syslog、lumberjack 等开放协议数据采集

。根据

  语义将一个*敏*感*词*志格式:

  多行解析。例如,Java 堆栈跟踪日志由多个自然行组成,通过在行首设置正则表达式来按逻辑行划分日志。

  自我描述解析。支持CSV、JSON等格式自动提取日志字段。

  通过常规的自定义插件满足更具体的需求。

  对于一些典型的日志,提供了内置的解析规则。例如,用户只需要在 Web 控制台选择日志类别作为 Nginx 访问日志,Logtail 就可以根据 Nginx 的日志格式配置client_ip、uri 等字段自动提取访问日志。

  应寻求节点级容器的动态扩展

  容器本质上

  是规范化扩缩的,新扩容的容器日志需要及时采集

,否则会丢失,这就要求客户端具备动态感知采集源的能力,部署配置需要简单易用。Logtail从两个维度解决了数据采集

的完整性问题:

  通过DaemonSet快速将Logtail部署到一个Kubernetes节点,一条指令即可完成,方便与K8S应用版本集成。

  Logtail 客户端部署到节点后,通过域套接字与 docker 引擎通信,处理节点上容器的动态集合。增量扫描可以及时发现节点上的容器变更,再加上定期全扫描机制,确保不会丢失任何容器变更事件,这种双重保障设计使得在客户端及时、完整地发现候选监控目标成为可能。

  从设计之初,Logtail就选择了服务端的集中式集合配置管理,以保证采集

指令可以更高效地从服务端传递到客户端。这种配置管理可以抽象为“机器组+采集配置”的模型,对于一个集合配置,机器组中的Logtail实例可以立即获取与机器组关联的采集配置,启动采集任务。

  针对 Kubernetes 场景,Logtail 设计了一种自定义识别方法来管理机器。一种类型的 Pod 可以声明一个固定的机器 ID,Logtail 使用该 ID 向服务器报告心跳,一组机器使用此自定义 ID 来管理 Logtail 实例。当

  Kubernetes 节点扩容时,Logtail 会将 Pod 对应的自定义机器 ID 上报给服务端,服务端将机器组挂载的集合配置发送给 Logtail。

  目前在开源集合客户端上,常见的做法是使用机器 IP 或主机名来

  识别客户端,这样在容器扩容时,需要及时添加或删除机器组中的机器IP或主机名,否则会导致数据采集

不足,需要复杂的扩展过程来保证。

  解决采集

配置管理问题

  Logtail提供了两种管理采集配置的方式,用户可以根据自己的喜好进行操作:

  CRD。与 Kubernetes 生态深度融合,可通过客户端上的事件*敏*感*词*器在日志服务上创建日志存储库、集合配置、机器组等资源。

  网络控制台。快速使用,直观配置日志格式和解析规则,使用向导完成集合配置与机器组的关联。用户只需要按照习惯设置容器的日志目录,当主机上开启采集时,Logtail 会自动呈现主机上的实际日志目录。

  我们将从源到目标(日志库)的日志定义为摄取路由。使用传统方案实现个性化采集

路由功能非常麻烦,需要在客户端本地配置,每个 Pod 容器写入此采集

路由,对容器部署和管理会有很强的依赖性。

  Logtail解决这个问题的突破点是环境变量的应用,Kubernetes的env由多个键值组成,可以在部署容器时设置。

  Logtail的采集配置设计有IncludeEnv和ExcludeEnv配置项,用于添加或排除采集

源。

  在下图中,Pod 服务容器在启动时设置为环境变量log_type,并在 Logtail 集合配置中定义了 IncludeEnv: log_type=nginx_access_log,用于将用于 nginx 类目的的 pod 日志集合指定到特定的日志库。

  所有采集

的数据都在 Kubernetes 上,Logtail 自动标注了 pod/nameapce/contanier/image 维度,方便后续数据分析。

  日志上下文查询的设计

  上下文查询是指:给定一个日志,查看该日志在原创

机器上的上一个或下一个日志和文件位置,类似于 Linux 上的 grep -A -B。

  在某些场景比如 DevOps 中,逻辑异常需要这个时序来辅助定位,配合上下文查看功能,事半功倍。那么在分布式系统下,很难保证源和目标的原创

日志顺序:

  在传统的上下文查询解决方案中,日志根据到达服务器的时间和日志服务时间字段进行两次排序。这存在于大数据场景中:排序性能问题,时间精度不足,无法真正还原事件的实时序列。

  Logtail 与日志服务(关键词查询功能)相结合,解决了这个问题:

  当日志的

  容器文件被采集

并上传,数据包由多个日志批量组成,多个日志对应一个特定文件的块,例如 512KB。

  此数据包中的多个日志按源文件的日志顺序排列,这意味着一个日志的下一个条目可能位于同一数据包中,也可能在下一个数据包中。

  Logtail 会在采集时为该报文设置唯一的日志源源 ID,并在上传的报文中设置报文自递 ID,称为 packageID。在每个包中,任何日志在包中都有一个偏移量。

  虽然报文可能不按顺序存储在服务器后面,但日志服务有一个索引,可以精确地查找具有指定源 ID 和包 ID 的报文。

  当我们指定容器 A 的序列号 2 日志(source_id:A、package_id:N、偏移量:M)查看以下内容时,首先判断当前报文的偏移量是否为报文末尾(报文中的日志数定义为L,末尾的偏移量为L-1):

  如果偏移量 M 小于 (L-1),则其下一个对数位置为:source_id:A, package_id:N, 偏移量:M+1,

  如果当前日志是最后一个数据包条目,则下一个日志位置为:source_id:A,package_id:N+1,偏移量:0。

  大多数场景下,使用随机查询关键词获取的包可以支持当前数据包长度L次的上下文页面翻转,从而提高查询性能,大大减少后台服务的随机IO次数。

  核心方法:网站SEO优化当天收录最有效的方法是什么?

  (文/监护人 袁坤) 作为网站运营者,都希望自己的网站权重高,网站收录快,关键词排名好,网站流量高。网站权重慢慢提升,关键词也是水到渠成的结果。但是可以快速实现网站收录速度快,网站流量高的问题。当天收网站最快的方法是什么?

  守护者袁坤发现,很多朋友比较关心的是网站的采集

和快照。最好当天给自己的网站拍一张快照,最好能秒收网站内容。其实解决这样的问题并不太难。我们一起来分析一下:

  首先是网站服务器(主机)的打开速度。

  网站的打开速度非常关键。在PC互联网时代,搜索引擎建议网站在3秒内打开首页。在如今的移动互联网时代,搜索引擎推荐网站在1.5秒内打开网站首屏。

  

" />

  网站最好选择国内空间(主要指大陆空间,网站需要备案),相对来说打开速度更快。即使选择港台空间或国外空间不备案,也一定要选择知名空间服务商。守护者袁坤建议,企业保证网站的稳定性和打开页面的速度非常重要。

  其次,网站的内容必须是高质量的。

  相对来说,原创内容更加稀缺,但大多数朋友可能不会坚持输出原创内容。即使是伪原创或编辑整合,也需要花费大量时间整理,尽量让网站内容更好更丰富。如果要使用伪原创工具,还需要人工二次编辑。

  每个网站都有不同的主题,所以网站的内容一定要围绕这个主题来展开。只有解决了用户问题的内容才是真正有价值的内容,才有可能让你的网站更具有权威性。

  

" />

  最后,网站一定要做好内外链。

  网站一定要做好链接,无论是内链还是外链,都有很好的效果。当然,在外部链接越来越难的时候,内部链接是基础。事实上,友情链接是一种很好的外部链接形式。

  解决最基本的问题,我们的网站如何实现当天的快照和采集

(甚至二次采集

)?其实解决方法很简单:只要在百度搜索资源平台的移动专区提交链接即可(之前的雄掌账号功能),守护者袁坤发现一般的网站链接提交(网站支持)效果是非常慢。当然新站6个月的保护效果也不错!

  如果你的网站想要当天甚至秒收录,那么按照上面介绍的方法肯定会取得显着的效果,网站SEO优化人员可以试试。如何快速获得高网站流量的结果?其实原因很简单:就是借助第三方平台进行推广。

  第三方平台的营销推广难度越来越大(主要是硬广告)。很多企业更注重官网的营销和运营。但是,如何优化官网的SEO呢?欢迎与守护者元坤交流!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线