【开源】云原生——站式数据中台PaaS
优采云 发布时间: 2021-05-08 19:21【开源】云原生——站式数据中台PaaS
本文来源于:云原生系统日志采集栈的实践
数据栈是云本地站数据中心PAAS。我们在GitHub上有一个有趣的开源项目:flinkx。欢迎为我们订购一颗星星!星星!星星
Flinkx是一个基于Flink的批处理流统一数据同步工具,它不仅可以实现采集静态数据,如mysql、HDFS等,还可以实现采集实时数据,如mysql、binlog、Kafka等,是一个全局、异构、批处理流集成的数据同步引擎。如果您有兴趣,欢迎您访问我们的GitHub社区~
[第21页]
一、普通麋鹿
说到日志采集,估计会首先想到相对成熟的解决方案麋鹿。如果它专门针对cloud native,您可以将采集器稍微更改为fluent d以形成efk。实际上,上述两种方案没有本质区别,采集器只是改变了。最后,使用elasticsearch进行存储、查询等
Elasticsearch非常丰富和强大,但它也非常昂贵。Elasticsearch使用全文索引,这需要很高的存储和内存。但是,这些功能通常不用于日常日志管理。这些缺点在主机模式下是可以容忍的,但在云本机模式下是很麻烦的
二、没有道德的PLG
PLG是promtail+Loki+grafana的统称,这是一个非常适合于云本地日志的采集方案。Grafana是一个非常好的可视化框架,支持多种数据源。最常见的是将普罗米修斯的数据可视化。洛基是我们今天要讨论的主角。这也是格拉法纳家族的产品。Promtail是洛基的官方日志
与elk相比,该方案具有重量轻、实用性强、使用方便等优点,并且在显示中使用grafana减少了视觉框架的引入。显示终端的统一也有利于用户的使用
(一)原木新贵洛基
[第25页]
Loki是一个受Prometheus启发的水平可扩展且高度可用的多租户日志聚合系统。其设计成本低,操作方便。它没有索引日志的内容,而是为每个日志流设置一组标签
与其他日志聚合系统相比,Loki
日志没有完全索引。通过存储压缩的、非结构化的日志和仅索引的元数据,Loki更易于操作,运行成本更低
使用与Prometheus相同的标记对日志流进行索引和分组,使您能够在具有与Prometheus相同标记的度量和日志之间无缝切换
它特别适合于存储库伯内特斯荚果原木。元数据(如pod标签)将自动进行爬网和索引
Grafana本机支持(需要Grafana v6.0或更多)
这是Loki对GitHub的介绍。我们可以看到,这是一个轻量级的云日志聚合系统。目前,社区非常活跃。此外,还采用了普罗米修斯相似标签的思想与格拉法纳相连进行视觉显示。这个想法和用法都非常“云本地”
(二) ♂️ 我的儿子promtail
Promtail是Loki采集器的官方日志,其代码在Loki项目中。本机支持日志、syslog、文件和docker类型的日志,采集器的实质是根据模式找到要成为采集的文件,然后像tail一样监视文件,然后将写入文件的内容发送到存储终端promtail。上述类型的本质也是文件,但这些类型的文件格式是开放的、稳定的,Promtail可以提前对其进行进一步的分析和封装
(三)promtail服务发现
1、作为采集器,第一步是找出文件所在的位置,然后执行以下功能,如采集、标记和推送。常见的静态日志很容易找到。您可以直接匹配在配置文件中写入的路径信息。例如,在promtail中,路径是“/var/log/*”。Log”,即所有以结尾的后缀文件。/var/Log目录中的日志可以用作采集的对象。但是,在采集k8s模式下登录有点麻烦
首先,让我们考虑一下k8s上运行的服务的日志在哪里
因此,我们需要将/var/log/pods作为主机路径装载到k8s的容器中,以便promtail可以访问这些日志
标签2、
可以访问Log promtail,但另一个问题是如何区分这些日志。洛基使用类似普罗米修斯的想法来标记数据。也就是说,如果您将日志标记为pod,那么仅仅依靠此路径就无法知道pod上有什么标签信息。这里需要服务发现
Promtail的服务发现直接基于Prometheus的服务发现。熟悉Prometheus的学生必须已经配置了Prometheus的服务发现配置kubernetes\sd\uuuconfigs和relax\uuconfigs
在这里,promtail直接介绍了Prometheus的代码。与Prometheus不同的是,Prometheus对对象请求更多的资源,如节点、地址、pod、部署等。最后的拼接是metric请求URL,promtail请求的对象是pod,不在主机上的pod被过滤掉
获取主机的pod信息后,根据名称空间中pod的ID拼接路径。由于此目录已装入容器中,promtail可以将容器的标签与容器的日志相关联。剩下的就是监视和推动
(四)PLG最佳实践
Loki推荐的最佳实践是使用damonset部署promtail,将节点的/var/lib/pods目录挂载到容器中,并借助Prometheus的服务发现机制对日志进行动态标记,这在资源占用和部署维护难度上都非常低。这也是主流的云原生日志采集范式
[k32号]
叠木计数的实践
(一)堆栈日志要求
(二)]主机模式
堆栈主机模式下的日志聚合类似于PLG dameonset模式。每个主机部署一个promtail,然后整个集群部署一组服务器Loki和visualization grafana
Promtail使用静态配置来定义采集的日志。但是promtail毕竟还太年轻,而且它的定位往往是云本地的,所以主机功能还不完善。因此,我们做了一些二次开发来满足我们的需要
1、logtail模式
本机promtail不支持从文件尾部采集。当promtail启动时,它将推送所有监视文件的内容。这种情况在本地云计算中不是大问题
在主机模式下,如果要监视的日志已经存在并且有大量内容,promtail将开始从头推送文件的内容。在短时间内,会有大量的日志被推送到Loki,由于Loki目前的限制,推送失败的可能性很大
因此,最好的方法是使用类似于filebeat的logtail模式,只在服务启动后将日志推送到文件中
在这里,我们进行了二次开发,添加了logtail模式的切换。如果开关为true,则在第一次启动promtail时,不会从头开始推送日志
2、路径支持多路径
本机promtail不支持多路径路径参数,只能编写一个表达式。然而,真正的需求可能是同时查看业务日志和GC日志
但它们属于同一类。单个路径的匹配不能覆盖其中两个路径。不改变代码的解决方案是为它编写另一个目标
这样既麻烦又不利于维护。所以我们在这里做了二次开发
[k38号]
(三)云本机模型
传统的云原生模式最好采用PLG的主流模式。但是,作为一个整体系统,数据栈对企业的交付有很多限制,这将导致demoset模式的不可用。最大的挑战是许可。只能在/var/Lib/pods上装载一个命名空间权限
在这种情况下如何使用PLG
事实上,主要的变化在于prommail的使用。这里要声明的第一件事是,多个服务堆栈的日志作为文件输出
第一种是选择damonset模式或sidecar模式。demonet模式的优点是节省资源,缺点是需要权限。相反,为了适用更严格的交货条件,我们为采集选择了sidecar车型
Sidecar模式是在部署每个服务时自动为其添加日志容器。容器和服务容器一起装载一个公共的空数据卷。服务容器将日志写入数据卷,日志容器对数据卷下的日志执行采集
[k40号]
[第29页]⛳ promtail如何在数据堆栈中动态配置标记
通过sidecar模式,让日志容器和主容器共享一个日志目录,从而在promtail容器中获取日志文件。但是,promtail不知道哪些日志指向采集以及它们的标签是什么
因为你可能只需要采集的日志。日志,或者您可能只需要采集的日志。JSON,或者某些服务的配置可能不同,所以不能死写。你怎么解决这个问题
Promtail在v2.10中增加了一个新特性,即可以引用配置文件中的环境变量。通过这个特性,我们可以将promtail的path参数写为${log]\upath},然后将服务的logpath设置为环境变量,比如log\upath=/var/log/commonlog/*.log
因为我们可以在创建服务时通过环境变量设置路径,所以