三分钟带你初步了解Service Mesh开源实现之Istio架构

Posted 风平浪静如码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三分钟带你初步了解Service Mesh开源实现之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流量管理示意图如下:

如上图所示,要在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服务网格实现流量管理核心逻辑的简单介绍,也是为了方便大家理解之前文章中的一些操作。虽然目前以Istio服务网格架构还没有完全替代Spring Cloud微服务体系,但服务网格这种将控制平面和数据平面分离的架构思想,将是未来微服务架构的主流。

五分钟了解 Service Mesh

 
1 背景
 
1.1 多语言
 
微服务理念是提倡不同业务使用最适合它的语言开发,现实情况也确实如此,尤其是AI的兴起,一般大型互联网公司存在 C/C++、Java、Golang、PHP、Python、NodeJs 等语言的项目,这就意味着每种语言都需要实现了相同功能服务框架。然而,服务框架的 SDK 通常实现都比较重,需要实现服务注册与发现、服务路由、负载均衡、服务鉴权、服务降级、服务限流、网络传输等功能,所以这块的成本不言而喻。
 
1.2 产品交付
 
在伴随着服务组件的功能升级,bug 修复过程中,业务系统需要升级依赖的服务组件包,升级中还可能存在各种版本冲突,而且灰度验证过程也可能存在 bug,业务升级版本痛苦不堪,往往一个组件包想要全覆盖升级,需要耗费相当长的时间,交付效率极其低下。随着业务的不断发展,业务的规模和我们交付的效率已经成为主要的矛盾,所以组件团队期望以更高的效率去研发基础设施,而不希望基础设施的迭代受制于这个组件的使用规模。
 
1.3 云原生
 
在云原生架构里,单个应用程序可能由数百个服务组成; 每个服务可能有数千个实例; 而且这些实例中的每一个都可能处于不断变化的状态,因为它们是动态调度一个像 Kubernetes 一样的编排器。服务间通信不仅异常复杂,而且也是运行时行为的基础。管理好服务间通信对于保证端到端的性能和可靠性来说是非常重要的。因此,管理好服务间通信对于保证端到端的性能和可靠性来说是非常重要的。
 
基于以上背景,Service Mesh 产生了。
 
2 是什么
 
在上述背景下业界也做了一些探索,比如唯品会在服务调用方增加了 Proxy 层,将服务组件公共的逻辑功能放在 Proxy 中实现,剩下与业务交互的 API 功能放在 Client 中实现,这样来降低多语言的成本。另外,新浪微博也使用 Proxy 方案提供小众语言的服务注册和调用的支持。其实这种 Proxy 结构类似现在的 Service Mesh,只是当时还没有 Service Mesh 这个名词。
 
在 2016 年 Buoyant 的 CEO William 提出了 Service Mesh 的概念。Service Mesh 是一种基础设施层,主要处理服务间的通信,在复杂的云原生服务拓扑中,负责请求的可靠传递。一般实现为网络代理,通常与业务服务部署在一起,业务服务不感知。
 
3 能做什么
 
3.1 服务发现
 
以微服务模式运行的应用变更非常频繁,应用实例的频繁增加减少带来的问题是如何精确地发现新增实例以及避免将请求发送给已不存在的实例变得更加复杂。Service Mesh 可以提供简单、统一、平台无关的多种服务发现机制,如基于 DNS,K/V 键值对存储的服务发现机制。
 
3.2 动态路由
 
随着服务提供商以提供高稳定性、高可用性以及高 SLA 服务为主要目标,为了实现所述目标,出现各种应用部署策略尽可能从技术手段达到无服务中断部署,以此避免变更导致服务的中断和稳定性降低,例如:Blue/Green 部署、Canary 部署,但是实现这些高级部署策略通常非常困难。如果可以轻松的将应用流量从一个版本切到另外一个版本,更或者从一个数据中心到另外一个数据中心进行动态切换,甚至可以通过一个中心控制层控制多少比例的流量被切换。那么 Service Mesh 提供的动态路由机制和特定的部署策略如 Blue/Green 部署结合起来,实现上述目标更加容易。
 
3.3 负载均衡
 
运行环境中微服务实例通常处于动态变化状态,而且经常可能出现个别实例不能正常提供服务、处理能力减弱、卡顿等现象。但由于所有请求对 Service Mesh 来说是可见的,因此可以通过提供高级负载均衡算法来实现更加智能、高效的流量分发,降低延时,提高可靠性。
 
3.4 请求熔断
 
动态的环境中服务实例中断或者不健康导致服务中断可能会经常发生,这就要求应用或者其他工具具有快速监测并从负载均衡池中移除不提供服务实例的能力,这种能力也称熔断,以此使得应用无需消耗更多不必要的资源不断地尝试,而是快速失败或者降级,甚至这样可避免一些潜在的关联性错误。而 Service Mesh 可以很容易实现基于请求和连接级别的熔断机制。
 
3.5 安全通讯
 
无论何时,安全在整个公司、业务系统中都有着举足轻重的位置,也是非常难以实现和控制的部分。而微服务环境中,不同的服务实例间通讯变得更加复杂,那么如何保证这些通讯是在安全、授权情况下进行非常重要。通过将安全机制如 TLS 加解密和授权实现在 Service Mesh 上,不仅可以避免在不同应用的重复实现,而且很容易在整个基础设施层更新安全机制,甚至无需对应用做任何操作。
 
3.6 多语言支持
 
由于 Service Mesh 作为独立运行的透明代理,很容易支持多语言。
 
3.7 多协议支持
 
同多语言支持一样,实现多协议支持也非常容易。
 
3.8 Metric和链路追踪
 
Service Mesh 对整个基础设施层的可见性使得它不仅可以暴露单个服务的运行数据,而且可以暴露整个集群的运行数据。
 
3.9 重试
 
Service Mesh 的重试功能避免将其嵌入到业务代码,同时最后期限使得应用允许一个请求的最长生命周期,而不是无休止的重试。
 
4 如何实现
 
Service Mesh 最终实现是使用 Sidecar 边车部署方式,将服务发现,服务路由,负载均衡等功能实现在 Sidecar 内,Sidecar 作为一个单独的进程与业务服务部署在同一个机器上。 Sidecar 内部的具体实现称为数据平面,而作为 Sidecar 的控制逻辑,称之为控制平面。
技术分享图片
如上图中,应用作为服务的发起方,只需要用最简单的方式将请求发送给本地的服务网格代理,然后网格代理 Sidecar 会进行后续的操作,如服务发现,负载均衡等,最后将请求转发给目标服务。当有大量服务相互调用时,它们之间的服务调用关系就会形成一种类似网格的形式。
 
Service Mesh 给基础组件带来了新的方向,可以通过 Service Mesh 的 Sidecar,将基础组件的功能下层到 Sidecar 内,对业务透明,方便升级维护,并且解决多语言的问题。
 
5 优势
 
5.1 多语言
 
由于 Service Mesh 共享了大部分的组件功能,所以在多语言实现上,更加简单,各自的语言只需实现一些简单的逻辑,就能提供的服务组件所有功能,从而大大降低多语言服务组件的实现成本。
 
5.2 产品交付
 
组件的大部分功能移至 Service Mesh 中,与业务逻辑隔离,可单独进行升级,运维,对业务透明,提升了组件的交付能力。超越 Spring Cloud 和 Dubbo 等传统开发框架之处在于不仅仅带来了远超这些框架所能提供的功能,更重要的是不需要应用程序为此做大量的改动, 开发人员也不必为上面的功能实现进行大量的知识储备,降低学习服务组件的使用成本。
 
5.3 云原生
 
在复杂的云原生架构中,Service Mesh 能更好的管理服务间通信对于保证端到端的性能和可靠性来说是非常重要的。
 
6 问题
 
6.1 性能
 
Service Mesh 方式的服务调用,相比服务框架的直接调用,增加了与 Service Mesh 中 Sidecar 的交互,必然会牺牲部分性能,但由于是本地网络通信,不经过网络层传输,其性能损耗应该在可控范围内。
 
6.2 可用性
 
Service Mesh 方式是通过单独的本地进程来提供为应用程序提供服务,也就在整个服务调用链上增加了故障点,势必会导致可用性下降,这就对 Service Mesh 的整体设计提出了更高的要求,来保证服务的可用性。
 
7 展望
 
有文章提到 Service Mesh 将是下一代服务架构,我们也期待 Service Mesh 更好的发展,给业务提升更多的便利,降低开发成本,提供更好的技术服务。
 
 
喜欢本文的同学,可以关注涤生的博客
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

以上是关于三分钟带你初步了解Service Mesh开源实现之Istio架构的主要内容,如果未能解决你的问题,请参考以下文章

Service Mesh实战 手把手带你学会Istio

入门了解Service Mesh + Istio?从本文开始

Istio 迎来版本 1.0:一种开源的 Service Mesh

5分钟带你了解 ZooKeeper 的原理

五分钟带你入门软件测试,从外在到内在初步了解!(建议收藏)

Service Mesh 开源实现之 Istio 架构概览