浅析Istio系列(一):Istio入门介绍
从今天起,我们推出“浅析Istio”系列专题,在本专题中,带着读者从零去认识并掌握Istio,并且我们会用一些Istio的真实使用案例介绍其落地实践。作为本系列的开篇,主要是对Service Mesh思想和Istio的架构及功能做一个简单的介绍。
了解Istio得从微服务架构谈起,微服务是在2012年提出的概念,其根本思想是通过拆分原则,希望一个服务只负责业务中一个独立的功能,这样任何一个需求不会因为发布或者维护而影响到不相关的服务,所有服务都可以做到独立部署运维,当然这也只是微服务架构给我们带来的好处之一。
但是面对拆分出来的若干服务,又该如何解决服务之间通信问题呢?以大家都熟悉的Spring Cloud为例,通过Eureka组件实现服务发现功能,通过Feign实现服务间的调用,表面上来看这些组件帮我们轻松解决了,但是细想我们是不是需要在业务代码里加各种maven依赖、组件注解以及写配置,打jar包时也要将业务代码与这些非业务代码融合在一起,这也是Spring Cloud被称为“侵入式框架”的原因。而作为开发者,我们的精力应该放在业务代码上,而非这些非业务代码上。因此,我们思路应该是在解决服务之间通信的问题时,尽量将服务间通信这种非业务的代码从业务代码中剥离出来。Service Mesh正是根据这种思想帮助我们很好的解决了该问题。下面我们就给大家讲讲Service Mesh是怎么做到的。
Service Mesh的思想
Service Mesh也就是大家常说的服务网格,它的核心思想就是Sidecar模式。Sidecar模式是一种将应用功能从应用本身剥离出来作为单独进程的方式,该模式允许我们向应用无侵入添加多种功能。“剥离”,“无侵入添加”,大家想想这是不是正好可以用来解决我们上述提出的问题。而第一代Service Mesh也就是将服务的负载、限流和服务发现等等通信功能从服务本身的业务功能中剥离出来,作为一个Sidecar代理,与服务业务代码绑定在一起,这样为每一个服务都配置了一个Sidecar代理后,流入流出该服务的流量都经过Sidecar代理,通信的事情交给Sidecar处理,而我们不需要再去关注通信的细节,只要专注开发业务功能本身问题就行。
第一代Service Mesh由若干个服务的Sidecar代理构成,但是缺少一个对这些Sidecar代理进行集中式管理的控制面板。为了提供一个统一的上层运维入口,第二代Service Mesh提出控制平面的概念,所有的Sidecar代理通过和控制平面交互进行网络通信的执行。
我们现在所说的Service Mesh也就是第二代Serrvice Mesh,如下图所示其结构分为两部分:数据平面和控制平面。
数据平面由若干服务所对应的Sidecar代理组成。如上所述,每个应用服务都配置了一个Sidecar代理,进入和离开该服务的流量都经过其Sidecar代理,并在Sidecar上执行治理动作,协调和控制服务间的所有网络通信。
控制平面就是来管理数据平面,也就是管理Sidecar代理,全局的管理规则和网格内的元数据维护通过该统一的控制平面实现。需要注意的是,只有数据平面的Sidecar和控制平面有关系,应用服务感知不到Sidecar,更不会和控制平面有任何联系,服务的业务代码和控制面彻底解耦。
Istio介绍
了解了Service Mesh,再来看Istio就会清楚很多。Istio是一个Service Mesh形态的用于服务治理的开放平台。其中“Service Mesh形态"可以理解为Istio实现了Service Mesh,它是第二代Service Mesh的典型代表,从2017年5月发布第一个版本0.1开始就被广泛关注,直到现在成为被业界公认Service Mesh最成功的实现;"开放平台”是指其本身是一个开源项目,最初是由Goole、IBM和Lyft联合创建的;“服务”可以简单的理解为微服务或者单个应用,是Istio治理的对象,而“治理”也正是Istio提供的功能,包括服务的流量管理、安全和可观测性。这里先对这几种治理做一个简单的阐释,在后面的文章中我们会做更详细的说明。
流量管理:Istio通过简单的规则配置和流量路由,可以控制服务之间的调用的流量和API调用。简化了熔断、超时和重试等配置,并且可以轻松设置A/B测试和金丝雀发布等任务;
安全:Istio管理服务间通信的认证机制、通道加密服务和访问授权,可以保障服务通信的安全性,并且所有的这些功能都不必更改应用程序;
可观测性:Istio具备强大的链路追踪、监控和日志记录能力,从而方便了解服务的运行状况,发现并解决问题。
下面我们从架构的角度来看看Istio是如何实现Servie Mesh的。与Service Mesh保持一致,从逻辑上分为数据平面和控制平面,如下图所示[1]。
数据平面由一组以Sidecar方式部署的智能代理(Envoy)组成,所有进入和流出服务的流量都会被Envoy拦截,并与控制面进行交互,根据配置执行相应的通信功能。Envoy之所以称之为智能,是因为Envoy相对于其他代理来说有着更丰富的治理能力和灵活的配置方式,并且支持各种插件可用于扩展流量治理能力,并生成遥测数据。
在控制平面上,Istio由三个组件( Pilot、Citadel、Galley )整合成了一个单进程、多模块的istiod,极大的降低了部署的复杂度。其中Pilot组件负责提供服务发现、智能路由(如金丝雀发布)和弹性功能(如超时、重试);Citadel负责安全,管理密钥和证书;Galley负责对配置的验证和处理等功能。需要注意的是,整个运行流程需要这些组件协同工作,这里只是做一个简单的介绍,后续我们也会对Istio架构以及架构中的各个组件做一个更详细的介绍。总的来说,Istiod作为一种全新的设计,构建了一套标准的控制面规范,主要提供服务发现、规则配置和证书管理等功能,并向数据平面传递这些信息。
总结
今天我们对Istio做了一个简单的介绍,从当今的微服务架构存在的问题引出Service Mesh的概念,通过对Sercive Mesh的解读方便大家先对Istio的总体架构和基本功能有一个基本的认识。如今,由于Istio在技术和产品上的巨大潜力,越来越多的云厂商选择将Istio作为其容器平台的一部分提供给用户,各大厂商在社区的投入也在不断加大,还不赶紧跟着小编一起去掌握Istio。关注我,不落伍,我们下次见。
参考文献:
[1] Istio官网
[2]《Istio服务网格技术解析与实践》
[3]《云原生服务网格Istio原理、实践、架构与源码解析》