一、jaeger 介绍
jaeger 官网:https://www.jaegertracing.io/
jaeger 是 Uber 开源的分布式跟踪系统,用于微服务的监控和全链路跟踪,其设计思想来自于 Dapper 和 zipkin。jaeger 特征包括:
-
分布式上下文传播
-
分布式事务监控
-
Root 原因分析
-
服务依赖性分析
-
性能/延迟优化
二、jaeger 安装
如果你使用 istioctl profile demo 安装 istio 的话,jaeger 默认就是安装好的
[root@k8s-master k8s]# kubectl get svc -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.1.5.34 <none> 3000/TCP 6h54m istio-egressgateway ClusterIP 10.1.247.154 <none> 80/TCP,443/TCP,15443/TCP 6h55m istio-ingressgateway NodePort 10.1.117.117 <none> 15021:32064/TCP,80:32223/TCP,443:32254/TCP,31400:30364/TCP,15443:30581/TCP 6h55m istiod ClusterIP 10.1.76.150 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 6h56m jaeger-collector ClusterIP 10.1.74.203 <none> 14268/TCP,14250/TCP 23m kiali NodePort 10.1.4.30 <none> 20001:31461/TCP,9090:32540/TCP 6h54m prometheus ClusterIP 10.1.198.172 <none> 9090/TCP 6h54m tracing ClusterIP 10.1.122.6 <none> 80:/TCP 23m zipkin ClusterIP 10.1.171.167 <none> 9411/TCP 23m
注意:在istio老版本叫jaeger-query,新版本叫tracing
为了可以将 jaeger 暴露在 k8s 集群外访问,需要将 tracing的 ClusterIP 服务类型更改为 NodePort。执行语句如下
kubectl patch svc -n istio-system tracing -p '{"spec":{"type": "NodePort"}}'
查看svc端口
[root@k8s-master k8s]# kubectl get svc -n istio-system|grep tracing tracing NodePort 10.1.122.6 <none> 80:31137/TCP 26m
可以看到暴露的端口为:31137
使用浏览器访问:
http://192.168.31.236:31137/jaeger/
注意:192.168.31.236是k8s-master地址
效果如下:
三、kiali 关联 jaeger
kiali 是可视化服务网格组件,截图如下:
点击上面箭头 Distributed Tracing 链接可以打开 jaeger。如果访问不到,说明你本地的浏览器并不能直接访问到 kiali 设置的 jaeger 外部链接。
注意:默认是没有的,我是关联之后才有的,莫慌。
设置 kiali jaeger 外部链接地址
编辑 kiali configmap:
kubectl edit configmap -n istio-system kiali
在 external_services.tracing.url 内容下添加 jaeger 外部链接,链接地址就是 istio-system 命名空间下 jaeger-query 服务的宿主机地址和 nodeport
external_services: custom_dashboards: enabled: true tracing: url: http://192.168.31.236:31137/jaeger in_cluster_url: http://tracing/jaeger
编辑 kiali configmap 后,需要删除并重新生成 kiali pod,好让配置挂载生效,执行语句如下
kubectl delete pod -n istio-system $(kubectl get pod -n istio-system | grep -i kiali | awk '{print $1}')
执行完后,再次查看 kiali pod
[root@k8s-master k8s]# kubectl get pods -n istio-system|grep kiali kiali-667b888c56-nt27g 1/1 Running 0 15m
查看发现 url 值已经生效:
[root@k8s-master k8s]# kubectl -n istio-system exec -it kiali-667b888c56-nt27g -- cat /kiali-configuration/config.yaml auth: openid: {} openshift: client_id_prefix: kiali strategy: anonymous ... external_services: custom_dashboards: enabled: true tracing: url: http://192.168.31.236:31137/jaeger in_cluster_url: http://tracing/jaeger
再次刷新访问 kiali,就会在左侧栏出现Distributed Tracing,点击它,就会打开jaeger,效果同上!
四、kiali jaeger 流量关联
以上的操作中通过 kiali 可以打开 jaeger 了,还可以通过实际流量将 kiali 和 jaeger 关联起来,首先打入一些流量,这里采用的是 istio 的官方用例 bookinfo:
while true; do sleep 1;curl http://192.168.31.16:32223/productpage; done
访问 kiali 的 service 菜单标签:
双击 productpage 进入微服务,然后选择标签页 Traces,再点击蓝色圆圈(trace 点)后会显示该 tracing 的路径信息,然后再选择链接(View Trace in Tracing):
点击View in Tracing,效果如下:
点击下面的istio-ingressgateway: productpage.default.svc.cluster.local:9080/productpage
效果如下:
本文参考链接:
https://blog.51cto.com/14268033/2488805