Part 02、istio到底做了什么工作
Buoyant的CEO William Morgan,也就是Service Mesh这个词的发明人,对Service Mesh的定义为:“服务网格是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服务网格保证请求在这些拓扑中可靠地穿梭。在实际应用当中,服务网格通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但对应用程序透明。”
从上面的定义来看,我们可以总结以下service mesh或者说istio的几个特点:
1、 通过代理,保证服务与服务、服务与基础设施间以及内外部请求的可靠性,这样的可靠不仅仅是代表网络拓扑的联通性,还要考虑请求的负载均衡以及网络问题下的熔断。
2、 是集群的设施,对服务透明,不需要服务的强依赖,因此对服务的语言、框架也没有特殊的要求。当istio变更和升级时候,也不需要服务随同升级。
3、 网络控制和监控粒度的细化。比如按照之前的灰度方式,基本上都是通过服务或者是网关服务进行流量的分流,使用istio则通过基础服务的代理配置分流的规则,从而保证研发对流量的深度控制。
Part 02、istio的实现框架
Istio服务网格可以划为控制平面和数据平面,数据平面是代理组件以及服务通过代理进行的请求,控制平面则对数据平面的组件进行发现、配置、管控,是这个istio的大脑,不难看出,控制面实际上是一种中心化的设计。
图1 istio部署视图
宏观上可以看作是代理组件之间在进行数据的请求,而每个代理节点注册到控制平面,有控制平面管控和调节代理节点(实际是代理节点所在的服务)的路由。
图2 istio具体组件
控制平面主要组件包括Pilot, Mixer、Galley和Citadel
Mixer:顾名思义,在应用和控制层组件间形成中间层,从而实现不同架构的后端应用与组件间的解耦,路由组件的上报信息直接发向Mixer,由Mixer来适配和转发。
Pilot: 是Istio实现流量管理的核心组件,它主要的作用是配置和管理Envoy代理。
Citadel:是安全相关的组件,主要负责密钥和证书的管理。
Galley:配置管理组件,负责配置的获取和处理。
Part 03、istio实现请求的可视化
Istio tracing可以用来做什么呢?
1、服务依赖分析
2、性能/延迟优化
3、平均时延的统计
4、请求慢的原因分析
Istio利用Envoy的分布式跟踪功能提供开箱即用的跟踪集成,我们可以选用Jaeger的追踪平台来实现。
具体来讲,一个请求在服务间或者服务调用过程中,对相关的请求都在头部添加一个id,通过Envoy收集相同id的来判断是否在一个请求流程中。
图3 trace原理
Jaeger组件收集到数据流信息后经过聚合,可以图形化展示接口调用的记录以及单个接口具体的流程。
图4 服务流量聚合
图5 某个请求具体信息
实际上,收集请求的过程并非是透明且对应用无感知的,而是会对istio造成一定的影响,因此我们可以选用较少的流量比例进行采样。