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。
  
  生成的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://www.gcyL157.com example2.com:9200
  
  index-prefix: online-opentracing
  
  collector:
  
  zipkin:
  
  http-port: 9411
  
  query: |
  
  es:
  
  server-urls: http://www.michenggw.com 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-www.fengshen157.com/ 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

猜你喜欢

转载自blog.csdn.net/li123128/article/details/86419780
0条评论
添加一条新回复