一文教你如何在生产环境中在Kubernetes上部署Jaeger

作者 |  Dotan Horovit
翻译 | 火火酱~
责编 | 晋兆雨
出品 | CSDN云计算

日志、指标和跟踪是“可观察性”领域的三大支柱。最近几个月,随着OpenTelemetry标准化以及Jaeger开源项目从CNCF孵化项目中顺利毕业,分布式跟踪领域出现了很多创新。

根据DevOps Pulse最近的报告可知,在实施分布式跟踪时,有超过30%的人会选择使用Jaeger。许多公司都已经认识到:要想使系统获得更好的可观察性并解决各类性能问题(特别是在处理复杂的微服务体系结构时),实施分布式跟踪是非常有必要的。

就Jaeger而言,首先要检测你的代码,将跟踪发送给Jaeger。然后设置Jaeger后端来收集、处理并可视化追踪。在本文中,我将介绍如何在生产环境中部署和管理Jaeger后端,内容主要涵盖:

  • Jaeger安装组件

  • Jaeger使用的非Jaeger组件,例如后端存储

  • Jaeger Deployment部署策略, 特别是围绕生产系统的部署策略

  • 代理(Agent)vs. 无代理(Agentless)

  • agent安装方法:sidecar vs. DaemonSet

  • 安装工具:Manual、Operator、Helm chart

Jaeger 组件

在部署Jaeger Tracing时,我们需要用到以下组件:

  • 代理(Agent)组件与应用程序处于同一位置,用于在本地收集Jaeger跟踪数据。它负责Collector(见下文)的连接和流量控制以及数据丰富工作。

  • 收集器(Collector)是一个集中式集线器,从agent那收集跟踪信息,并发送到后端进行存储。collector可以在span上进行验证和丰富。

  • 查询(Query)检索跟踪并通过UI进行展示

当然,以上每个组件展开来讲的话都要讲上几天几夜,而且也有其他的Jaeger组件可供选择,但为了便于讨论,我们就不展开介绍了。在下文中,我们将深入了解一下如何在各种设置和策略中部署Agent、Collector和Query组件。

Jaeger使用的外部组件

根据部署策略的不同(详见下文),Jaeger可能会用到其他(非Jaeger)组件,主要是持久化后端存储(Elasticsearch、Cassandra或其他)和流式传输队列(Kafka)。这些服务通常都是独立部署的,你只需将Jaeger指向相关的端点即可,不过也可以让Jaeger自行提供这些服务。

部署策略

如果你想将Jaeger部署在多个不同的系统上(例如自己用于开发的笔记本电脑或者大规模和高负载生产环境)的话,这里有一些可供选择的部署策略:

  • jaegertracing All-in-One:该设置易于部署,非常适合试用产品、开发和演示使用。你可以将其作为预打包的二进制文件或Docker镜像运行。它所有服务与内存存储都被打包并部署在一个副本中。

  • Production:专注于高可用性和可扩展性的生产环境需求。所有后端服务都进行独立部署,并支持多个副本和扩展选项。它还使用持久化后端存储来保持跟踪数据的弹性。目前它支持Elasticsearch和Cassandra存储解决方案,并将Elasticsearch作为生产环境的推荐解决方案。

  • Streaming:对于高负载环境而言,这种设置可以将Kafka添加到生产部署策略中,从而减轻后端存储的压力。如果你需要在跟踪上运行后处理逻辑的话,它在写入存储之前便可以轻松执行。

该一体式设置很容易上手,并且附带了捆绑包。如果你想试用一下的话,可以参阅下方教程,了解如何将其与Elasticsearch后端以及Kibana结合使用。

(教程链接:

https://logz.io/blog/jaeger-and-the-elk-stack/?ref=hackernoon.com

接下来,我将重点介绍生产环境的部署,以及在这个过程中需要考虑的事情和选择。

Jaeger可以在无代理(agentless)情况下运行吗?

agent需要驻留在应用程序的实例中。如果你运行着复杂的微服务架构,需要多个agent的话,或许会想了解Jaeger是否可以在无代理的情况下运行。

简而言之:不要这样做。

从技术上展开来讲,我们确实可以让Jaeger客户端库直接将span数据发送到Collector,但是这需要我们自己来处理各方面的问题,如collector的查找、流量控制、以及根据本地系统信息用附加元数据标记span。

虽然推荐使用Jaeger Agent进行部署,但在某些情况下是不能部署agent的。例如,如果你的应用程序以AWS lambda函数或类似的无服务器框架方式运行,无法控制pod部署和agent共存的话,就不能部署agent。如果使用Zipkin的话,agent也是无效的。在这种情况下,应该将span直接提交给Jaeger Collector。

Jaeger Agent 安装方法

agent需要与应用程序放在一起,这样Jaeger客户端库便可以在localhost上对其进行访问,并通过UDP向它发送数据,而不必承担因网络中断而导致数据丢失的风险(与TCP不同,UDP传输协议中不包含数据丢失保护,但也因此更快、更经济)。

要在Kubernetes环境中实现这一点可以采取两种方法:sidecar或daemonset。下面我们一个个来看:

DaemonSet

以DeamonSet方式来安装agent是最简单,也是最经济的选择。该方法会在节点上提供一个Agent实例,为该节点上的所有pods提供服务。

但是,对于涉及多租户、安全隔离需求或针对不同应用程序的多个Jaeger实例的生产环境来说,这种策略可能过于简单。在这种情况下,你可以考虑以Sidecar模式进行部署。

Sidecar

这种方法是将agent作为各个pod的附加容器运行。此设置可以支持多租户环境,其中每个租户都有各自的Jaeger Collector,并且可以配置agent将其发送到相关的Collector。

你还可以对内存分配进行调控,防止特定租户占用内存。在同一个pod中运行时,安全性配置则更简单。sidecar方法自带额外容器。一些安装工具可以自动注入agent sidecar并简化管理。

Jaeger安装工具

既然我们已经了解了需要部署的组件以及策略,那下面就来看一下有哪些工具可以帮助我们将计划付诸实践吧:

  • 手动使用kubectl:如果你想快速入门,又不想为自动化而烦恼的话,这应该很适合你。但对于生产部署来说,还是不太建议这样做。这是Jaeger社区推荐的官方方式,下方链接中提供了完善的YAML模板。然而,它已于2020年5月被弃用。手动执行的另一选择是使用Jaeger Operator生成静态清单文件:运行Jaeger Operator generate生成YAML,然后运行kubectl apply将其手动应用到你的环境中。该功能目前尚处于实验阶段,因此使用时需要十分谨慎。

    (链接:

    https://github.com/jaegertracing/jaeger-kubernetes?ref=hackernoon.com

  • Kubernetes Operator:Jaeger Operator让Kubernetes实现了热门的Operator模式,因此你可以让指定的Controller作为自定义资源管理Jaeger后端。它将默认部署Jaeger Agent为sidecar。如果你在集群中运行控制器的话,Jaeger Operator还可以自动注入Jaeger Agent sidecar,省去了手动定义的麻烦。你还可以将agent策略设置为DaemonSet。需要注意的是,Jaeger Operator在使用基于gRPC插件的外部持久化存储时的表现似乎差强人意。如果你属于此类情况的话,或许可以试一试Helm。更多详细信息请参阅下方Jaeger Operator repo链接。

    (Jaeger Operator repo:

    https://github.com/jaegertracing/jaeger-operator?ref=hackernoon.com

  • Helm Chart:它具备完整程序包管理器的优点,如果你使用Helm来管理生产环境中的其他应用程序(如Jaeger使用的持久化存储)的话,那么它将是你不二之选。你可以在下方链接中找到官方的Jaeger图表,但需要注意它仍然是测试版。它将默认以DaemonSet方式来安装Jaeger Agent。此外,你也可以使用Helm来安装Jaeger Operator。

    (链接:

    https://github.com/jaegertracing/helm-charts?ref=hackernoon.com

用Jaeger tracing接收Zipkin Trace

至此,我们一直都在讨论Jaeger span。但其实有很多系统使用的都是Zipkin instrumentation,因此需要注意,Jaeger同样也接受Zipkin格式的span,即Thrift、JSON v1/v2和Protobuf。

如果你Jaeger后端部署的目的是接收Zipkin协议的话:

  • Jaeger Agent与收集Zipkin span无关。

  • 你的Zipkin instrumentation 应该直接将Zipkin span发送给Jaeger Collector。Zipkin span可以通过POST请求提交到以下RESTful端点:

    /api/v1/spans for Zipkin JSON v1 或 Zipkin Thrift
    /api/v2/spans for Zipkin JSON v2
  • 将Jaeger Collector配置为在指定的HTTP端口上接收Zipkin span,标志是–collector.zipkin.http-port=9411(Zipkin collector使用9411端口)。

结语

Jaeger是Kubernetes领域中的新项目,强大的社区为Kubernetes部署提供了最佳的实践和自动化。但是,作为一个年轻项目,它在生产环境中的使用和效果仍在不断优化完善。我们在应用时,要紧跟社区更新,并且多方考量,找到最适合自己需求的运行方式。

原文链接:https://hackernoon.com/a-guide-to-deploying-jaeger-on-kubernetes-in-production-0p2n3tub

本文由CSDN云计算翻译,转载请注明出处

更多阅读推荐

  • 如何在SQL Server 2019中添加数据敏感度分类的命令

  • 深度揭秘:腾讯存储技术发展史

  • 荷兰政府用大数据预测天气预防自然灾害,他们是怎么做的?

  • 有了图分析,可解释的AI还远吗?

  • 互联网人的求生战役!分享身边的 5 个故事

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇讲透如何理解数据库并发控制

01数据库并发控制的作用 1.1 事务的概念 在介绍并发控制前,首先需要了解事务。数据库提供了增删改查等几种基础操作,用户可以灵活地组合这几种操作,实现复杂的语义。在很多场景下,用户希望一组操作可以做为一个整体一起生效&…

工作簿长时间空闲时自动关闭

目录 1. 对关闭时间和关闭工作薄进行设置2. 利用 OnTime 方法对执行程序进行设置3. 对工作薄的变化进行设置1. 对关闭时间和关闭工作薄进行设置 在新建模块中声明一个时间作为全局的变量,该变量将是每次工作薄发生改变后延续的时间,另外再设置一个工作薄关闭的过程。 代码如…

打钱!我的数据库被黑客勒索了!

来源 | 小白学黑客责编 | 晋兆雨头图 | 付费下载于视觉中国数据库失陷昨天晚上,读者群里一位小伙伴发消息说自己的数据库被黑了,搞安全的我自然是立刻来了兴趣,加班加点开始分析起来,不知道的还以为我要熬夜等剁手节呢。这位小伙伴…

uni-app集成uview

文章目录一、uni_modules方式1. 创建uni-app项目2. 安装uview3. 安装SCSS插件二、配置步骤2.1. 引入uView主JS库2.2. 引入主题文件2.3. 引入uView基础样式2.4. 配置easycom组件模式2.5. 实战三、zip方式3.1. 创建uni-app项目3.2. 下载uview3.3. 解压重命名3.4. 拷贝UI3.5. 安装…

阿里云飞天洛神2.0:高性能网络软硬一体化技术实践

云网络架构 云计算从9年前被质疑为新瓶装旧酒,到经过多年的高速发展,正在成为水电煤一样的基础设施。云网络构建在物理网络之上,为云计算提供灵动、智能的网络连接。云网络的性能和稳定性是云计算的基石。 VPC是云网络的基础,VP…

作为后端开发如何设计数据库系列文章 设计SaaS系统表结构

在公司做了一年的SaaS内核系统,但是有些东西不知道能不能透露出来。我尽量在不透露一些敏感东西的情况下(这个度我无法把控,只能是笼统了),将某些关于数据库方面的精髓传递出来。如果表达不畅,请谅解。 前…

重学 VBA - 基础与实战篇(含正则表达式)

目录 前置内容1. 单元格对象属性与方法1.1 查找最后的行、列1.1.1 End 属性1.1.2 SpecialCells 和 UsedRange1.1.3 Find 方法1.1.4 四种方法属性效果比较1.2 多重循环(案例)1.2.1 实现数据之间的匹配(不同列)1.2.2 实现数据之间的匹配(同列)1.2.3 排序 - 简单选择排序法1…

js 时间比较大小

const startTime parseInt(this.timeValue.replace(:, ));const endTime parseInt(this.timeValue2.replace(:, ));//进行比较if (startTime > endTime) {//添加校验提示console.log("startTime>endTime")} else {console.log("startTime<endTime&qu…

新一轮支付革命,利楚扫呗的数据库优化之路

中国移动支付市场崛起过程中&#xff0c;第三方、第四方等非银行支付机构在2017年至2019年之间&#xff0c;把移动支付交易量从300多亿笔拉升至近1800亿笔&#xff0c;充分彰显以扫码支付为代表的移动支付革命引领一时风潮。 利楚扫呗作为华中地区领先的金融收单企业也是其中一…

IM、RTC技术两生花,看融云如何打造“IM+RTC+Push”一站式通信云服务

11月9日&#xff0c;融云宣布完成数亿元人民币的D轮融资。从李佳琦和明星扎堆的电商直播&#xff0c;到疫情期间在线教育的全面普及&#xff0c;再到5G技术进入商用&#xff0c;实时音视频技术&#xff08;Real-Time Communication&#xff0c;以下简称RTC&#xff09;迎来了全…

Nginx实现通过不同的url前缀访问不同的前后端项目

&#xff0c;所以目前就可以通过给网页访问链接增加不同的url前缀&#xff0c;来让Nginx去实现同一端口下访问不同的前后端项目。具体配置如下&#xff1a; &#xff08;我这里是前端两个项目各自对应后端的两个服务&#xff09; server {#这里默认监听80端口&#xff0c;可根…

阿里云助力浙江大学信息化建设,以实时数据驱动校园智能管理

随着网络信息化技术的不断进步&#xff0c;就我国高校而言&#xff0c;传统的学习和生活模式已无法满足学生的需求&#xff1b;老机房堆硬件的建设&#xff0c;给信息化深度建设的管理和运维工作人员造成了巨大的麻烦。这些因素促使各所高校对校园智能管理的需求日益剧增。 20…

1 元秒杀 1000+ 册爆款电子书,错过再等一年!

wow代码人们让钱包瑟瑟发抖的双十一已经来啦与此同时码不停蹄地向你奔赴而来的还有 CSDN 为你准备的???? 1 元秒杀 ????价值 3.5 万元的爆款电子书限时特惠&#xff0c;仅需 1 元你&#xff0c;准备好了吗仅限 1000 人速领????????????错过悔10年系列好书

vue 单独页面定时器 离开页面销毁定时器

data: {return {timer: null} }, created() {this.timer setInterval(....); }, beforeDestroy() {if(this.timer) { //如果定时器还在运行 或者直接关闭&#xff0c;不用判断clearInterval(this.timer); //关闭} }

谊品生鲜:放弃传统数据库架构,全站上阿里云

疫情之下&#xff0c;生鲜电商的订单突然暴涨。 社区生鲜龙头企业谊品生鲜就是一个典型代表。它的在线交易量激增&#xff0c;日订单量超过10万单。 对电商企业而言&#xff0c;这对业务是个巨大的好消息&#xff1b;但对于IT、对于谊品生鲜的核心业务系统则是一个巨大的挑战…

教你一招,如何解决 “这台电脑无法运行 Windows 11” 的问题

目录1. 系统兼容性检测2. 为什么我的电脑不能运行Windows 11&#xff1f;3. 最低系统要求4. 如何开启 TPM 受信任模块5. 微软坚持最低要求的理由6. 最新补充6.1 更新支持的 CPU 列表6.2 旧电脑也能安装 Windows 11&#xff0c;但后果自负微软于 6.24 正式推出了全新的 Windows …

Flink SQL 的 9 个示例

作者&#xff1a;贺小令&#xff08;晓令&#xff09; 本文由阿里巴巴技术专家贺小令分享&#xff0c;社区志愿者郑仲尼整理。文章基于 Flink 1.9 版本&#xff0c;从用户的角度来讲解 Flink 1.9 版本中 SQL 相关原理及部分功能变更&#xff0c;希望对大家有所帮助。主要内容分…

如何破解“中国开源拿来主义”?包云岗的几点分析

作者 | 包云岗责编 | 王晓曼本文经作者授权转载自包云岗知乎以下视频是2011-2019期间全世界开源代码贡献最多的城市排名&#xff1a;旧金山一骑绝尘&#xff0c;其他主要是美欧城市&#xff1b;亚洲有东京、首尔上榜&#xff1b;莫斯科也贡献突出。但是&#xff0c;很遗憾没有中…

uni-app获取腾讯地图计算两经纬度的实际距离(可批量)

地址 https://lbs.qq.com/service/webService/webServiceGuide/webServiceDistance getDistance() {uni.request({url: https://apis.map.qq.com/ws/distance/v1/matrix, //仅为示例&#xff0c;并非真实接口地址。method: GET,data: {mode: walking,from: 39.071510,117.190…

JavaScript 常用工具函数

目录 1. 为元素添加 on 方法2. 为元素添加trigger方法3. 转义 HTML 标签4. HTML 标签转义5. 跨浏览器绑定事件5. 加入收藏夹7. 提取页面代码中所有网址8. 动态加载脚本文件9. 返回顶部的通用方法10. 实现base64解码11. 确认是否是键盘有效输入值12. 全角半角转换13. 版本对比14…