专栏首页CNCFKubernetes上的OpenTracing - 轻松获取你的追踪

Kubernetes上的OpenTracing - 轻松获取你的追踪

作者:Matthew Lucas

追踪你现有的java应用程序,而不需要修改一行代码

自从我第一次摆弄Istio - 一个运行在K8s上的智能服务网格 - 我就被它的自动注入功能吸引住了。轻弹开关,Istio就会分散在你现有的部署中,为你提供梦幻般的服务网格能力,而无需修改、重新打包或以任何方式重新部署你现有的应用程序。

稍微解释一下这个过程,Istio使用了Kubernetes的一个特性,名为“Mutating Admission Webhooks”。这些比听起来要简单得多。在部署资源时,K8s将向所有活跃的webhook发送正在执行的操作的YAML表示。这些服务可以根据需要编辑部署 — 添加卷、调整环境变量、检查参数等等。

https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#mutatingadmissionwebhook

为什么在乎?- 因为OpenTracing,这就是原因!

OpenTracing是什么?

OpenTracing是一个为分布式追踪启用可复用的、开放源码的、厂商中立的工具的倡议。事实上,OpenTracing本身正在成为一个更大的项目OpenTelemetry的一部分,但那是另一个事情了。

追踪是什么?单个追踪表示请求跳过应用程序中的服务后留下的足迹。它为你提供关于任何HTTP请求、数据库调用或你可能设置的其他范围的详细信息。它可以作为一种有用的工具来理解你流量的形状,并发现/调试跨一套微服务的任何瓶颈。

这与webhook有什么关系?首先,连接追踪是需要进行少量的开发。除非你在你的平台上测试所有的应用程序,价值是有限的,而如果你有10+微服务,这种努力可以很快增加。如果你能在大量投入之前试一下,就像你用Istio做的那样轻按一下开关,那不是很好吗?

本文的其余部分只解释了这个特性 — 至少对于Java应用程序是这样 — 以及它是如何结合在一起的。

特殊代理

在opentracing-contrib项目中发现的宝藏有一个Java特殊代理。通过使用-javaagent JVM标记将其插入到我们的应用程序中,我们可以完全启用跨任何常用第三方库的追踪,而无需更改任何代码或重新构建项目。测仪库的列表非常全面 - Jersey、Cassandra驱动程序、MongoDB驱动程序等等。

https://github.com/opentracing-contrib/java-specialagent

https://github.com/opentracing-contrib/java-specialagent#44-instrumentation-plugin

这里我们要做的是在部署时使用webhook、init容器和调整环境变量的组合来自动插入代理。

自动追踪webhook

完整的源代码在这里,但简单来说,webhook将:

https://github.com/lucas-matt/auto-tracing-webhook/blob/master/webhook.py

  1. 检查传入的部署描述以获得标记(autotrace: enabled)。如果存在,它将继续应用步骤2,否则它将保持一切不变。
  2. 添加一个卷挂载,opentracing特殊代理jar将被放入其中。
  3. 添加一个init容器,以便在应用程序启动之前将jar复制到共享挂载中。
  4. 调整JAVA_TOOL_OPTIONS环境变量以添加代理的javaagent行。

部署这一切

首先,确保Jaeger在你的默认命名空间中运行 - 可以简单执行:

kubectl apply -f https://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml

接下来是webhook本身。它的源代码在这里:webhook.yaml。

https://raw.githubusercontent.com/lucas-matt/auto-tracing-webhook/master/webhook.yml

kubectl apply -f webhook.yml

最后,确保你标记了目标命名空间,以便webhook在内部的任何部署中都能被激活。

kubectl label namespace default autotrace=enabled

到目前为止,我们已经完成了。

尝试

让我们快速浏览一下解决方案。我们需要演示跨多个服务的请求,以显示追踪工作良好,端到端。

Deployment.yml创建了一个服务链A、B和C。A调用B,B调用C,C调用上游的world clock API。默认情况下,每个服务都是完全不受追踪的Spring Boot应用程序。

https://raw.githubusercontent.com/lucas-matt/pass-the-buck/master/deployment.yml

http://worldclockapi.com/api/json/gmt/now

每个服务都使用autotrace: enabled标签进行标记,以便我们的webhook知道在部署时将插装注入到应用程序中。

spec:
  replicas: 1
  selector:
    matchLabels:
      app: service-a
  template:
    metadata:
      name: service-a
      labels:
        app: service-a
        autotrace: enabled

‍在端口转发service-a之后,剩下的就是发出请求。

到目前为止一切顺利 - 我们得到了时间 - 但主要的问题是,它被追踪了吗?是时候检查Jaeger了:

成功!我们可以看到请求是如何沿着每个服务移动到web上的。

结论

这当前状态不是我在生产环境中使用的的解决方案 - 首先,未调优的应用程序启动性能被降级,代理扫描classpath以寻找它可以插入自己的完整库集 - 但这仍然是一个有趣的实验。

如果你对OpenTracing感兴趣,或者对如何创建你自己的Kubernetes webhook感兴趣,请看看源码库中的一些例子:

  • https://github.com/lucas-matt/auto-tracing-webhook
  • https://github.com/lucas-matt/pass-the-buck

本文分享自微信公众号 - CNCF(lf_cncf),作者:OpenTracing

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 案例研究:Kubernetes带给uSwitch生产力和文化的转型

    在内部,这些垂直领域转化为分散的技术基础设施。团队 - 围绕市场组织他们的应用程序价格比较 - 运行所有他们自己的AWS基础设施,并负责配置负载平衡器、EC2实...

    CNCF
  • Virtual Kubelet项目

    说明:Virtual Kubelet(VK)是一个开源的Kubernetes kubelet实现,将Kubernetes连接到其他API,伪装成一个kubele...

    CNCF
  • 使用容器和Kubernetes来提高异常检测的效率

    与容器生态系统的成熟同时出现的还有Kubernetes,它是运行容器化应用程序编排器的实际标准。这种新的声明式和不可变的工作负载设计,为检测和响应的全新操作模型...

    CNCF
  • 每周学点大数据 | No.66 “Hello World”程序—— WordCount(下)

    NO.66 “Hello World”程序—— WordCount 接下来把输入文件从磁盘放入 HDFS 中。首先我们来看看 HDFS 的常用命令。 可以使用...

    灯塔大数据
  • 1小时上手MaskRCNN·Keras开源实战 | 深度应用

    MaskRCNN 是何恺明基于以往的 faster rcnn 架构提出的新的卷积网络,一举完成了 object instance segmentation。该方...

    AI科技大本营
  • 腾讯出品!这个免费网盘小程序,让你快速「找私货」| 亲儿子 #17

    在 2017 年 1 月 16 日前,腾讯微云为每个帐号分配了非常大的网盘容量,很多人都用它来当照片、文件等的「仓库」。

    知晓君
  • Linux调整Swap大小

    关闭swap swapoff -a 1.创建交换分区的文件:增加2G大小的交换分区 dd if=/dev/zero of=/var/swapfile bs=1M...

    苦咖啡
  • Kotlin Array 创建、增、删、改、查、插入

    码脑
  • 用C++实现强化学习,速度不亚于Python,这里有个框架可用

    一位名叫Isaac Poulton的英国小哥,开源了一个名为CppRL的C++强化学习框架。

    量子位
  • MIT 发明“雾中看车”新成像系统,雾天自动驾驶表现比人类更好

    新智元

扫码关注云+社区

领取腾讯云代金券