什么是可观测性(Observability)
istio官网对于可观测性的定义分为三个部分
- Metrics(监控)
- Logs(日志)
- Distributed Tracing(分布式追踪)
Metrics
阿里云服务网格将对接阿里云应用实时监控服务(ARMS),您将可以通过ARMS中的Prometheus监控面板查看服务网格监控。
Logs
阿里云服务网格将对接阿里云日志服务(SLS),您将可以通过SLS查看服务网格的全部日志。
Distributed Tracing
阿里云服务网格配合阿里云链路追踪服务可以在极低侵入的情况下使您的应用具备分布式追踪能力,您无需在应用内集成分布式追踪库Sdk等繁琐操作,只需简单的几行代码,就可以使得您部署在服务网格中的应用具备分布式追踪的能力。您还可以随时调整追踪流量的比例,从而在各种场景下满足性能的平衡。
在接下来的内容中,我将着重为您展示服务网格如何为应用提供分布式追踪能力。
部署测试项目
前提条件
- 一个服务网格实例
- 一个托管k8s集群实例
- 将上述k8s集群实例加入到上述服务网格,并部署入口网关
- 我们使用Hipstershop项目作为测试项目,您需要clone一份到本地,项目地址:https://github.com/GoogleCloudPlatform/microservices-demo
部署控制面
- 进入clone好的microservice-demo目录
-
使用kubectl命令将release/istio-manifests.yaml部署到网格控制面
# 请切换为网格控制面的KubeConfig $ kubectl apply -f release/istio-manifests.yaml
-
检查控制面部署内容
$ kubectl get virtualservice NAME AGE frontend 1m frontend-ingress 1m $ kubectl get gateway NAME AGE frontend-gateway 1m $ kubectl get serviceentry whitelist-egress-google-metadata 1m whitelist-egress-googleapis 1m
-
使用kubectl命令将release/kubernetes-manifests.yaml部署到k8s集群
# 请切换为k8s集群的KubeConfig $ kubectl apply -f release/kubernetes-manifests.yaml
-
检查k8s集群服务部署
$ kubectl get all NAME READY STATUS RESTARTS AGE pod/adservice-865dddcf76-ljf52 2/2 Running 0 1m pod/cartservice-5564b5fc47-zfvht 2/2 Running 0 1m pod/checkoutservice-5c564598c6-ltlr6 2/2 Running 0 1m pod/currencyservice-57bbb468bb-bv72x 2/2 Running 0 1m pod/emailservice-54668b9c68-n8pj8 2/2 Running 0 1m pod/frontend-69c46cb898-q4sgv 2/2 Running 0 1m pod/loadgenerator-6f55fc65b6-86wqv 2/2 Running 0 1m pod/paymentservice-794846776-dvtrf 2/2 Running 0 1m pod/productcatalogservice-545cf5c6c6-nkgfn 2/2 Running 0 1m pod/recommendationservice-6cc9b66f66-2lgds 2/2 Running 0 1m pod/redis-cart-6448dcbdcc-8767q 2/2 Running 0 1m pod/shippingservice-7fbcf86b68-m2gx6 2/2 Running 0 1m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/adservice ClusterIP 172.21.14.49 <none> 9555/TCP 1m service/cartservice ClusterIP 172.21.8.141 <none> 7070/TCP 1m service/checkoutservice ClusterIP 172.21.7.7 <none> 5050/TCP 1m service/currencyservice ClusterIP 172.21.3.85 <none> 7000/TCP 1m service/emailservice ClusterIP 172.21.1.205 <none> 5000/TCP 1m service/frontend ClusterIP 172.21.7.113 <none> 80/TCP 1m service/frontend-external LoadBalancer 172.21.0.24 x.x.x.x 80:31908/TCP 1m service/kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 7h41m service/paymentservice ClusterIP 172.21.0.232 <none> 50051/TCP 1m service/productcatalogservice ClusterIP 172.21.7.242 <none> 3550/TCP 1m service/recommendationservice ClusterIP 172.21.13.195 <none> 8080/TCP 1m service/redis-cart ClusterIP 172.21.11.221 <none> 6379/TCP 1m service/shippingservice ClusterIP 172.21.4.27 <none> 50051/TCP 1m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/adservice 1/1 1 1 1m deployment.apps/cartservice 1/1 1 1 1m deployment.apps/checkoutservice 1/1 1 1 1m deployment.apps/currencyservice 1/1 1 1 1m deployment.apps/emailservice 1/1 1 1 1m deployment.apps/frontend 1/1 1 1 1m deployment.apps/loadgenerator 0/1 1 0 1m deployment.apps/paymentservice 1/1 1 1 1m deployment.apps/productcatalogservice 1/1 1 1 1m deployment.apps/recommendationservice 1/1 1 1 1m deployment.apps/redis-cart 1/1 1 1 1m deployment.apps/shippingservice 1/1 1 1 1m NAME DESIRED CURRENT READY AGE replicaset.apps/adservice-865dddcf76 1 1 1 1m replicaset.apps/cartservice-5564b5fc47 1 1 1 1m replicaset.apps/checkoutservice-5c564598c6 1 1 1 1m replicaset.apps/currencyservice-57bbb468bb 1 1 1 1m replicaset.apps/emailservice-54668b9c68 1 1 1 1m replicaset.apps/frontend-69c46cb898 1 1 1 1m replicaset.apps/loadgenerator-6f55fc65b6 1 1 0 1m replicaset.apps/paymentservice-794846776 1 1 1 1m replicaset.apps/productcatalogservice-545cf5c6c6 1 1 1 1m replicaset.apps/recommendationservice-6cc9b66f66 1 1 1 1m replicaset.apps/redis-cart-6448dcbdcc 1 1 1 1m replicaset.apps/shippingservice-7fbcf86b68 1 1 1 1m
检查服务访问
切换至k8s集群kubeconfig,执行以下命令获取公网访问地址:
$ kubectl get svc --namespace istio-system|grep ingress|awk -F ' ' '{print $4}'
复制获得的地址到浏览器,即可打开项目主页,该项目模拟了一个完整的电商网站
制造链路追踪信息
我们可以打开多个商品的页面进行浏览,从而使项目的微服务之间发生调用,留下追踪信息
查看链路追踪信息
阿里云服务网格可以在您不做任何代码改造的基础上为您提供单次调用的追踪信息,我们接下来就演示如何查看这追踪信息。
- 在服务网格控制面板中点击左侧“链路追踪”,进入链路追踪服务
- 进入链路追踪服务后,点击菜单左侧的“全局拓扑”,即可看到调用拓扑关系图
- 点击应用列表,可以看到列出的各种服务,点击服务可以查看与其相关的追踪信息,例如我们点击"recommendationservice",可以查看该应用的追踪信息
- 点击左侧的接口调用,我们可以查看与该服务相关的接口调用,选择一个span名称,即可查看该span名称的所有追踪信息,例如我们选择recommendationservice.default.svc.cluster.local:8080/这个span,右侧就会列出所有名称为recommendationservice.default.svc.cluster.local:8080/的span的调用追踪信息。
- 打开并查看一个调用信息,可以看到,这次追踪信息是frontend.default调用recommendationservice.default,追踪信息展示了调用双方关系,地址,时间,以及耗时分布
实现完整链路跟踪
在前面的演示中,ASM网格在不需对应用作任何改造的前提下实现了单词调用的跟踪信息,如果我们希望得到frontend -> recommendationservice -> productcatalog这样的完整调用链路信息,应用需要做一个非常小的改造,以实现将多个Span关联成为一整条跟踪链。
传播B3 Header
应用所需要做的唯一件事,就是将流入请求的下述Header原封不动地传递给流出请求,这些Header由服务网格Sidecar自动生成,应用只需要传播即可。
- x-request-id
- x-b3-traceid
- x-b3-spanid
- x-b3-parentspanid
- x-b3-sampled
- x-b3-flags
- x-ot-span-context
改造RecommendationService
recommendationservice使用python实现,我们这里只需要改造一行代码:
将红框中的代码改造为蓝框中,这里需要解释一下这行代码做了什么,在GRPC中,请求Header被称为MetaData,所以我们将请求的metadata赋值给对productcatalogservice的调用的metadata(当然您也可以显式地逐个为Header赋值),这样一来就将链路追踪信息传递给了下一次调用的Span。
查看改造后的追踪信息
改造完毕、部署成功后,重新访问演示项目页面地址,制造追踪信息。然后打开链路追踪页面,进入RecommendationSerivce,查看相关Span,我们可以看到,链路信息已经变成了frontend -> recommendationservic -> productcatalogservice的完整追踪信息。