在之前关于Service Mesh(服务网格)的系列文章中,我们从实战的角度分享了一些关于Istio的入门安装、服务发现、熔断限流及流量管理(灰度发布)等细节方面的内容(可参考文末推荐阅读)。
今天的文章将从更宏观的概念和架构入手,来全面介绍Istio这一最著名的服务网格开源解决方案,以求从整体上将Istio实现服务网格的核心原理阐述清楚!
Istio中的关键概念
要学习Istio需要先明确以下几个关键术语。
1.容器/容器镜像
进入到云原生时代(不了解云原生的概念可以参考《什么是云原生?》)的服务网格架构,应用的发布、部署都是围绕Kubernetes为代表的容器基础设施展开的。这就需要对容器及容器镜像的概念有清晰的理解。
实际上,容器的普及要归功于Docker技术的流行,而从本质上说容器就是运行在操作系统中的,受资源隔离限制的一组进程,也称为“容器运行时”。它可以将用户打包的代码及其所赖的关系完整的还原出来。通过容器化运行的应用程序,可以更快、更可靠地运行,而不受具体计算环境的影响。
容器镜像,是容器化的重要介质和载体。从形式上来说,它就是一个轻量级的、独立的、可执行的软件包文件,包括了运行应用程序所需要的一切:代码、工具、系统库及各种设置。
容器技术的出现,彻底颠覆了应用构建、发布及运行的方式,目前已经成为服务端应用发布的事实标准。后续要聊到的Istio服务网格技术,无论是“网格基础组件”还是“应用程序”,都是以容器的方式运行在Kubernetes容器平台之上的。
2.微服务
微服务是一种架构风格,它将一个庞大的单体服务拆分为一组松散耦合的微服务集合,该微服务集合提供了与单个单体应用相同的功能。但微服务可以独立于其他服务进行独立的开发和部署。此外,微服务是围绕业务能力组织的,可以由较小的团队拥有,因此,在开发/部署上能够实现更小、更独立的迭代。
目前主要的微服务架构解决方案,以Spring Cloud为代表的微服务架构体系是主流;但随着云原生技术概念的流行,以Istio为代表的Service Mesh(服务网格)微服务架构方案也在逐步得到推广。
3.控制平面
在以Spring Cloud为代表的传统微服务架构中,应用本身与服务治理逻辑是耦合在一起的。而在Service Mesh(服务网格)方案中,服务治理规则的管理、服务治理行为、应用本身都是互相独立,这就使得应用可以专注于业务,而服务治理逻辑则完全可以抽离出来由运维团队进行统一的管理。
像这种专门负责服务治理规则管理的逻辑或组件,在Service Mesh(服务网格)架构中就叫做“控制平面“。“控制平面”主要由API和工具组成,用于管理服务治理行为(数据平面)。服务网格运维人员可以操控控制平面,以配置服务网格中的数据平面行为。例如,将流量配置作用于控制平面——翻译配置并将其推送到数据平面。
4.数据平面
在Service Mesh(服务网格)中,数据平面就是具体实现服务治理行为的代理。在Istio中数据平面由负责路由、负载均衡、服务发现、健康检查和授权/认证的Envoy代理组成。这些代理在每个服务实例的旁边运行(在k8s中,与应用容器运行在同一个Pod),拦截所有传入和传出的用户流量,并在这一过程中根据控制平面下发的服务治理规则进行流量管理。
5.Envoy
在Istio中,数据平面就是由Envoy代理实现的。它是一个现代的、高性能边缘的小型L7代理。Envoy是为大型现代微服务架构设计的,可以与Nginx和HAProxy等负载均衡器相匹配。
6.代理
在网络中,代理是一个中间服务器,位于客户端和服务端之间,可以管理请求和响应。在Istio服务网格情况下,代理(Envoy)运行在每个应用实例的前面。当向应用程序发起请求时,代理(Envoy)会拦截该请求,并将其转发给应用程序实例。同样地,当应用程序实例试图发出请求时,代理(Envoy)也会拦截出站请求并将其发送到目的地。
由于代理(Envoy)拦截了所有请求,所以它可以修改请求,从而实现流量路由、故障注入、授权等功能。
7.L7代理
L7(第7层)代理在OSI模型的应用层工作。在这一层,代理可以处理每个请求的内容。例如Http就是一个流行的L7协议。因为可以访问请求的数据,所以L7代理(Envoy)就可以根据请求的内容(URL、Cookies等)做出负载均衡的决定。
Istio的架构及模块组成
Service Mesh(服务网格)的架构方式为我们提供了一种统一的方式来连接、保护和观察微服务。网格内的代理(如Envoy)可以捕获网格内所有的通信请求和指标——每一次失败或成功的调用、重试或超时的请求都可以被捕获,并被可视化和报警。
这种将通信逻辑从业务和应用逻辑中分离出来的架构方式,可以使开发人员专注于业务逻辑,而服务网格运维人员则专注于服务网格配置。
前面通过对几个关键术语的解释,以及对服务网格架构好处的介绍,相信大家或多或少理解了什么是服务网格。接下来将重点介绍Istio这一开源的服务网格实现。
从宏观上看,Istio主要支持以下功能:
1.流量管理
流量管理是Istio最核心的功能,通过配置,可以控制服务之间的流量——例如设置断路器、超时或重试等服务治理机制,在Istio中都可以通过简单的配置改变来完成。
2.可观察性
Istio可以通过跟踪、监控和记录服务间的请求来更好地实现对服务的监控,方便我们了解服务运行情况,并及时发现和修复问题。
3.安全性
Istio可以在代理层面来管理认证、授权和通讯的加密,而无需对应用本身造成侵入。而这些安全配置操作只需要通过快速的配置变更即可完成。
接下来,我们看下Istio的架构组成。如下图所示:
如上图所示,Istio实现服务网格,仍然遵循了将组件分离成“控制平面”和“数据平面”这一常见的分布式系统构建模式。
Istio中的数据平面由Envoy代理组成,控制服务之间的通信。Envoy是一个用C 开发的高性能代理。Istio将Enovy代理作为一个sidecar容器注入到应用容器的旁边,然后拦截该服务的所有入站和出站流量。而这些注入应用容器旁边的Enovy代理组合在一起就构成了Istio服务网格的数据平面。
Istiod则是Istio的控制平面组件,主要提供服务发现、配置和证书管理等功能。Istiod采用YAML文件格式来编写流量控制规则,并将其转换为Envoy的可操作配置,之后通过xDS协议将配置传播给网格中的所有sidecar代理。
Istiod主要由Pilot、Citadel、Galley这三个组件组成。其中Pilot抽象了特定平台的服务发现机制(如Kubernetes、Consul或VM),并将其转换为可以被sidecar使用的标准格式。Citadel则是Istio的核心安全组件,实现证书授权、证书生成,实现数据平面中sidecar代理之间的mTLS安全通信。
而Galley则主要服务配置管理,包括验证配置信息的格式和内容正确性,并将这些配置信息提供给Pilot等其他控制平面组件使用。
Istio的流量管理实现
流量管理是Istio服务网格的核心能力。在《如何在Service Mesh微服务架构中实现金丝雀发布?》这篇文章中,我们通过Istio的流量管理功能,演示了在服务网格中实现灰度发布的具体方法。接下来,将从原理层面来总结下Istio实现流量管理的核心逻辑。
Istio流量管理示意图如下:
如上图所示,要在Istio服务网格中实现流量管理,需要通过VirtualService(虚拟服务)及DestinationRule(路由规则)资源来管理流量路由规则。
而具体的路由规则流量的执行由Istio网关资源来实现。其中Ingress Gateway(入口网关)和Egress Gateway(出口网关)是Istio服务网格组件的一部分,这两个网关都运行着一个Envoy代理实例,它们在服务网格的边缘作为负载均衡器运行,入口网关接收入站连接,而出口网关则接收从集群出去的连接。
需要注意,这里理解入口网关和出口网关的概念不要狭义的理解为就是Istio服务网格的边缘入口和出口。对于Istio服务网格来说除了外部流量的进出可以通过VitrualService(虚拟服务)关联Gateway(网关资源)来实现流量路由外,网格之间也可以通过该方式来实现流量的路由。
所以,在使用Istio服务网格来实现微服务的流量管理时,可以根据场景来分别创建针对外部流量的Gateway VirtualService资源,以及针对具体微服务网格间流量的Gateway VirtualService资源,并通过VitrualService随时修改相应的路由规则。
而对于Gateway网格资源的创建来说,则根据是控制入口流量还是出口流量来选择关联Ingress Gateway(入口网关)还是Egress Gateway(出口网关)。
如果上述描述暂时还未能让你完全理解Istio服务网格的流量管理方式,那么可以根据《如何在Service Mesh微服务架构中实现金丝雀发布?》这篇文章中演示的具体的例子进行体会。
后记
以上内容就是对Istio服务网格实现流量管理核心逻辑的简单介绍,也是为了方便大家理解之前文章中的一些操作。虽然目前以Istio服务网格架构还没有完全替代Spring Cloud微服务体系,但服务网格这种将控制平面和数据平面分离的架构思想,将是未来微服务架构的主流。
—————END—————