全栈工程师开发手册 (作者:栾鹏)
架构系列文章


目录

  • istio-opentracing链路追踪方案

  • envoy链路追踪

  • 初始化追踪

  • 跟踪上下文信息

  • istio链路追踪

  • 链路追踪参数

  • 采样率

  • jaeger

  • istio中jaeger现状

  • jaeger持久化存储

istio-opentracing链路追踪方案

istio-opentracing链路追踪主要是由sidecar(envoy)支持的,istio只是在上层进行配置的修改。

envoy链路追踪

envoy主要用三个功能来支撑系统范围内的跟踪

  • 生成Request ID: envoy会在需要的时候生成UUID,并操作名为[x-request-id]的HTTP Header。应用可以转发这个Header用于统一的记录和追踪。
  • 集成外部追踪服务: envoy支持可插件的外部跟踪可视化服务。目前支持LightStep、zipkin或者Zipkin兼容的后端(例如:jaeger).另外可自己添加其它的追踪服务。
  • 客户端跟踪ID连接: x-client-trace-id Header 可以用来把不信任的请求 ID 连接到受信的 x-request-id Header 上。

初始化追踪

有多种途劲初始化追踪

  • 外部客户端,使用x-client-trace-id Header。
  • 内部服务,使用x-envoy-force-trace Header。
  • 随机采用使用运行时设置: random_sampling。

跟踪上下文信息

不管使用的是哪个跟踪服务,都应该传播x-request-id,这样在被调用服务中启动相关性的记录。

  • 如果使用了 LightStep 跟踪器,在发送 HTTP 请求到其他服务,Envoy 依赖这个服务来传播 x-ot-span-context Header。
  • 如果使用的是 Zipkin,Envoy 要传播的是 B3 Header.(x-b3-traceid, x-b3-spanid, x-b3-parentspanid, x-b3-sampled,以及 x-b3-flags)也可以由外部客户端提出,用来启用或者禁用某个服务的跟踪请求。

istio链路追踪

链路追踪参数

istio链路追踪提供了全局配置zipkinAddress。istio的sidecar流量拦截后上报到链路系统,envoy的上报地址通过proxy_init的–zipkinAddress参数传入。由上面可知envoy的链路追踪主要的原生支持是jaeger。

istio的链路追踪并不能在sidecar中全部处理,是有侵入性的。业务需要存储几个特殊字段,在要调用下个服务时,把这几个字段带上。这样才能把整条链路串起来。具体可看上面的跟踪上下文信息,istio链路追踪例子。

mix模块中的telemetry和policy这两个的链路追踪是通过参数–trace_zipkin_url=http://zipkin.logging:9411/api/v1/spans 来配置的。

helm部署的时候
修改/value.yaml中 disablePolicyChecks为false, zipkin的address为"zipkin.logging:9411"
需改/charts/pilot/values.yaml:14:traceSampling: 1.0为100

采样率

链路的采样率istio中只提供了一个全局的配置,通过配置pilot的参数PILOT_TRACE_SAMPLING来控制,其范围是0.0-100.0,最小可配参数0.01,默认100。

修改方式:

  • helm安装时参数选项:pilot.traceSampling。
  • 生成的yaml文件中修改PILOT_TRACE_SAMPLING变量,重新apply。
  • 通过kubectl -n Istio-system edit deploy Istio-pilot修改PILOT_TRACE_SAMPLING变量。

jaeger

istio的tracing默认使用jaeger来实现日志追踪的发送,存储,查询。
先来看jaeger的架构图:

jaeger主要由以下几部分组成

  • jaeger-client为不同语言实现的OpenTracing标准的SDK.应用程序通过API写入数据,然后按照指定策略把trace传递给jaeger-agent.
  • agent是一个UDP中转服务,它将数据批量发送给collector.它是一个基础组件,布在所有机器上.
  • collector接收agent发送来的数据,然后将数据写入后端.collector是一个无状态组件,可以建任意数量.
  • data-store后端存储被设计成一个可插拔的组件.支持Cassandra和ElasticSearch.
  • query从存储中提取数据并通过UI展示.

istio中jaeger现状

istio目前官方自带的是all-in-one的镜像,所有的组件都包含在一个镜像中.数据的存储是存在内存中,pod删除或重启,所有的数据就全没有了.这没法线上使用.

为此,我们需要考虑将数据存储为指定的存储服务,采用官方自带的肯定不行,需要自己重新部署一套jaeger。

jaeger持久化存储

k8s部署jaeger

根据官方文档部署基于k8s的Jaeger的生产环境下的容器,这个要采用Production这个生成的部署方式。

这种方式的部署比较麻烦,需要对jaeger有一定的理解,对存储服务如ES都需要有一定的研究。因此这种试不推荐。

接入自己的ES服务

istio的链路追踪通过zipkin直接传输到jaeger-collector,jaeger-collector将数据发送到自己现有的ES集群进行存储,jaeger-query直接去现有ES集群查询。

链路追踪发送到jaeger-collector

如果不在同个namespace下,需要修改zipkin地址为jaeger的zipkin收集地址。envoy这个proxy会默认使用环境变量来设置zipkinAddress地址,默认地址是zipkin.istio-system:9411。可在yaml下查找zipkinAddress来修改,然后更新就可以。如果后继有helm update更新,需要去修改charts,在install/kubernetes/helm/istio//templates/configmap.yamlinstall/kubernetes/helm/istio//charts/mixer/templates 这两个下面的zipkin地址。 mix相关的trace_zipkin_url的zipkin也要改成对应的地址。

  • 修改istio的zipkin地址需要重新启动pod。
  • jaeger-agent这个服务,因为我们是直接配置到jaeger-collector因些不需要。
jaeger-collector到ES集群

这个官方的jaeger是支持发送到kafka,但由于jaeger会生成3个index(jaeger-span,jaeger-service,jager-dependencies),而kafka发送到ES时,要区分有点麻烦。暂时先直接发送到ES。

jaeger-query

这个配置只需将查询地址改为ES的地址。

jaeger-query的dependencies服务生成图需要自己配置spark-dependencies

线上例子

jaeger-collector的ES配置参数可通过下面来查看,jaeger-query的参数也是一样的

docker run \-e SPAN_STORAGE_TYPE=elasticsearch \jaegertracing/jaeger-collector:1.8 \--help

k8s jaeger的configmap

apiVersion: v1
kind: ConfigMap
metadata:name: jaeger-configurationnamespace: istio-systemlabels:app: jaegerjaeger-infra: configuration
data:span-storage-type: elasticsearchcollector: |es:server-urls: http://example1.com:9200,http://example2.com:9200index-prefix: online-opentracing collector:zipkin:http-port: 9411query: |es:server-urls: http://example1.com:9200,http://example2.com:9200index-prefix: online-opentracing

k8s jaeger-collector和jaeger-query

apiVersion: v1
kind: List
items:
- apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: jaeger-collectornamespace: istio-systemlabels:app: jaegerjaeger-infra: collector-deploymentspec:replicas: 3strategy:type: Recreatetemplate:metadata:labels:app: jaegerjaeger-infra: collector-podannotations:prometheus.io/scrape: "true"prometheus.io/port: "14268"spec:containers:- image: jaegertracing/jaeger-collector:1.8.2name: jaeger-collectorargs: ["--config-file=/conf/collector.yaml"]ports:- containerPort: 14267protocol: TCP- containerPort: 14268protocol: TCP- containerPort: 9411protocol: TCPreadinessProbe:httpGet:path: "/"port: 14269volumeMounts:- name: jaeger-configuration-volumemountPath: /confenv:- name: SPAN_STORAGE_TYPEvalueFrom:configMapKeyRef:name: jaeger-configurationkey: span-storage-typevolumes:- configMap:name: jaeger-configurationitems:- key: collectorpath: collector.yamlname: jaeger-configuration-volume
- apiVersion: v1kind: Servicemetadata:name: jaeger-collectornamespace: istio-systemlabels:app: jaegerjaeger-infra: collector-servicespec:ports:- name: jaeger-collector-tchannelport: 14267protocol: TCPtargetPort: 14267- name: jaeger-collector-httpport: 14268protocol: TCPtargetPort: 14268- name: jaeger-collector-zipkinport: 9411protocol: TCPtargetPort: 9411selector:jaeger-infra: collector-podtype: ClusterIP
- apiVersion: v1kind: Servicemetadata:name: zipkinnamespace: istio-systemlabels:app: jaegerjaeger-infra: zipkin-servicespec:ports:- name: jaeger-collector-zipkinport: 9411protocol: TCPtargetPort: 9411selector:jaeger-infra: collector-podtype: ClusterIP
- apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: jaeger-querynamespace: istio-systemlabels:app: jaegerjaeger-infra: query-deploymentspec:replicas: 1strategy:type: Recreatetemplate:metadata:labels:app: jaegerjaeger-infra: query-podannotations:prometheus.io/scrape: "true"prometheus.io/port: "16686"spec:containers:- image: jaegertracing/jaeger-query:1.8.2name: jaeger-queryargs: ["--config-file=/conf/query.yaml"]ports:- containerPort: 16686protocol: TCPreadinessProbe:httpGet:path: "/"port: 16687volumeMounts:- name: jaeger-configuration-volumemountPath: /confenv:- name: SPAN_STORAGE_TYPEvalueFrom:configMapKeyRef:name: jaeger-configurationkey: span-storage-typevolumes:- configMap:name: jaeger-configurationitems:- key: querypath: query.yamlname: jaeger-configuration-volume
- apiVersion: v1kind: Servicemetadata:name: jaeger-querynamespace: istio-systemlabels:app: jaegerjaeger-infra: query-servicespec:type: NodePortports:- name: jaeger-queryport: 80protocol: TCPtargetPort: 16686nodePort: 32686selector:jaeger-infra: query-pod

参考文档:

  • http://www.servicemesher.com/envoy/intro/arch_overview/tracing.html
  • https://istio.io/docs/tasks/telemetry/distributed-tracing/
  • https://www.jianshu.com/p/5a1422b190a2
  • https://www.jaegertracing.io/docs/1.8/
  • https://github.com/jaegertracing/jaeger-kubernetes

istio-opentracing链路追踪方案相关推荐

  1. skywalking与pinpoint全链路追踪方案对比

    由于公司目前有200多微服务,微服务之间的调用关系错综复杂,调用关系人工维护基本不可能实现,需要调研一套全链路追踪方案,初步调研之后选取了skywalking和pinpoint进行对比; 选取skyw ...

  2. PHP实现opentracing链路追踪

    码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071 代码地址:https://github.com/why444216978/opentracing-php-cli ...

  3. skywalking监控php,Skywalking PHP客户端编译安装 OpenTracing 链路追踪

    Skywalking PHP客户端 其实就是一个PHP扩展,按照官方说明来安装就行, 不要相信网上乱七八糟的说法,网上说需要安装report client我搞了半天没明白是啥, 问作者,作者回答不需要 ...

  4. jaeger链路追踪php,使用 Jaeger 完成服务间的链路追踪

    世上本没有路,走的人多了,便变成了路 -- 鲁迅 本次讨论的话题就是需要在各个服务之间踏出条"路",让 bug 有"路"可循. 至于为什么用 jaeger... ...

  5. 分布式链路追踪之SkyWalking

    一 链路追踪简介   在微服务架构中,一次请求往往涉及到多个模块,多个中间件,多台机器的相互协作才能完成.这一系列调用请求中,有些是串行的,有些是并行的,那么如何确定这个请求背后调用了哪些应用,哪些模 ...

  6. 前后端、多语言、跨云部署,全链路追踪到底有多难?

    作者|涯海 全链路追踪的价值 链路追踪的价值在于"关联",终端用户.后端应用.云端组件(数据库.消息等)共同构成了链路追踪的轨迹拓扑大图.这张拓扑覆盖的范围越广,链路追踪能够发挥的 ...

  7. 微服务链路追踪之zipkin搭建

    前言 微服务治理方案中,链路追踪是必修课,SpringCloud的组件其实使用很简单,生产环境中真正令人头疼的往往是软件维护,接口在微服务间的调用究竟哪个环节出现了问题,哪个环节耗时较长,这都是项目上 ...

  8. 「Java分享客栈」随时用随时翻:微服务链路追踪之zipkin搭建

    前言 微服务治理方案中,链路追踪是必修课,SpringCloud的组件其实使用很简单,生产环境中真正令人头疼的往往是软件维护,接口在微服务间的调用究竟哪个环节出现了问题,哪个环节耗时较长,这都是项目上 ...

  9. 基于 Istio 的全链路灰度方案探索和实践

    作者|曾宇星(宇曾) 审核&校对:曾宇星(宇曾) 编辑&排版:雯燕 背景 微服务软件架构下,业务新功能上线前搭建完整的一套测试系统进行验证是相当费人费时的事,随着所拆分出微服务数量的不 ...

最新文章

  1. 野火linux核心板原理图,野火_f429挑战者_核心板_原理图_v2 1.pdf
  2. centos7安装sql-server2017
  3. 应用程序框架实战二十一:DDD分层架构之仓储(介绍篇)
  4. python中api是指什么_python中API接口是什么
  5. 怎么一步步编写简单的PHP的Framework(五)
  6. 普通高中生水平就能干好的编程到底是不是高科技?
  7. 新风口?人造肉第一股表现强劲 股价累计上涨近600%
  8. 谷歌EfficientNet缩放模型,PyTorch实现出炉,登上GitHub热榜丨Demo可用
  9. 3D呈现transform-style(CSS3)
  10. 计算机网络—数据链路层设备与两种域的区别
  11. HDU1492/The number of divisors(约数) about Humble Numbers
  12. ScrollDown的基本操作
  13. JDK安装与环境变量配置(Win10)
  14. yolov5 烟雾和火焰检测
  15. 文本转语音通过语音合成标记语言(SSML)改进合成 知识点详解(1)
  16. 论文阅读:Bridging Knowledge Graph to Generate Scene Graph(ECCV20)
  17. 嘉兴 机器人仓库 菜鸟_菜鸟物流展示机器人仓库 提高物流运送效率
  18. Win11任务栏大小调整
  19. Python监听鼠标左键被点击,gogo,急停,
  20. 学习之响应式应用架构重构ReactiveX

热门文章

  1. 科大讯飞 语音识别 VB WIN10 X64 VS2017
  2. 微信小程序获取用户的头像和昵称
  3. java找出最高工资和下标_Java 8 lambda用于为每个部门选择最高薪资员工
  4. 【大数据编程笔记】大数据背景,案例,概念
  5. matlab二元一次方程求解_方程的计算机处理913_Matlab
  6. java jquery提交表单数据_[Java教程]jquery实现ajax提交表单信息
  7. C# 根据url获取文件流流
  8. gif 动态加载_搞笑GIF:这个游戏最大的成功就是失败!
  9. flutter持久化_【Flutter 实战】大量复杂数据持久化
  10. linux开启和关闭防火墙