使用服务网格来实现 Kubernetes 可观察性

客座文章作者:Buoyant软件工程师Risha Mars。文章最初在 Buoyant的博客上 [1] 发表。

在本文中,我们将向你展示如何完成基本的Kubernetes可观察性任务:从运行在Kubernetes集群上的应用程序获得“黄金指标”(或“黄金信号”)。我们不需要修改任何代码,也不需要进行任何配置,只要安装 Linkerd(一个开源的超轻服务网格) [2] 就可以做到这一点。我们将介绍服务网格是什么,术语“可观察性”是什么意思,以及这两者在Kubernetes上下文中是如何关联的。

使用服务网格监控Kubernetes应用程序

你们刚刚采用了Kubernetes。恭喜你!但是现在要做什么?任何Kubernetes采用者的第一个可观察性任务之一是监控——至少,你需要知道什么时候出现了问题,以便你可以快速地修复它们。

Kubernetes可观察性是一个非常广泛的话题,网上有很多关于可观察性与监控、分布式跟踪与日志记录等之间的细微差别的讨论。在本文中,我们将重点讨论一个基本问题:在不更改任何代码的情况下,从运行在集群上的应用程序获得“黄金指标”(或“黄金信号”)。我们将安装一个Linkerd,一个开源的超轻 服务网格 [3] 。与大多数服务网格不同,Linkerd只需要在集群上安装几分钟,不需要配置。

虽然简单,但Linkerd包含了一个非常强大的指标管道。当安装完毕,它将通过观察与集群上运行的所有组件之间的HTTP(或gRPC)和TCP通信,自动检测并报告成功率、流量级别和响应延迟。

Linkerd可以自动为服务报告的指标通常被引用为服务的黄金指标。

黄金指标是什么和为什么很重要?

如果你已经知道黄金指标是什么,请跳过到下一节!

黄金指标(或“黄金信号”)是你需要了解应用程序是否按预期启动和运行的首要指标。这些指标为你提供了有关服务运行状况的粗略信号,而不需要知道服务的实际功能。

Cindy Sridharan在她关于监控和可观察性的 博文 [4] 中写道:“当不直接驱动警报时,监控数据应该被优化,以提供系统整体健康状况的鸟瞰图。”

谷歌SRE书 [5] 定义的“黄金指标”为:

  • 延迟——一种衡量服务速度快慢的方法。它是服务请求所花费的时间,通常以百分比来度量。第99百分位延迟为5ms意味着99%的请求在5ms或更短的时间内得到服务。

  • 流量——让你知道某项服务有多忙或“有需求”。通常用每秒对服务的请求数来衡量。

  • 错误——请求失败的数量。通常与总流量相结合来生成一个“成功率”——成功请求与遇到错误请求的比率。

  • 饱和度——根据系统的主要约束条件,衡量系统的负载情况。如果系统受到内存限制,这可能是当前使用的最大内存百分比的度量。

通过观察服务的流量,Linkerd可以简单地提供延迟、流量和错误的测量——Linkerd以成功率的形式提供了这些数据。(第四个指标,饱和度,在监控讨论中经常被忽略,因为它需要了解服务的内部情况,通常跟踪其他指标,如流量和延迟。)

有时这些指标也被称为服务的“RED”指标:

  • Rate——你的服务每秒正在处理的请求数。

  • Errors——每秒失败的请求数。

  • Duration——每个请求所花费时间的分布。

不管你怎么称呼它们,Linkerd的美妙之处在于,它不仅记录这些指标的流量,而且汇总和报告它们,这样我们就可以轻松地使用它们。(我们将在下面看到。)这使我们能够 监控 [6] 我们的应用程序。当我们能够监控我们的应用程序,我们就可以在出错时收到警报;研究其长期性能;并对其可靠性和性能进行测试和改进。

黄金指标:最简单的方法

安装:访问Kubernetes集群并安装Linkerd CLI

我们假设你有一个正常运行的Kubernetes集群和一个指向它的 kubectl 命令。在本节中,我们将带你浏览 Linkerd入门指南 [7] 的缩写版本,以便在这个集群上安装Linkerd和一个演示应用程序(我们将获得黄金指标的应用程序)。

首先,安装Linkerd命令行:

curl -sL https://run.linkerd.io/install | sh
export PATH=$PATH:$HOME/.linkerd2/bin

(或者,直接从 Linkerd发行页面 [8] 下载。)

验证Kubernetes集群是否能够支持Linkerd;安装Linkerd;并验证安装:

linkerd check --pre
linkerd install | kubectl apply -f -
linkerd check

最后,安装“Emojivoto”演示应用程序,这是我们希望获得黄金指标的应用程序。如果仔细观察下面的命令,你将看到我们实际上是在向应用程序添加linkerd(我们称之为“注入”),然后将应用程序部署到Kubernetes。(如果你想知道这是如何工作的,请查看我们的 文档 [9] )。

curl -sL https://run.linkerd.io/emojivoto.yml \
| linkerd inject - \
| kubectl apply -f -

嗯,就是这样。这就是你需要的所有工具,你的应用程序,并能够访问你的黄金指标!现在让我们来看看他们。

在Grafana查看指标

想要看到所有这些有用的图表和仪表板吗?不是一个问题!运行 linkerd dashboard –show grafana 并打开命令输出的链接。你将看到Linkerd的Top Line仪表板,其中包含它所收集的指标的总体和每个命名空间的细分。向下滚动到我们应用的命名空间(ns/emojivoto),观察以下图表:

通过Linkerd CLI查看指标

我们还可以使用 linkerd stat 命令查看应用程序的指标。

所有这些数据也可以在Linkerd的dashboard中找到,通过运行 linkerd dashboard 来访问:

看看Grafana图表(或Linkerd仪表盘),你可以立即看到“voting”服务做得不是很好-它的成功率相当低!向我们的应用程序中添加黄金指标可以立即让我们看到应用程序中可能出现的问题。

真的这么简单吗?答案是肯定的!我们所需要做的就是安装Linkerd并将其注入到我们的应用程序中。在底层,当Linkerd被添加到一个服务时,它会自动检测与服务的pod之间的任何HTTP和gRPC调用。由于它理解这些协议,它可以记录这些调用的响应类和延迟,并将它们聚合在一起,在这种情况下,将它们合并到一个名为 Prometheus [10] 的时间序列数据库的小型内部实例中。当你通过Linkerd的仪表板和CLI查看黄金指标时,Linkerd会从这个内部的Prometheus实例中获取它们,在不修改应用程序代码的情况下为你提供所有这些指标。

Linkerd还能做什么?

我们已经看到了如何使用Linkerd来获得黄金指标,这是获得系统 可观察性 [11] 的第一步,也就是说,获得复杂应用程序中正在发生的事情的高级视图。但指标只是个开始。当你继续你的监控和可观察性旅程时,你一定会遇到另外两个常用的工具:日志和分布式跟踪。

分布式跟踪涉及到检测应用程序,以便测量请求在服务中花费的时间长度。当我们的应用程序使用许多相互通信的微服务时,跟踪是一个很好的工具,可以用来调试缓慢的请求,并找出哪个服务是瓶颈。 Linkerd可以帮助分布式跟踪 [12] ,尽管 一个服务网格在分布式跟踪方面最终只能做这么多 [13]

类似于分布式跟踪,Linkerd也提供了一个强大的动态请求跟踪工具tap。tap命令类似于“用于微服务的tcpdump”:它允许你查看发送到或来自特定服务的实时请求(部分)。Tap是 在生产中调试Kubernetes服务 [14] 的强大工具。

最后,应用程序日志当然是开发人员在怀疑某个特定进程不正常时首先要做的事情之一。当运行一个服务网格时,有时候查看网格内部发生了什么是很有用的。虽然Linkerd不能为你提供应用程序日志,但 Linkerd logs 命令 [15] 提供了一种简单的方法,至少可以查看Linkerd内部发生了什么。

总结

在这篇博文中,我们讨论了如何轻松获得运行在Kubernetes集群上的应用程序和服务的黄金指标。这是你被观察之旅坚实的第一步。当然,在你成为经过认证的Kubernetes可观察性专家之前,还有很多东西需要学习和实现!最近一个特别令人兴奋的可观察性话题是关于SLO,或者“服务水平目标(service level objective)”——不要错过我们关于 如何使用Prometheus和Linkerd来设置SLO的指南 [16]

我们希望这篇博文中的信息能够帮助你启动并运行Kubernetes服务。祝你旅途好运!

Buoyant是Linkerd和Buoyant Cloud的创建者,后者是Kubernetes的全自动、基于Linkerd的平台健康仪表盘。 立即注册抢先体验 [17]

参考资料

[1]

Buoyant的博客上: https://buoyant.io/2021/01/11/kubernetes-monitoring-with-a-service-mesh/

[2]

Linkerd(一个开源的超轻服务网格): https://buoyant.io/2021/01/11/kubernetes-monitoring-with-a-service-mesh/linkerd.io

[3]

服务网格: https://buoyant.io/service-mesh-manifesto/

[4]

博文: https://copyconstruct.medium.com/monitoring-and-observability-8417d1952e1c

[5]

谷歌SRE书: https://sre.google/sre-book/monitoring-distributed-systems/#xref_monitoring_golden-signals

[6]

监控: https://sre.google/sre-book/monitoring-distributed-systems/

[7]

Linkerd入门指南: https://linkerd.io/2/getting-started

[8]

Linkerd发行页面: https://github.com/linkerd/linkerd2/releases/

[9]

文档: https://linkerd.io/2/tasks/adding-your-service/

[10]

Prometheus: https://prometheus.io/

[11]

可观察性: https://thenewstack.io/monitoring-vs-observability-whats-the-difference/

[12]

Linkerd可以帮助分布式跟踪: https://linkerd.io/2/features/distributed-tracing/

[13]

一个服务网格在分布式跟踪方面最终只能做这么多: https://linkerd.io/2019/08/09/service-mesh-distributed-tracing-myths/

[14]

在生产中调试Kubernetes服务: https://linkerd.io/2/tasks/debugging-your-service/

[15]

命令: https://linkerd.io/2/reference/cli/logs/

[16]

如何使用Prometheus和Linkerd来设置SLO的指南: https://buoyant.io/2020/10/21/kubernetes-slos-with-prometheus-linkerd/

[17]

立即注册抢先体验: https://buoyant.io/cloud