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

本文涉及的产品
性能测试 PTS,5000VUM额度
可观测可视化 Grafana 版,10个用户账号 1个月
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 阿里云服务网格端到端可观测性

什么是可观测性(Observability)

istio官网对于可观测性的定义分为三个部分

  • Metrics(监控)
  • Logs(日志)
  • Distributed Tracing(分布式追踪)

1.png

Metrics

阿里云服务网格将对接阿里云应用实时监控服务(ARMS),您将可以通过ARMS中的Prometheus监控面板查看服务网格监控。

Logs

阿里云服务网格将对接阿里云日志服务(SLS),您将可以通过SLS查看服务网格的全部日志。

Distributed Tracing

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

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

部署测试项目

前提条件

  • 一个服务网格实例
  • 一个托管k8s集群实例
  • 将上述k8s集群实例加入到上述服务网格,并部署入口网关
  • 我们使用Hipstershop项目作为测试项目,您需要clone一份到本地,项目地址:https://github.com/GoogleCloudPlatform/microservices-demo

部署控制面

  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}'

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

2.png

制造链路追踪信息

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

3.png

查看链路追踪信息

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

  1. 在服务网格控制面板中点击左侧“链路追踪”,进入链路追踪服务

4.png

  1. 进入链路追踪服务后,点击菜单左侧的“全局拓扑”,即可看到调用拓扑关系图

5.png

  1. 点击应用列表,可以看到列出的各种服务,点击服务可以查看与其相关的追踪信息,例如我们点击"recommendationservice",可以查看该应用的追踪信息

6.png

  1. 点击左侧的接口调用,我们可以查看与该服务相关的接口调用,选择一个span名称,即可查看该span名称的所有追踪信息,例如我们选择recommendationservice.default.svc.cluster.local:8080/这个span,右侧就会列出所有名称为recommendationservice.default.svc.cluster.local:8080/的span的调用追踪信息。

7.png

  1. 打开并查看一个调用信息,可以看到,这次追踪信息是frontend.default调用recommendationservice.default,追踪信息展示了调用双方关系,地址,时间,以及耗时分布

8.png

实现完整链路跟踪

在前面的演示中,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实现,我们这里只需要改造一行代码:

9.png

将红框中的代码改造为蓝框中,这里需要解释一下这行代码做了什么,在GRPC中,请求Header被称为MetaData,所以我们将请求的metadata赋值给对productcatalogservice的调用的metadata(当然您也可以显式地逐个为Header赋值),这样一来就将链路追踪信息传递给了下一次调用的Span。

查看改造后的追踪信息

改造完毕、部署成功后,重新访问演示项目页面地址,制造追踪信息。然后打开链路追踪页面,进入RecommendationSerivce,查看相关Span,我们可以看到,链路信息已经变成了frontend -> recommendationservic -> productcatalogservice的完整追踪信息。

10.png

目录
相关文章
|
19天前
|
Kubernetes 测试技术 微服务
结合阿里云ASM泳道与Kruise Rollout进行全链路灰度发布
本文将介绍如何结合阿里云ASM泳道与Kruise Rollout进行低成本,自动化的全链路灰度发布。
|
1月前
|
Kubernetes 大数据 调度
使用Kmesh作为阿里云服务网格ASM Sidecarless模式数据面
阿里云服务网格ASM支持Sidecar和Sidecarless两种模式,本文介绍了如何在阿里云ACK集群中部署Kmesh作为Sidecarless数据面并连接ASM控制面。
|
1月前
|
Kubernetes 调度 容器
使用Kmesh作为阿里云服务网格ASM Sidecarless模式数据面
阿里云服务网格ASM支持Sidecar和Sidecarless两种模式,其中Sidecarless模式如Istio Ambient、ACMG和Kmesh等,可减少延迟和资源消耗。Kmesh基于eBPF技术,通过内核空间拦截流量,结合Waypoint Proxy处理L7流量,实现高效的服务治理。本文介绍了如何在阿里云ACK集群中部署Kmesh并连接ASM控制面,包括安装步骤、检查服务状态和流量调度示例。
|
6月前
|
Cloud Native 容器 Kubernetes
基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道
本文简要讨论了使用流量泳道来实现全链路流量灰度管理的场景与方案,并回顾了阿里云服务网格 ASM 提供的严格与宽松两种模式的流量泳道、以及这两种模式各自的优势与挑战。接下来介绍了一种基于 OpenTelemetry 社区提出的 baggage 透传能力实现的无侵入式的宽松模式泳道,这种类型的流量泳道同时具有对业务代码侵入性低、同时保持宽松模式的灵活特性的特点。同时,我们还介绍了新的基于权重的流量引流策略,这种策略可以基于统一的流量匹配规则,将匹配到的流量以设定好的比例分发到不同的流量泳道。
73538 16
基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道
|
6月前
|
负载均衡 测试技术 网络安全
阿里云服务网格ASM多集群实践(一)多集群管理概述
服务网格多集群管理网络打通和部署模式的多种最佳实践
|
5月前
|
人工智能 自然语言处理 安全
使用阿里云服务网格高效管理LLM流量:(一)流量路由
ASM支持通过LLMProvider和LLMRoute资源管理大型语言模型流量。LLMProvider负责注册LLM服务,LLMRoute负责设定流量规则,应用可灵活切换模型,满足不同场景需求。
|
5月前
|
Cloud Native 测试技术 开发者
阿里云服务网格ASM多集群实践(二):高效按需的应用多环境部署与全链路灰度发布
介绍服务网格ASM提出的一种多集群部署下的多环境部署与全链路灰度发布解决方案。
|
6月前
|
人工智能 安全 Go
使用阿里云服务网格 ASM LLMProxy 插件保障大模型用户数据安全
本文介绍如何使用ASM LLMProxy动态为LLM请求添加API_KEY、使用模式匹配以及私有大模型判别请求敏感信息并根据判别结果拒绝请求等功能,帮助用户提升LLM场景下的安全水位。
|
Kubernetes API 容器
基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道
基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道
10989 19
|
7月前
|
Kubernetes Cloud Native 容器
全景剖析阿里云容器网络数据链路(六)—— ASM Istio
本文是[全景剖析容器网络数据链路]第六部分部分,主要介绍ASM Istio模式下,数据面链路的转转发链路。
557 7
全景剖析阿里云容器网络数据链路(六)—— ASM Istio