登录 Kubernetes:EFK 与 PLG

登录 Kubernetes:EFK 与 PLG

随着分布式系统复杂性的增加,监控已成为不断增长的云解决方案的一个非常重要的组成部分。 有必要了解他们的行为。 我们需要可扩展的工具来收集所有服务的数据,并为专家提供具有性能分析、错误演示、可用性和日志功能的单一界面。

这些相同的工具必须高效且富有成效。 在本文中,我们将介绍两种流行的技术堆栈:EFK (Elasticsearch) 和 PLG (Loki),并研究它们的架构和差异。

EFK堆栈

您可能已经听说过非常流行的 ELK 或 EFK。 该堆栈由几个不同的部分组成:Elasticsearch(对象存储)、Logstash 或 FluentD(日志收集和聚合)以及用于可视化的 Kibana。

典型的工作流程如下所示:

登录 Kubernetes:EFK 与 PLG

Elasticsearch — 具有搜索和实时分析功能的分布式对象存储。 针对日志等半结构化数据的优秀解决方案。 信息保存为 JSON 文档,实时索引并分布在集群节点上。 使用倒排索引,包含用于全文搜索的所有唯一单词和关联文档,而该索引又基于 Apache Lucene 搜索引擎。

流利D 是一个数据收集器,在收集和使用数据时统一数据。 它尝试尽可能地以 JSON 形式组织数据。 它的架构是可扩展的,有更多 数百种不同的扩展,社区支持,适合所有场合。

Kibana - Elasticsearch 的数据可视化工具,具有各种附加功能,例如时间序列分析、图形分析、机器学习等。

Elasticsearch架构

Elasticsearch 集群数据分布在其所有节点上存储。 集群由多个节点组成,以提高可用性和弹性。 任何节点都可以执行集群的所有角色,但在大规模横向扩展部署中,节点通常被分配单独的任务。

集群节点类型:

  • 主节点——管理集群,至少需要三个,其中一个始终处于活动状态;
  • 数据节点 - 存储索引数据并用它执行各种任务;
  • 摄取节点 - 在索引之前组织用于转换数据的管道;
  • 协调节点——路由请求、减少搜索处理阶段、协调海量索引;
  • 警报节点——启动警报任务;
  • 机器学习节点 - 处理机器学习任务。

下图展示了数据如何跨节点存储和复制,以实现更高的数据可用性。

登录 Kubernetes:EFK 与 PLG

每个副本的数据都存储在倒排索引中,下图显示了这是如何发生的:

登录 Kubernetes:EFK 与 PLG

安装

详情可查看 这里,我将使用舵图:

$ helm install efk-stack stable/elastic-stack --set logstash.enabled=false --set fluentd.enabled=true --set fluentd-elastics

PLG堆栈

如果您找不到这个缩写词,请不要感到惊讶,因为它更广为人知的名字是 Grafana Loki。 无论如何,该堆栈越来越受欢迎,因为它使用了经过验证的技术解决方案。 您可能已经听说过 Grafana,一种流行的可视化工具。 它的创建者受到 Prometheus 的启发,开发了 Loki,一个水平可扩展的高性能日志聚合系统。 Loki 仅索引元数据,而不是期刊本身,这是一种易于使用且经济高效的技术解决方案。

普罗姆泰尔 - 用于将日志从操作系统发送到 Loki 集群的代理。 格拉法纳 是一个基于 Loki 数据的可视化工具。

登录 Kubernetes:EFK 与 PLG

Loki 的构建原理与 Prometheus 相同,因此非常适合存储和分析 Kubernetes 日志。

洛基架构

Loki 可以作为单个进程或多个进程运行,从而允许水平扩展。

登录 Kubernetes:EFK 与 PLG

它还可以作为整体应用程序或微服务工作。 作为单个进程运行对于本地开发或小型监控非常有用。 对于工业实施和可扩展的工作负载,建议使用微服务选项。 写入和读取数据的路径是分开的,因此可以根据需要进行微调和缩放。

我们先看一下日志收集系统的架构,不做详细介绍:

登录 Kubernetes:EFK 与 PLG

这是描述(微服务架构):

登录 Kubernetes:EFK 与 PLG

主料:

普罗姆泰尔 — 安装在节点上的代理(作为一组服务),它从任务中删除日志并访问 Kubernetes API 以获取标记日志的元数据。 然后它将日志发送到主 Loki 服务。 元数据映射支持与 Prometheus 相同的标记规则。

合作伙伴 — 充当缓冲区的服务分配器。 为了处理数百万条记录,它会打包传入的数据,并在数据到达时将其压缩为块。 多个数据接收器同时运行,但属于一个传入数据流的日志应仅出现在其中一个数据接收器的所有块中。 这被组织成一个接收器环和顺序散列。 为了实现容错和冗余,需要执行 n 次(如果未配置,则执行 3 次)。

摄取者 — 服务接收者。 数据块到达时经过压缩并添加了日志。 一旦块的大小足够,该块就会刷新到数据库。 元数据进入索引,日志块中的数据进入块(通常是对象存储)。 重置后,接收器创建一个新块,其中将添加新条目。

登录 Kubernetes:EFK 与 PLG

Index - 数据库、DynamoDB、Cassandra、Google BigTable 等。

切大块 — 压缩形式的日志块,通常存储在对象存储中,例如 S3。

查询者 - 完成所有肮脏工作的阅读路径。 它查看时间范围和时间戳,然后查看索引以查找匹配项。 接下来,它读取数据块并过滤它们以获得结果。

现在让我们看看一切都在起作用。

安装

在 Kubernetes 中安装最简单的方法是使用 helm。 我们假设您已经安装并配置了它(还有第三个版本! 约译者)

添加存储库并安装堆栈。

$ helm repo add loki https://grafana.github.io/loki/charts
$ helm repo update
$ helm upgrade --install loki loki/loki-stack --set grafana.enabled=true,prometheus.enabled=true,prometheus.alertmanager.persistentVolume.enabled=false,prometheus.server.persistentVolume.enabled=false

下面是一个示例仪表板,显示来自 Prometheus 的 Etcd 指标数据和来自 Loki 的 Etcd pod 日志数据。

登录 Kubernetes:EFK 与 PLG

现在让我们讨论这两个系统的架构,并比较它们的功能。

对照

查询语言

Elasticsearch使用Query DSL和Lucene查询语言来提供全文搜索功能。 它是一个成熟、强大的搜索引擎,拥有广泛的运营商支持。 有了它,您可以按上下文搜索并按相关性排序。

环的另一边是 LogQL,用于 Loki,PromQL(Prometheus 查询语言)的后继者。 它使用日志标签来过滤和选择日志数据。 可以使用描述的一些运算符和算术 这里,但在能力上落后于Elastic语言。

由于 Loki 中的查询与标签相关联,因此它们很容易与指标相关联,因此更容易组织操作监控。

可扩展性

两个堆栈都可以水平扩展,但 Loki 使其变得更容易,因为它具有独立的读写路径和微服务架构。 Loki 可以根据您的需求进行定制,并且可以用于非常大量的日志数据。

多租户

集群多租户是 OPEX 缩写中的一个常见主题,两个堆栈都提供多租户。 Elasticsearch 有几个 方式 客户端分离:每个客户端的单独索引、基于客户端的路由、唯一的客户端字段、搜索过滤器。 洛基有 支持 采用 HTTP X-Scope-OrgID 标头的形式。

成本

Loki 非常经济高效,因为它不索引数据,只索引元数据。 这样就达到了 节省存储空间 和内存(缓存),因为对象存储比 Elasticsearch 集群中使用的块存储便宜。

结论

EFK 堆栈可用于多种用途,为分析、可视化和查询提供最大的灵活性和功能丰富的 Kibana 界面。 它可以通过机器学习能力进一步增强。

Loki 堆栈因其元数据发现机制而在 Kubernetes 生态系统中非常有用。 您可以根据 Grafana 和日志中的时间序列轻松关联数据以进行监控。

在成本和长期日志存储方面,Loki 是云解决方案的绝佳切入点。

市场上有更多选择 - 有些可能更适合您。 例如,GKE 具有 Stackdriver 集成,可提供出色的监控解决方案。 我们没有将它们纳入本文的分析中。

参考文献:

该文章由员工翻译并为 Habr 准备 斯莱姆培训中心 — 来自实践专家的强化课程、视频课程和企业培训(Kubernetes、DevOps、Docker、Ansible、Ceph、SRE、Agile)

来源: habr.com

添加评论