天天看点

阿里云服务网格端到端可观测性

什么是可观测性(Observability)

istio官网对于可观测性的定义

分为三个部分

  • Metrics(监控)
  • Logs(日志)
  • Distributed Tracing(分布式追踪)
阿里云服务网格端到端可观测性

Metrics

阿里云服务网格将对接

阿里云应用实时监控服务(ARMS)

,您将可以通过ARMS中的Prometheus监控面板查看服务网格监控。

Logs

阿里云日志服务(SLS)

,您将可以通过SLS查看服务网格的全部日志。

Distributed Tracing

阿里云服务网格配合

阿里云链路追踪服务

可以在极低侵入的情况下使您的应用具备分布式追踪能力,您无需在应用内集成分布式追踪库Sdk等繁琐操作,只需简单的几行代码,就可以使得您部署在服务网格中的应用具备分布式追踪的能力。您还可以随时调整追踪流量的比例,从而在各种场景下满足性能的平衡。

在接下来的内容中,我将着重为您展示服务网格如何为应用提供分布式追踪能力。

部署测试项目

前提条件

部署控制面

  1. 进入clone好的microservice-demo目录
  2. 使用kubectl命令将release/istio-manifests.yaml部署到网格控制面
    # 请切换为网格控制面的KubeConfig
    $ kubectl apply -f release/istio-manifests.yaml           
  3. 检查控制面部署内容
    $ 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           
  4. 使用kubectl命令将release/kubernetes-manifests.yaml部署到k8s集群
    # 请切换为k8s集群的KubeConfig
    $ kubectl apply -f release/kubernetes-manifests.yaml           
  5. 检查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}'           

复制获得的地址到浏览器,即可打开项目主页,该项目模拟了一个完整的电商网站

阿里云服务网格端到端可观测性

制造链路追踪信息

我们可以打开多个商品的页面进行浏览,从而使项目的微服务之间发生调用,留下追踪信息

阿里云服务网格端到端可观测性

查看链路追踪信息

阿里云服务网格可以在您不做任何代码改造的基础上为您提供单次调用的追踪信息,我们接下来就演示如何查看这追踪信息。

  1. 在服务网格控制面板中点击左侧“链路追踪”,进入链路追踪服务
阿里云服务网格端到端可观测性
  1. 进入链路追踪服务后,点击菜单左侧的“全局拓扑”,即可看到调用拓扑关系图
阿里云服务网格端到端可观测性
  1. 点击应用列表,可以看到列出的各种服务,点击服务可以查看与其相关的追踪信息,例如我们点击"recommendationservice",可以查看该应用的追踪信息
阿里云服务网格端到端可观测性
  1. 点击左侧的接口调用,我们可以查看与该服务相关的接口调用,选择一个span名称,即可查看该span名称的所有追踪信息,例如我们选择recommendationservice.default.svc.cluster.local:8080/这个span,右侧就会列出所有名称为recommendationservice.default.svc.cluster.local:8080/的span的调用追踪信息。
阿里云服务网格端到端可观测性
  1. 打开并查看一个调用信息,可以看到,这次追踪信息是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的完整追踪信息。

阿里云服务网格端到端可观测性