采集系统上云(loki就是云原生下日志的采集方案) -足球即时指数
优采云采集器 发布时间: 2022-02-01 21:02采集系统上云(loki就是云原生下日志的采集方案)
一、常规玩elk
说到日志采集,估计大家首先想到的就是elk,一个比较成熟的方案。如果是专门针对云原生的,那就把 采集器 稍微改一下
fluentd 可以由 efk 组成。其实以上两种方案没有本质区别,采集器只是一个变化。最终的存储、查询等还在
elasticsearch这一套。
elasticsearch 确实功能丰富,功能非常强大,但也极其昂贵,elasticsearch
全文索引方式对存储和内存的要求比较高,这些代价得到的功能在日常日志管理中并不常用。这些缺点在主机模式下其实是可以容忍的,但在云原生模式下就显得臃肿了。
二、别说武德plg
plg
是promtail loki grafana的统称,是一个非常适合云原生日志的采集方案。格拉法纳
您将熟悉它,一个支持多种数据源的出色可视化框架。最常见的是将prometheus的数据可视化。而loki就是我们今天要讲的主角,这也是grafana
家品,promtail 是 loki 采集器 的官方日志。
与elk相比,这套足球即时指数的解决方案非常轻量级,功能强大且易于使用。另外,在显示上使用grafana,减少视觉框架的引入,在显示终端上的统一也有利于用户。
(一) 记录暴发户 loki
loki 是一个受 prometheus 启发的水平可扩展、高可用的多租户日志聚合系统。它被设计成具有成本效益且易于操作。它不索引日志的内容,而是为每个日志流设置一组标签。
与其他日志聚合系统相比,loki
没有日志的全文索引。通过存储压缩的非结构化日志和仅索引元数据,loki 更易于操作且运行成本更低。
使用与 prometheus 相同的标签对日志流进行索引和分组,使您能够使用与 prometheus 相同的标签在指标和日志之间无缝切换。
特别适合存储 kubernetes pod 日志。pod 标签等元数据会被自动爬取和索引。
grafana 原生支持(需要 grafana v6.0 或更高版本)。
这是github上对loki的介绍。可以看出这是一个为云原生构建的轻量级日志聚合系统。社区目前非常活跃。并使用普罗米修斯
类似标签的想法,可以用grafana进行可视化,无论是思维还是使用都非常“云原生”。
(二) ♂️ 儿子 promtail
促销
是loki的官方日志采集器,自己的代码在loki
在项目中。本机支持日志、系统日志、文件和 docker 类型日志。采集器的本质无非就是根据模式找到文件为采集,然后像tail一样*敏*感*词*文件,然后将写入文件的内容发送到存储端promtail
同理,上述类型的本质也是文件,但这些类型文件的格式都是开放稳定的规范,promtail可以提前对它们进行更深层次的分析和封装。
(三) promtail 服务发现
1、 找到文件
作为一个采集器,第一步就是找出文件在哪里,然后就可以做如下采集、标签推送等功能了。普通静态类型的日志很容易找到。可以直接匹配你在配置文件中写的路径信息,比如
promtail中的路径为“/var/log/*.log”,即/var/log目录下所有以.log结尾的后缀文件都可以作为采集的对象。取而代之的是 采集
k8s模式下的登录就麻烦一些了。
首先我们想一想k8s上运行的服务的日志在哪里?
文件类型日志
这自然仍然在您的自定义路径上。如果路径目录未挂载,则它在容器内。如果挂载在host或者pv上,那么host和pv
这种类型的日志promtail不能动态发现,必须手动设置。
标准输出日志
这种日志其实是k8s推荐的日志输出方式。这种日志其实就是我们日常使用的kubectl日志。
你看到的日志,这些日志在主机上的存储路径如下/var/log/pods/
{namespace}_/{pod_id}_uuid/{container_name}/*.log 格式
所以我们需要在 k8s 容器内挂载 /var/log/pods 作为主机路径,以便 promtail 可以访问这些日志。
2、 标记
日志promtail可以访问,但是如何区分这些日志还有一个问题,loki使用了类似prometheus的思路来标注数据。也就是说,如果日志是用 pod 打标签的,那么仅仅依靠这条路径自然是无法知道 pod 上的标签信息是什么。这就是服务发现的用武之地。
promtail的服务发现直接由prometheus的服务发现来完成。熟悉普罗米修斯
同学们一定已经配置好prometheus、kubernetes_sd_configs和relabel_configs的服务发现配置。
这里promtail直接介绍prometheus的代码。与 prometheus 不同,prometheus 向对象请求更多资源,例如 node、ingress、pod 和 deployment。
以此类推,最后拼接的就是metric的request url,promtail请求的对象就是pod,把不在host上的pod过滤掉。
获取到宿主机的pod信息后,根据namespace和pod的id拼接路径。既然这个目录已经挂载到容器中了,那么promtail
您可以将容器的标签与容器的日志相关联。剩下的就是监控和推送。
(四) plg 最佳实践
洛基
官方推荐的最佳实践是使用 damonset 部署 promtail,
/var/lib/pods 目录在 prometheus 的帮助下挂载在容器内
服务发现机制对日志进行动态标记,资源占用和部署维护难度都非常低。这也是主流的云原生日志采集范式。
三、数据栈日志实践
(一) 数据栈日志要求
全局 grep
根据关键字搜索系统中的所有出现
快速定位日志
根据机器名、ip、服务名等条件快速定位日志
主机和云原生统一技术栈
降低使用学习成本并降低系统复杂性
(二)️主机模式
数据栈主机模式日志聚合采用类似于plg dameonset的模式。每个主机部署一个promtail,然后为整个集群部署一组服务器loki
带有可视化侧grafana。
promtail 使用 static_configs 来定义 采集 日志。但promtail
毕竟还是太年轻,定位偏向云原生,所以宿主机的功能还不完善,所以我们做了一些二次开发来满足我们的需求:
1、logtail 模式
本机 promtail 不支持从文件末尾采集。promtail启动时会推送所有被监控文件的内容,这在云原生中问题不大。
在host模式下,如果要监控的日志已经存在,并且内容量很大,promtail
启动会从头开始推送文件的内容,这会导致短时间内大量的日志被推送到loki。
所以最好的办法就是有一个类似filebeat的logtail模式,只在服务启动后推送文件写入的日志。
在这个地方,我们进行了二次开发,增加了logtail模式的开关。如果开关为true,则第一次启动promtail时不会从头开始推送日志。
2、path 支持多路径
原生promtail不支持多路径路径参数,只能写一个表达式,但实际需求可能是同时看业务日志和gc日志。
但它们又是属于同一类别的标签。单一路径的匹配不能同时涵盖两者。不更改代码的足球即时指数的解决方案是为其编写另一个目标。
这既乏味又不利于维护。所以我们在这里也对其进行了二次开发。
(三) 云原生模式
传统的云原生模型采用plg的主流模型,但是数据栈作为一个完整的系统交付给企业时存在很多限制,导致demoset模型无法使用。最大的挑战是权限。只有一个
命名空间权限,无法挂载 /var/lib/pods
在这种情况下如何使用 plg?
其实主要的变化就是promtail的使用。这里首先要声明的是,数据栈服务的日志全部输出到文件中。
首先是选择damonset
模式部署或sidecar模式部署,demoset模式的优点是节省资源,缺点是需要权限。与sidecar模型相比,为了适用更严格的交付条件,我们选择采用
边车的模式执行采集。
边车
该模式是在部署时自动为每个服务添加一个日志容器。容器和服务容器共同挂载一个共同的空数据卷。数据卷采集下的日志。
1、promtail如何动态配置数据栈中的标签
通过sidecar模式,我们让日志container和master
容器共享一个日志目录,这样就可以在promtail容器中获取日志文件,但是promtail还不知道采集有哪些日志,以及它们的标签是什么。
因为你可能只想要采集.log的日志,也可能只想要采集.json的日志,或者两个服务的配置可能不一样,所以不能写死,那么如何解决这个问题呢?
促销
在 v2.10 中添加了一个新功能
,即可以在配置文件中引用环境变量。通过这个特性,我们可以把promtail的path参数写成${log_path},然后把服务的logpath设置成环境变量,比如log_path=/var/log/commonlog/* .log
由于我们可以在服务创建时通过环境变量设置路径,所以也可以动态设置标签。那么我们都需要什么维度标签呢?这家不同的公司肯定有不同的维度,但必须遵循的一个原则是可以唯一标识吊舱。大体维度有deployment、podid、node等,这些标签在创建时通过环境变量注入,podid
这些环境变量是使用k8s的向下api注入的。
注意:此处不提供使用 promtail
服务发现机制配置标签,因为promtail的服务发现原理是请求apiserver获取所有pod
的标签。然后使用路径匹配将标签与日志相关联。无需将主机 /var/log/pods 目录挂载到 promtail
,即使获取到标签,也无法与日志关联。
2、如何在数据栈中部署promtail
为每个服务添加一个日志
集装箱人工操作过于繁琐,不利于维护。对原创服务进行抽象最好的方法是注册一个crd,然后写k8s
操作员列出并监视此类型的对象。在创建对象时,它会动态注入一个 logcontainer,以及相应的环境变量,并为其挂载一个公共目录。
因此,当创建 cr 时,promtail 作为 sidecar 注入。并且读取的环境变量是操作者动态设置的环境变量,非常灵活。
优采云采集器是一个根据用户提供的关键词,云端自动采集相关文章并发布到用户网站的网站采集器。它能够自动识别各种网页上的标题、正文等信息,不需要用户编写任何采集规则就可以实现全网采集。采集到内容后,会自动计算内容与所设定的关键词的相关度,只把相关的文章推送给用户。支持标题前缀、关键词自动加粗、插入固定链接、自动提取tag标签、自动内链、自动配图、自动伪原创、内容过滤和替换、电话号码和网址清理、定时采集、百度主动提交等一系列seo功能。用户只需设置好关键词和相关需求,就能实现全托管、零维护的网站内容更新。不限网站数量,不管是单个网站还是大批量站群,都可以非常方便的进行管理。