Istio默认使用Jaeger来收集调用链信息,默认安装就已经启用了调用链追踪功能。为了能使用Istio的调用链追踪功能,程序需要做简单的修改,需要在请求其他服务时传递调用链的请求头,程序在请求其他服务时需要传递如下的请求头:
·x-request-id
·x-b3-traceid
·x-b3-spanid
·x-b3-parentspanid
·x-b3-sampled
·x-b3-flags
·x-ot-span-context
Istio的调用链追踪也支持以百分比抽样的方式进行,通过修改istio-pilot部署的环境变量PILOT_TRACE_SAMPLING来修改调用链追踪的百分比。可以使用如下的方式修改环境变量PILOT_TRACE_SAMPLING的值为50,表示只对服务50%的请求进行调用链追踪:
$ kubectl patch deploy istio-pilot -n istio-system -p '{"spec":{"template":{"spec":{"containers":[{"name":"discovery","env":[{"name":"PILOT_TRACE_SAMPLING","value":"50"}]}]}}}}'
Istio的调用链追踪功能支持使用HTTP/1.1、HTTP/2.0和gRPC协议的服务,这已经能够覆盖大部分服务使用的协议,如果使用的是其他的协议,Istio将无法实现自动的调用链追踪功能。
虽然Istio能自动实现调用链追踪功能,但是你无法在调用链中的span中添加自定义的数据,比如用户相关的信息。如果你想在span中添加自定义的数据,或者在程序中添加对其他协议的支持,可以参考如下两篇文章:
·https://aspenmesh.io/2018/07/distributed-tracing-istio-and-your-applications/
·https://aspenmesh.io/2018/04/tracing-grpc-with-istio/
【实验】
1)查看是否已经开启调用链追踪功能:
$ kubectl get deploy istio-tracing -n istio-system NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE istio-tracing 1 1 1 1 21d $ kubectl get svc tracing -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tracing ClusterIP 10.103.169.41 <none> 80/TCP 21d $ kubectl get svc zipkin -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE zipkin ClusterIP 10.109.10.212 <none> 9411/TCP 21d
上面的命令结果表示已经开启了调用链追踪功能。
2)创建用于请求的Pod:
$ kubectl apply -f kubernetes/fortio.yaml
3)暴露Jaeger查询的Web服务:
$ kubectl apply -f kubernetes/istio-tracing-service.yaml
4)并发请求服务:
$ kubectl exec fortio -c fortio /usr/local/bin/fortio -- load -curl http://service-python/env HTTP/1.1 200 OK content-type: application/json content-length: 177 server: envoy date: Fri, 18 Jan 2019 14:17:32 GMT x-envoy-upstream-service-time: 804 {"message":"python v2","upstream":[{"message":"lua v2","response_time":0.11},{"message":"node v1","upstream":[{"message":"go v1","response_time":"0.01"}],"response_time":0.11}]} $ kubectl exec fortio -c fortio /usr/local/bin/fortio -- load -qps 10 -n 100 -loglevel Error http://service-python/env 14:18:01 I logger.go:97> Log level is now 4 Error (was 2 Info) Fortio 1.0.1 running at 10 queries per second, 2->2 procs, for 100 calls: http://service-python/env Aggregated Sleep Time : count 96 avg -29.406556 +/- 17.84 min -71.182683879 max -0.663793146 sum -2823.02941 # range, mid point, percentile, count >= -71.1827 <= -0.663793 , -35.9232 , 100.00, 96 # target 50% -36.2944 WARNING 100.00% of sleep were falling behind Aggregated Function Time : count 100 avg 2.9197529 +/- 1.781 min 0.081594508 max 6.892183204 sum 291.975288 # target 50% 2.5625 # target 75% 4.38462 # target 90% 5.77913 # target 99% 6.78088 # target 99.9% 6.88105 Sockets used: 8 (for perfect keepalive, would be 4) Code 200 : 96 (96.0 %) Code 503 : 4 (4.0 %) All done 100 calls (plus 0 warmup) 2919.753 ms avg, 1.2 qps
5)创建Web访问的路由规则:
$ kubectl apply -f istio/route/gateway-js-v1.yaml
6)浏览器访问。访问地址http://11.11.11.112:31380/ ,多次刷新并点击“发射”按钮,如图11-8所示。
图11-8 浏览器访问
7)在Jaeger UI上查看指标数据。访问地址http://11.11.11.111:32144/ ,查看service-python服务调用链,如图11-9所示。
查询service-python服务响应时间大于3s的请求调用链,如图11-10所示。
图11-9 在Jaeger UI上查看指标数据
图11-10 查询service-python服务响应时间大于3s的请求调用链
查询service-python服务响应码为503请求调用链,如图11-11所示。
图11-11 查询service-python服务响应码为503请求调用链
查看service-python服务某个调用链的详情,如图11-12所示。
图11-12 查看service-python服务某个调用链的详情
查看服务调用链中服务的请求详情,如图11-13所示。
图11-13 查看服务调用链中服务的请求详情
查看网格中的服务调用树,如图11-14所示。
图11-14 查看网格中的服务调用树
8)清理:
$ kubectl delete -f istio/route/gateway-js-v1.yaml $ kubectl delete -f kubernetes/fortio.yaml $ kubectl delete -f kubernetes/istio-tracing-service.yaml