本文主要介绍如何使用类似kubectl logs -tail这类专业的工具实时查看应用日志,从而方便地了解开发过程中系统的运行情况,以及在为实际生产环境的k8s选择解决方案时需要考虑哪些问题。
无论你使用基于kubernetes的系统有多长时间,在你定位问题的工具包中一定存在:日志消息。
在开发过程中,使用kubectl logs -tail命令等工具实时查看日志输出,可以方便地了解系统中正在发生的事情。
然而,当你将容器部署到生产环境中时,维护这种级别的可观察性可能会成为一个负担,因为你试图管理和分析来自多个pod中执行的多个容器化应用程序的大量消息。在现代云原生环境中。必须收集、理解和研究不同来源的数百万条日志,才能理解应用程序运行时发生的事情。
传统日志解决方案根本无法跟上现代产品环境中复杂的分布式基础设施特点,因此找到一个简单而高效的解决方案来帮助你管理这种复杂性,是你进行k8s日志管理工作的关键。
走进Loki
你肯定听说过Grafana,这家公司凭借开源软件而闻名,其开源的软件可以轻松地可视化来自许多不同来源的数据。在k8s世界中,Grafana最著名的可能是监控指标可视化组件Prometheus。
但事情正在发生变化,最近,Grafana已经发展成为一个成熟的可观测性软件供应商,开发了新的项目,如Loki、Mimir和Tempo,解决了日志、链路追踪和指标等重要的可观测性需求。
Loki项目结合云原生架构,专注于管理分布式、高容量、高速增长的日志数据,其灵感来自Prometheus(事实上,Loki宣传自己“像Prometheus,但只针对日志”)。具备很多优势,非常适合现代环境的日志管理。
它易于设置和操作,只索引元数据,而不是完整的日志消息,使其轻量化,它与其他云原生工具(如Kubernetes)一起工作得很好,使用常见的对象存储解决方案,如Amazon S3。
Loki既可以使用自管理的开源版本,也可以用由Grafana云提供的托管服务,它是构成所谓的“PLG”技术栈的基础:Promtail用于日志流采集,Loki用于聚合、存储和查询日志,Grafana用于日志可视化。
再见ELK,你好PLG
看下PLG技术栈,很容易看出来它的确受到Prometheus设计的影响。
Promtail是一个代理(作为Loki产品的一部分提供),负责发现和检索日志数据流。它的功能类似于Prometheus的“scraper”,其配置文件在语法上与Prometheus使用的配置文件相同。本质上是“跟踪”Kubernetes主节点和pod日志文件,并将它们转发到Loki的核心系统。(值得注意的是,Loki支持由Grafana及其社区开发者提供的许多不同的代理,使用fluentd或logstash等的用户更容易迁移到基于PLG的解决方案。)
Loki当然是PLG方案的核心,是专门为处理日志数据而设计的。Loki的特性(我们将在后面更详细地讨论)使它在获取和查询日志数据时既高效又经济。
Grafana仪表板和可视化工具完善了“PLG”套件,提供了强大的功能来分析应用程序、pod和集群日志。
Loki工作原理
架构和部署方式
从架构上看,洛基由五个不同的组件组成:
- distributor:是负责获取日志数据并将其转发给ingester的无状态组件。Distributor对数据进行预处理,检查其有效性,并确保其来自已配置的租户,这有助于系统扩展并保护其免受潜在的Dos攻击。这里Grafana很好地解释了Promtail(推荐的分发代理)如何处理数据。
- ingester:是Loki架构的关键组件。从distributors接收到的数据由ingester写入云云原生存储服务。ingesters还与查询协作,返回内存中的数据以响应读请求。
- Queriers:负责解析LogQL查询请求,并从ingesters或持久化存储中获取数据。
-
query fronted:可选组件-提供API接口,可用于加速读处理。该组件通过将读请求排队、将大请求拆分为多个小请求以及缓存数据来优化读处理。
类似Prometheus,Loki支持告警和记录功能。这些特性是在ruler组件中实现的,该组件持续地计算一组查询,并根据结果执行已定义的操作,例如发送告警或预计算指标。
对于可伸缩性,所有这些组件都可以按需跨系统分布。
Loki可以选择两种本地部署方式: - 单体模式:在一个进程或Docker容器中运行Loki的所有二进制文件。这是了解产品更多信息的一个很好的开始。
- 微服务部署模式:它允许Loki组件分布在多个系统中,并提供了高可伸缩性。
另外一种本地部署模式,称为“简单可伸缩”模式,当你的需求超过单体模式的能力,但不需要大规模的微服务部署时,这是一个很好的中间步骤。当然,如果你根本不想管理Loki,那么可以考虑Grafana云服务。
重要特性
Loki实现了一些令人惊叹的特性,这些特性专门用于分配负载、保护系统不受攻击,并利用有效的存储机制。
Labels(标签)
和许多日志处理系统不同,Loki不对日志数据执行全文索引。相反,它利用了从Prometheus中借来的概念—标签—从日志数据中提取和标记信息,然后仅对标签本身进行索引。这极大地提高了写和读路径上的性能,并且—在我们看来同样有价值—不管输入源是什么,都能实现一致的标签分类。
由于这是Loki的一个重要优点,让我们深入研究Loki文档中的一个示例。假设你有一个Loki的“scrape配置”,如下图所示:
这个配置的标签部分特别重要。在本节中path变量定义了要读取的日志文件,关键字job定义了要查找的标签和用于过滤日志的值。使用此配置,Loki分发器将“跟踪”日志文件,在每个记录中查找一个名为job的变量,该变量的值为syslog,然后创建包含此关键字和值的Loki记录“流”。最后将job标签的索引以及包含标签和值的数据块写入持久化存储。
这个记录流可以使用简单的LogQL查询查询: {job="syslog"}。
在处理查询时,Loki查询器组件将找到指向job标签为syslog记录的索引,然后检索这些记录。
云原生后端存储
由于原始日志数据本身没有索引,Loki可以通过利用云原生对象存储服务(如Amazon S3、Amazon DynamoDB或Cassandra)作为后端数据存储库来提高系统的成本。为了改进查询处理,Loki使用云服务将数据存储为“块”(原始日志数据)和“索引”(规范化和索引标签以及从日志记录中提取的数据)。查询器使用更有效的索引来查找请求的分块日志数据。
LogQL
Loki实现了一种名为LogQL的日志查询语言,它大量借鉴了Prometheus的PromQL语言。LogQL既可以直接使用,也可以通过Grafana前端仪表板使用。为日志和指标提供一致的查询语言可以简化学习曲线,并促进动态过滤和转换。
在k8s集群中部署PLG技术栈
Loki有几种安装机制:Tanka(Grafana自己的云部署),Helm charts用于“简单可伸缩”的微服务部署,使用Docker / Docker Compose机制,以及可下载的二进制文件。如果需要,你还可以从Github存储库下载Loki源代码,并在本地编译。Grafana在这里为每种安装方法提供了说明。
Loki: 是一个更好的k8s日志管理解决方案
跟踪Kubernetes应用程序、pod和集群日志文件是一种非常有用的技术,可以近乎实时地跟踪容器化应用程序的运行情况。Grafana的Loki产品将其提升到一个新的水平,其功能受到流行的Prometheus指标系统的启发,甚至是在高度复杂的环境也易于扩展,以及一些增强性功能,使日志文件的处理比以往任何时候都简单。如果你正在寻找更好的Kubernetes日志管理解决方案,Loki绝对值得一试。