istio-opentracing链路追踪方案
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:9411/api/v1/spans 来配置的。
采样率
链路的采样率istio中只提供了一个全局的配置,通过配置pilot的参数PILOT_TRACE_SAMPLING来控制,其范围是0.0-100.0,最小可配参数0.01,默认100。
修改方式:
- helm安装时参数选项:[pilot.traceSampling](https://istio.io/docs通过kubectl -n Istio-system edit deploy Istio-pilot修改PILOT_TRACE_SAMPLING变量。/reference/config/installation-options/)。
- 生成的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.yaml 和 install/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-configuration
namespace: istio-system
labels:
app: jaeger
jaeger-infra: configuration
data:
span-storage-type: elasticsearch
collector: |
es:
server-urls: http://example1.com:9200,http://example2.com:9200
index-prefix: online-opentracing
collector:
zipkin:
http-port: 9411
query: |
es:
server-urls: http://example1.com:9200,http://example2.com:9200
index-prefix: online-opentracing
k8s jaeger-collector和jaeger-query
apiVersion: v1
kind: List
items:
- apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jaeger-collector
namespace: istio-system
labels:
app: jaeger
jaeger-infra: collector-deployment
spec:
replicas: 3
strategy:
type: Recreate
template:
metadata:
labels:
app: jaeger
jaeger-infra: collector-pod
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "14268"
spec:
containers:
- image: jaegertracing/jaeger-collector:1.8.2
name: jaeger-collector
args: ["--config-file=/conf/collector.yaml"]
ports:
- containerPort: 14267
protocol: TCP
- containerPort: 14268
protocol: TCP
- containerPort: 9411
protocol: TCP
readinessProbe:
httpGet:
path: "/"
port: 14269
volumeMounts:
- name: jaeger-configuration-volume
mountPath: /conf
env:
- name: SPAN_STORAGE_TYPE
valueFrom:
configMapKeyRef:
name: jaeger-configuration
key: span-storage-type
volumes:
- configMap:
name: jaeger-configuration
items:
- key: collector
path: collector.yaml
name: jaeger-configuration-volume
- apiVersion: v1
kind: Service
metadata:
name: jaeger-collector
namespace: istio-system
labels:
app: jaeger
jaeger-infra: collector-service
spec:
ports:
- name: jaeger-collector-tchannel
port: 14267
protocol: TCP
targetPort: 14267
- name: jaeger-collector-http
port: 14268
protocol: TCP
targetPort: 14268
- name: jaeger-collector-zipkin
port: 9411
protocol: TCP
targetPort: 9411
selector:
jaeger-infra: collector-pod
type: ClusterIP
- apiVersion: v1
kind: Service
metadata:
name: zipkin
namespace: istio-system
labels:
app: jaeger
jaeger-infra: zipkin-service
spec:
ports:
- name: jaeger-collector-zipkin
port: 9411
protocol: TCP
targetPort: 9411
selector:
jaeger-infra: collector-pod
type: ClusterIP
- apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jaeger-query
namespace: istio-system
labels:
app: jaeger
jaeger-infra: query-deployment
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: jaeger
jaeger-infra: query-pod
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "16686"
spec:
containers:
- image: jaegertracing/jaeger-query:1.8.2
name: jaeger-query
args: ["--config-file=/conf/query.yaml"]
ports:
- containerPort: 16686
protocol: TCP
readinessProbe:
httpGet:
path: "/"
port: 16687
volumeMounts:
- name: jaeger-configuration-volume
mountPath: /conf
env:
- name: SPAN_STORAGE_TYPE
valueFrom:
configMapKeyRef:
name: jaeger-configuration
key: span-storage-type
volumes:
- configMap:
name: jaeger-configuration
items:
- key: query
path: query.yaml
name: jaeger-configuration-volume
- apiVersion: v1
kind: Service
metadata:
name: jaeger-query
namespace: istio-system
labels:
app: jaeger
jaeger-infra: query-service
spec:
type: NodePort
ports:
- name: jaeger-query
port: 80
protocol: TCP
targetPort: 16686
nodePort: 32686
selector:
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链路追踪方案的更多相关文章
- skywalking与pinpoint全链路追踪方案对比
由于公司目前有200多微服务,微服务之间的调用关系错综复杂,调用关系人工维护基本不可能实现,需要调研一套全链路追踪方案,初步调研之后选取了skywalking和pinpoint进行对比; 选取skyw ...
- 「Java分享客栈」随时用随时翻:微服务链路追踪之zipkin搭建
前言 微服务治理方案中,链路追踪是必修课,SpringCloud的组件其实使用很简单,生产环境中真正令人头疼的往往是软件维护,接口在微服务间的调用究竟哪个环节出现了问题,哪个环节耗时较长,这都是项目上 ...
- 基于 Istio 的全链路灰度方案探索和实践
作者|曾宇星(宇曾) 审核&校对:曾宇星(宇曾) 编辑&排版:雯燕 背景 微服务软件架构下,业务新功能上线前搭建完整的一套测试系统进行验证是相当费人费时的事,随着所拆分出微服务数量的不 ...
- 带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin
在实际应用中,你做了那么多 Server 端,写了 N 个 RPC 方法.想看看方法的指标,却无处下手? 本文将通过 gRPC + Opentracing + Zipkin 搭建一个分布式链路追踪系统 ...
- Node.js 应用全链路追踪技术——[全链路信息获取]
全链路追踪技术的两个核心要素分别是 全链路信息获取 和 全链路信息存储展示. Node.js 应用也不例外,这里将分成两篇文章进行介绍:第一篇介绍 Node.js 应用全链路信息获取, 第二篇介绍 N ...
- go微服务框架Kratos笔记(六)链路追踪实战
什么是链路追踪 借用阿里云链路追踪文档来解释 分布式链路追踪(Distributed Tracing),也叫 分布式链路跟踪,分布式跟踪,分布式追踪 等等,它为分布式应用的开发者提供了完整的调用链路还 ...
- 一文详解|Go 分布式链路追踪实现原理
在分布式.微服务架构下,应用一个请求往往贯穿多个分布式服务,这给应用的故障排查.性能优化带来新的挑战.分布式链路追踪作为解决分布式应用可观测问题的重要技术,愈发成为分布式应用不可缺少的基础设施.本文将 ...
- 解读Go分布式链路追踪实现原理
摘要:本文将详细介绍分布式链路的核心概念.架构原理和相关开源标准协议,并分享我们在实现无侵入 Go 采集 Sdk 方面的一些实践. 本文分享自华为云社区<一文详解|Go 分布式链路追踪实现原理& ...
- 基于zipkin分布式链路追踪系统预研第一篇
本文为博主原创文章,未经博主允许不得转载. 分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Infras ...
随机推荐
- 304. Range Sum Query 2D - Immutable(动态规划)
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...
- jQuery - 链(Chaining)
http://www.runoob.com/jquery/jquery-chaining.html jQuery - 链(Chaining) 通过 jQuery,可以把动作/方法链接在一起. Chai ...
- turtle画王思聪吃热狗(杨艳春,何金凝小组)
点击此处查看视频:http://v.douyin.com/RCY8GD/import turtle as t t.setup(450,300) t.pensize(4) t.color('black' ...
- docker enable overlay2 quota on Centos 7
参考文档 docker overlay2的 --storage-opt 需要启动mount 参数中有pquota 参考上边的文档mount中的xfs 含有pquota 将 /etc/fstab 文件中 ...
- C++ this指针的详解
C++中this指针的用法详解 转自:http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指 ...
- Flutter 数据存储 加权限 sharedpreference, sqflite, file
要访问SD卡,首先读取权限肯定是要有的,不然写再多代码都是无用功.在AndroidManifest.xml文件中添加 <uses-permission android:name="an ...
- 使用Semaphore同步,经典银行账户问题
1.新建Account类,使用Semaphore同步增加和减少金额方法. package com.xkzhangsan.semaphorepack.bank; import java.util.con ...
- id、class等各种选择器总结
1. id 选择器 # class 选择器 . 标签 选择器 标签名 群组 ...
- Overture如何更改音符符尾设置
Overture作为一款专业的五线谱打谱软件,深受每一个音乐爱好者喜爱.在我们使用Overture来进行打谱操作时,往往会遇到下面这种情况:我们一般打上两个八分音符时,软件会自动符尾相连,但当我们连续 ...
- 王之泰《面向对象程序设计(java)》课程学习总结
第一部分:理论知识学习部分 总复习纲要 1. Java语言特点与开发环境配置(第1章.第2章) 2. Java基本程序结构(第3章) 3. Java面向对象程序结构(第4章.第5章.第6章) 4. 类 ...