专栏首页喵了个咪的博客空间五, 跨语言微服务框架 - Istio链路监控和监控可视化

五, 跨语言微服务框架 - Istio链路监控和监控可视化

在使用微服务会面临最大的一个问题也就是在服务数量增加带来的排查成本和监控成本,大家为了解决这些成本也衍生出了很多工作,当然在Istio中也很好的融合了这些组件,默认安装下就已经带上了这些组件(zipkin + jaeger , prometheus + grafana),本节就来看看怎么来使用这些组件

附上:

喵了个咪的博客:w-blog.cn

Istio官方地址:https://preliminary.istio.io/zh

Istio中文文档:https://preliminary.istio.io/zh/docs/

PS : 此处基于当前最新istio版本1.0.3版本进行搭建和演示

一. 清理bookinfo重新创建

先重置官方示例bookinfo回到最初的状态:

运行清理bookinfo脚本,并且重新创建

> ./istio-1.0.3/samples/bookinfo/platform/kube/cleanup.sh 
namespace ? [default] istio-test
using NAMESPACE=istio-test
Deleted config: destinationrules details
...
Application cleanup successful
# 重新初始化
> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/platform/kube/bookinfo.yaml
> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/networking/bookinfo-gateway.yaml
> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/networking/destination-rule-all.yaml

二. 链路监控

在微服务中往往一次请求会尽力N多服务,那么每个服务的响应状态这个业务经过哪些服务对开发或问题排查就显得额外重要,链路监控是其中的一种解决方案,把微服务中的调用链进行记录并且通过可视化的方式进行展示,行业中相对成熟的解决方案就是zipkin,但是因为zipkin的界面并不是那么友好一般我们配合着jaeger进行使用,istio也对它进行了整合.

2.1 访问使用jaeger

通过内部映射的方式映射到本机的

> kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686

或者也可修改成nodeport端口:

> kubectl edit svc jaeger-query -n istio-system
  ports:
  - name: query-http
    port: 16686
    protocol: TCP
    targetPort: 16686
    nodePort: 30686
  selector:
    app: jaeger
  sessionAffinity: None
  type: NodePort

在 Jaeger dashboard里从Service下选择productpage,点击Find Traces 按钮,可以看到跟踪信息:

进到下一层可以看到每个服务的调用层次以及总体消耗时间的分布:

在展开可以看到更多的相关内容

2.2 链路监控的必要条件 Headers 传递

为什么使用服务网格之后还需要传递指定的Headers呢? 这里就要从链路监控的机制来说了,在服务网格之前需要链路监控每个程序都需要向链路监控服务器发送消息,由第一个程序找链接监控发起ID获取,接下来的每个程序被调用的时候都需要告知链路监控系统我是在这个链路ID之中,此时才能关联整个链路.

虽然 Istio 代理能够自动发送 Span 信息,但还是需要一些辅助手段来把整个跟踪过程统一起来。应用程序应该自行传播跟踪相关的 HTTP Header,这样在代理发送 Span 信息的时候,才能正确的把同一个跟踪过程统一起来。

为了完成跟踪的传播过程,应用应该从请求源头中收集下列的 HTTP Header,并传播给外发请求:

  • x-request-id
  • x-b3-traceid
  • x-b3-spanid
  • x-b3-parentspanid
  • x-b3-sampled
  • x-b3-flags
  • x-ot-span-context

如果查看示例服务,可以看到productpage服务(Python)从HTTP请求中提取所需的标头:

def getForwardHeaders(request):
    headers = {}

    if 'user' in session:
        headers['end-user'] = session['user']

    incoming_headers = [ 'x-request-id',
                         'x-b3-traceid',
                         'x-b3-spanid',
                         'x-b3-parentspanid',
                         'x-b3-sampled',
                         'x-b3-flags',
                         'x-ot-span-context'
    ]

    for ihdr in incoming_headers:
        val = request.headers.get(ihdr)
        if val is not None:
            headers[ihdr] = val
            #print "incoming: "+ihdr+":"+val

    return headers

2.3 采集控制

Istio 默认捕获所有请求的跟踪。例如,何时每次访问时都使用上面的 Bookinfo 示例应用程序 / productpage你在 Jaeger 看到了相应的痕迹仪表板。链路监控每次和链路服务器通讯也是有性能消耗的,在一个每天千万pv的业务下把所有链路全部采集下来是不合适的,无论从CPU还是磁盘空间都很容易出现瓶颈,并且链路监控并不是日志是一种排查手段,所以我们需要在生产环境下进行采集频率的限制:

找到pilot中PILOT_TRACE_SAMPLING环境变量从100%修改成10%的采集率:

> kubectl -n istio-system edit deploy istio-pilot
...
        - name: PILOT_TRACE_SAMPLING
          value: "10"
...
> :wq

再去刷新页面10次在JaegerUI只会看到一次调用,这边最小精度是0.01%有效值是0.0~100.0(不需要此功能可以完全不开启)

三, 数据采集

Istio集成的另外一个利器就是prometheus + grafana了, prometheus作为基础数据采集和存储方式grafana进行了可定制化报表展示以及报警等机制,先使用样的方式开启外部端口或映射端口到本地:

> kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 9090:9090
> kubectl edit svc prometheus -n istio-system
  ports:
  - name: http-prometheus
    port: 9090
    protocol: TCP
    targetPort: 9090
    nodePort: 30090
  selector:
    app: prometheus
  sessionAffinity: None
  type: NodePort

就可以查询各种指标了

例子一 :

# productpage服务的所有请求总数
> istio_requests_total{destination_service="productpage.istio-test.svc.cluster.local"}

例子二 :

# reviews 服务的 v3版本的所有请求总数
> istio_requests_total{destination_service="reviews.istio-test.svc.cluster.local", destination_version="v3"}

例子三 :

# 过去 5 分钟对所有 productpage 服务的请求比例
> rate(istio_requests_total{destination_service=~"productpage.*", response_code="200"}[5m])

四, 监控可视化

当然直接使用prometheus并不是很方便对于用户并不是特别友好,也不能做很多的预设,一般会配合grafana一起使用

> kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000
> kubectl edit svc grafana -n istio-system
  ports:
  - name: http
    port: 3000
    protocol: TCP
    targetPort: 3000
    nodePort: 33000
  selector:
    app: grafana
  sessionAffinity: None
  type: NodePort

让后就可以指定各种各样的指标了

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://my.oschina.net/wenzhenxi复制
如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • service mesh - 微服务通信进化之路

    导语 | service mesh 致力于做微服务时代的 TCP,以 TCP 的方式解决微服务的通信问题。那么它解决的是微服务时代的什么问题?以及以何种方式解决...

    腾小云
  • Istio+K8s,微服务的双剑合璧!

    服务网格(Service Mesh)用来描述组成这些应用程序的微服务网络以及它们之间的交互。

    小仙女闯运维
  • 【译文连载】 理解Istio服务网格(第六章 可观测性)

    微服务架构管理中最大的挑战之一是如何通过简单方法就能了解系统各个组件之间的关系。终端用户的一次会话可能会流经多个甚至几十个独立部署的微服务,因此,发现哪里有性能...

    SammyLiu
  • 网易轻舟如何基于 Istio 实现微服务架构演进

    网易轻舟是一站式云原生软件生产力平台,覆盖开发、构建、发布、上线运行、治理和运维等环节,源自网易内部的大规模互联网业务实践,经过金融、制造、物流等行业客户的生产...

    CNCF
  • Service Mesh在有赞的实践与发展

    Service Mesh 的概念自 2017 年初提出之后,受到了业界的广泛关注,作为微服务的下一代发展架构在社区迅速发酵,并且孵化出了诸如 Istio 等广受...

    用户1278550
  • 一, 跨语言微服务框架 - Istio 简绍和概念

    微服务的概念已经在各大公司实践开了,以Java为代表的spring boot成为了微服务的代表,K8S+Docker成为了微服务运行的最佳环境,微服务的概念已经...

    喵了个咪233
  • 应用服务网格(Service Mesh)应对微服务中面临的三种挑战

    微服务适用于开发运维(DevOps),可是这些架构依赖的服务到服务通信在生产环境下运行和管理起来很复杂。这时候Service Mesh闪亮登场了:这是企业扩展、...

    程序你好
  • 微服务治理 Istio 1.6部署和应用

    Service Mesh 的中文译为“服务网格”,是一个用于处理服务和服务之间通信的基础设施层,它负责为构建复杂的云原生应用传递可靠的网络请求,并为服务通信实现...

    没有故事的陈师傅
  • 构建基于Spring Cloud向Service Mesh框架迁移的解决方案及思路

    作为新一代微服务架构体系,Service Mesh 技术有效地解决了 Spring Cloud 微服务架构和服务治理过程中的痛点问题,一经推出便引起了很大的反响...

    博文视点Broadview
  • TARS、gRPC、Service Mesh……究竟哪个微服务框架适合你?

    第一类是无服务治理的,这一类基本可以看做是一个RPC框架。RPC发展到现在已经有几十年的时间了,主要代表为gRPC、BRPC、Thrift,它们也都有对外开源的...

    腾小云
  • Kubernetes+Docker+Istio 容器云实践

    随着社会的进步与技术的发展,人们对资源的高效利用有了更为迫切的需求。近年来,互联网、移动互联网的高速发展与成熟,大应用的微服务化也引起了企业的热情关注,而基于K...

    宜信技术学院
  • 从Spring Cloud到Kubernetes的微服务迁移实践

    要出发周边游(以下简称要出发)是国内知名的主打「周边游」的在线旅行网站,为了降低公司内部各个业务模块的耦合度,提高开发、交付及运维效率,我们在 2017 年就基...

    CNCF
  • 构建基于 Spring Cloud 向 Service Mesh 框架迁移的解决方案及思路

    作为新一代微服务架构体系,Service Mesh 技术有效地解决了 Spring Cloud 微服务架构和服务治理过程中的痛点问题,一经推出便引起了很大的反响...

    xcbeyond
  • 解读服务网格的2021:告别架构“大跃进”,技术生态百家争鸣

    服务网格的 2021,“稳” 字当先。不管是原生社区发展,还是行业实践落地,都以 “稳定” 为第一要义。少了前几年大跃进式的架构演进、功能更迭,多了更务实、更...

    深度学习与Python
  • 数字化 IT 从业者知识体系 | 应用技术架构 —— 服务网格架构

    2013 年容器技术 Docker 开源,2014 年容器编排工具 Kubernetes 开源。2015 年,云原生计算基金会(CNCF)成立,标志着应用进入云...

    CODING
  • 【译文连载】 理解Istio服务网格(第一章 概述)

    书籍英文版下载链接为 https://developers.redhat.com/books/introducing-istio-service-mesh-mi...

    SammyLiu
  • 唯品会微服务框架学习笔记

      在ArchSummit深圳2019会议上,有幸参加了杨钦民架构师对唯品会微服务的分享,唯品会是对服务化走得比较彻底的公司,坚持微服务框架纯自研和彻底落地,所...

    王昂
  • Kubernetes+Docker+Istio 容器云实践

    随着社会的进步与技术的发展,人们对资源的高效利用有了更为迫切的需求。近年来,互联网、移动互联网的高速发展与成熟,大应用的微服务化也引起了企业的热情关注,而基于K...

    宜信技术学院
  • Service Mesh实践之Istio初体验

    2014年,Martin Fowler撰写的《Microservices》[1]使得许多国内的先行者接触到微服务这个概念并将其引入国内,2015年越来越多的人通...

    绿盟科技研究通讯

扫码关注云+社区

领取腾讯云代金券