目录
istio-opentracing链路追踪方案
envoy链路追踪
初始化追踪
跟踪上下文信息
istio链路追踪
链路追踪参数
采样率
jaeger
istio中jaeger现状
jaeger持久化存储
istio-opentracing链路追踪主要是由sidecar(envoy)支持的,istio只是在上层进行配置的修改。
envoy主要用三个功能来支撑系统范围内的跟踪
有多种途劲初始化追踪
不管使用的是哪个跟踪服务,都应该传播x-request-id,这样在被调用服务中启动相关性的记录。
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。
修改方式:
istio的tracing默认使用jaeger来实现日志追踪的发送,存储,查询。
先来看jaeger的架构图:
jaeger主要由以下几部分组成
istio目前官方自带的是all-in-one的镜像,所有的组件都包含在一个镜像中.数据的存储是存在内存中,pod删除或重启,所有的数据就全没有了.这没法线上使用.
为此,我们需要考虑将数据存储为指定的存储服务,采用官方自带的肯定不行,需要自己重新部署一套jaeger。
根据官方文档部署基于k8s的Jaeger的生产环境下的容器,这个要采用Production这个生成的部署方式。
这种方式的部署比较麻烦,需要对jaeger有一定的理解,对存储服务如ES都需要有一定的研究。因此这种试不推荐。
istio的链路追踪通过zipkin直接传输到jaeger-collector,jaeger-collector将数据发送到自己现有的ES集群进行存储,jaeger-query直接去现有ES集群查询。
如果不在同个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也要改成对应的地址。
这个官方的jaeger是支持发送到kafka,但由于jaeger会生成3个index(jaeger-span,jaeger-service,jager-dependencies),而kafka发送到ES时,要区分有点麻烦。暂时先直接发送到ES。
这个配置只需将查询地址改为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
参考文档: