分布于跟踪Istio



我们的编辑人员提供的译文说明:所提供的文章描述了特定公司的封闭产品,但不幸的是,没有证据表明有计划开放该产品-从Stallman的角度来说。 但是,在我们看来,考虑人们通常如何处理Istio调试问题以及他们如何优化该领域的工作对我们来说非常重要且有用。 也许有人可以为自己画出一些有趣的想法。

在某个时候,在开发基于微服务架构的生产系统时,我们得出的结论是,监视服务的每个单独元素不足以解决严重问题。 随着时间的流逝,需要同时获得整个应用程序中整个调用堆栈的完整图片,以及有关请求拓扑,网络延迟和单个命令持续时间的详细信息。 为了解决此问题,工程师通常求助于分布式跟踪。

在这篇文章中,将通过微服务架构的角度来研究分布式跟踪的概念:如何通过Istio进行集成和自动化,然后通过Istio的服务产品Backyards简化和处理整个过程。

参赛作品


此前, 我们写了一篇关于它多么复杂可以很容易安装和配置Istio,所以简化这种情况下,我们选择了开源开发云Istio万岁 。 除了Istio,您还可以在Helm中使用许多方便的工具( PrometheusGrafanaJaegerKiali ),无论如何, 大多数支持/集成请求都是针对他们的。 由于我们相信每个人都可以选择自己喜欢的工具 ,因此我们并未在Istio中严格实施这些工具,而只是提供了轻松集成这些组件的能力。

另外,我们想为用户提供另一个强大的工具来管理集群中列出的组件(即Istio以外的其他组件),因此我们还创建了Backyards 。 借助它,您可以轻松地安装Prometheus,Grafana和Jaeger,并且与Kiali不同,Backyards不仅是基于Web的监视界面,而且是用于管理服务网络的功能齐全的多功能工具。 它一次与一个或几个群集兼容,并包含一个强大的CLI和GraphQL API。

在本文中,我们将重点介绍分布式跟踪和Jaeger。

分布式跟踪简介


在微服务的体系结构中,当多个服务同时调用时,通常很难发现和调试问题。 实际上,此语句中包含服务请求效率低的主要原因:哪个服务已成为瓶颈,请求之间的网络延迟有多大?

借助分布式跟踪,您可以可视化完整的呼叫树,查看哪个服务访问了哪个服务,每个呼叫花费多长时间以及应答延迟是多少。 分布式跟踪可以帮助确定故障发生在哪里以及哪个服务超出响应时间。
分布式跟踪是在系统内整个调用堆栈中跟踪单个请求的过程。


如果不使用分布式跟踪,就很容易在微服务之间交换的许多调用中迷失方向。 没有它,调试问题也很困难,因为您只需要依靠日志即可。 但是由于有了分布式跟踪,所以可以使用整个呼叫堆栈以及诊断问题所需的所有信息。

在分布式跟踪的幕后


跨度是分布式跟踪中的最小单位。 她具有标签“开始”和“持续时间”。 Span彼此具有亲子关系,并一起形成Trace。

正确收集跟踪信息的三个任务

1. Incoming request spans 2. Outgoing request spans 3. Context propagation 

 传入请求范围: 
当请求到达服务时,必须检查该请求是否包含跟踪头。 如果没有头,则有必要创建一个根(父)范围以开始跟踪,如果是,则创建一个子范围以继续跟踪。

 发出请求的范围: 
当请求从一个服务发送到另一个服务时,首先会创建一个跨度,因此接收请求的一方会继续进行跟踪,如上所述。

 上下文传播: 
服务通常一次接收和发送多个请求。 如果不进行任何更改,就无法跟踪传入和传出请求之间的连接。 这是传达上下文的最佳时机。 对于HTTP,可以通过将传入呼叫的​​跟踪标头传递给应用程序的传出呼叫来完成,这将允许您构建完整的跟踪。

除这些任务外,还应收集,分组和完美地显示迹线。

所有这些看起来似乎很复杂,无法在系统内的所有服务上实现,但是有些工具可让您解决自动模式下描述的几乎所有任务。 因此,开发人员实际上可以立即进行分布式跟踪。

有关分布式跟踪基本原理的更多信息,我建议阅读Nike的这篇精彩文章

Istio中的分布式跟踪


在Istio中,Envoy代理完成了分布式跟踪的工作。 在边车是本Istio注入,通过这些所有传入和传出请求向/从服务首先通过代理服务器特使。 正是在这个阶段,生成父级和子级跟踪,这是创建分布式跟踪的三个必要条件中的前两个。

第三个条件-上下文的传递-必须通过更改应用程序逻辑来执行。 在Istio Bookinfo中,已经在每个微服务级别实现了此功能,因此在安装后可以立即获取完整的跟踪。 在自己的服务中使用分布式跟踪时,您需要自己实现上下文传播

与一些常见的误解相反,值得注意的是即使在常规服务网格级别,也只能通过更改应用程序逻辑来创建对具有上下文传播的分布式跟踪的完全支持。 警告1中提供了一个很好的例子。

Istio网站上有关于使用哪些标题的文档 。 所有这些都与Zipkin标头格式兼容。
请注意,除上述追查基于特使 ,在Istio有基于混频器的跟踪 ,这是积极利用混频器组件。 也许,在后续版本支持调音台将被停止,这样细致的工作,我就不一一介绍了。 只能说操作员可以感觉到混频器遥测
使用Envoy并分发我们所需的跟踪头,就可以获取所需的跟踪。 为了收集和可视化此信息,Istio附带了JaegerZipkinLightstepDatadog工具 。 默认情况下,使用Jaeger,它也是列出的所有工具中最受欢迎的工具。

我们还可以调整采样率,也就是,有多大比例的所有请求都将在轨道的形式呈现。 默认值为请求总数的1%。 可以在Istio运算符的此字段中更改频率。

在Istio中如何运作


让我们总结一下如何使用Jaeger进行分布式跟踪(之后我们将其与Backyards中的相同过程进行比较):

  1. 与Istio一起,可以为Jaeger提供所有必要的服务和部署。
  2. 默认情况下,跟踪服务的地址是由Envoy代理的配置设置的,并通过它们来生成跨度报告和Sidecar服务。
  3. 可以在所有服务将其头标题分配给跟踪之前安装Bookinfo
  4. 收集到足够的信息后,跟踪将变为可用。
  5. 积控制面板可通过浏览器被重定向到用户的开口部。

后院的分布式跟踪


在后院安装,配置积,演示应用程序安装到自动分发道头和发送这一切的压力 - 一切都与一个简单的命令来完成! 在将服务与轨道彼此链接之后,所有这些都可以从用户界面获得。

现在来看看!

创建集群
好吧,对于初学者来说,我们需要在Kubernetes中创建一个集群。 我通过面向开发人员的免费版本的Pipeline在GKE上提升了Kubernetes集群。 如果要执行相同的操作,请通过管道在我们支持的五个云提供商中的任何一个上创建集群。 否则,将Kubernetes集群提升到其他位置。

在后院如何运作
早些时候,我们把小计是积可以与Istio一起使用。 现在,让我们比较一下后院的一切情况。

现在,在新群集上安装Istio,Backyards和演示应用程序的最简单方法是使用Backyards命令行界面

您只需要输入一个命令(您的集群上应该是
  KUBECONFIG): 


 $backyards install –a –run-demo 

  1. 使用此命令,将自动安装Jaeger(而不是使用我们的开源Istio操作员和Backyards组件)。
  2. 如前所述,Istio可以立即与Prometheus,Grafana或Jaeger等其他组件集成。 安装Jaeger后,其服务地址在操作员的用户窗口中设置。 将来,此地址将写在控制Istio组件和数据流所需的每个位置。
  3. 演示应用程序也是默认安装的。 它使用已经配置为分发必要的跟踪标头的golang服务。
  4. 开始自动加载演示应用程序(因此带有--run-demo标志),因此您可以立即开始跟踪轨道。
  5. Jaeger通过输入网关打开,它与UI链接,并且可以以方案的形式和列表的形式自动使用。

从字面上看,这就像编写团队来创建新的Kubernetes集群一样简单,因此如果需要,请尝试一下!

这是您将看到的:

积,zalinkovanny的方案:



这里是一个列表:



用于演示应用程序的Jaeger UI:





在用户界面中,您可以看到微服务系统中的整个调用堆栈。 现在,你可以跟踪,当它由根要求,多久了每个rekvest推出。 或者,例如,你可以看到分析服务的大部分时间花在了一些具体要求为繁忙的实际计算(例如,计算Pi值)。

清洁用品
要从集群中删除演示应用程序,Backyards和Istio,您只需要一个团队。 她将负责按照正确的顺序卸下所有组件:

 $ backyards uninstall -a 

总结


分布式跟踪主要对于需要解决任何困难或问题的现有分布式系统来说是必需的。 我们的运营商Istio仅专注于管理,因为Backyards包含许多可以在工作中使用的组件。 例如,这就是Jaeger,它开箱即可提供进行分布式跟踪的功能。

在这种情况下,Jaeger是使用Backyards安装的,后院直接在界面中显示系统中Jaeger的所有链接和踪迹!

追踪一下!

Source: https://habr.com/ru/post/zh-CN472318/


All Articles