11.3 日志收集

上一章

11.5 服务指标可视化

下一章

更多图书

11.4 调用链追踪

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