searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享

什么是服务网格service-mesh?

2023-06-29 03:17:41
14
0

前言
服务网格service-mesh作为云原生cloudNative领域最炙手可热的领域,已经被绝大多数云厂商如GCE,AWS,AliCloud等广泛使用。服务网格为大规模复杂度极高的云原生服务提供了专有的基础设施层,减轻了业务人员的非业务投入压力。

但是service-mesh本身引入的概念难以理解,技术复杂度很高,并且大多数从业者在实际项目中,连云原生技术都很少使用到,更不要说基于云原生的service-mesh技术。

因此,本系列文章通过笔者在某大厂云原生改造过程中的总结实践,深入浅出的为您剖析service-mesh的全貌。希望让你进一步理解service-mesh的概念、技术细节、落地实践,对您个人的技术能力提升、负责的项目都能带来一定的收益。


一、服务网格service-mesh是什么?
服务网格service-mesh是一个形象化的词语表达:service(服务)-mesh(网格),它描述了服务间的依赖形态,就像下面这张网一样:

其中,深色的是我们平时工作中接触最多的业务微服务,旁边蓝色的被称为边车(sidecar)服务,sidecar作为业务微服务的“代理”,处理与其他业务微服务sidecar之间的非功能需求,如网络通信、安全、监控、流量控制等。多个sidecar之间的连接和交互组成了“网格(mesh)”。
对于服务网格,可以参考如下几个权威定义:

  1. 百科库
    在软件架构中,服务网格是一个专用的基础设施层,用于使用代理促进服务或微服务之间的服务到服务通信。专用通信层可以提供许多好处,例如提供对通信的可观察性,提供安全连接,或自动重试和回退失败的请求。
    服务网格由与应用程序中的每个服务配对的网络代理和一组任务管理流程组成。代理称为数据平面,管理进程称为控制平面。数据平面拦截不同服务之间的调用并“处理”它们;控制平面是网格的大脑,负责协调代理的行为,并为运维人员提供 API 来操作和观察整个网络

  2. servicemsh.es

根据如上引用的定义,总结一下服务网格的几个特点:

  • 非侵入式代理:服务网格引入的sidecar作为业务微服务的代理,承担了非业务功能:如流量管理、安全认证、监控运维等。sidecar卸载掉了业务微服务的通用功能,使得业务开发人员专注于业务逻辑开发,无需关注其他非业务需求。
  • 非业务公共能力解耦:业务微服务功能与sidecar非业务功能分离解耦,业务微服务专注于业务逻辑,与业务逻辑无关的DFX特性,如流量管理、安全认证、监控运维等,全部旁路到sidecar容器统一处理;
  • 管理面数据面分离:这也是服务网格的一大优势,通过将控制面与数据面分离解耦,达到不同问题域的解耦目标。控制面只聚焦安全、监控、流量等策略的处理和下发,数据面只聚焦如何执行策略,各自的故障不会相互影响,例如控制面的故障不会影响数据面的流量转发。后面会进一步介绍控制面数据面分离的架构。

二、为什么要使用服务网格?
服务网格的价值就在于将与业务无关的公共能力,解耦到单独的服务sidecar进行处理。为什么这样说?

我们可以简要回顾一个新业务服务的成长历程:
最开始业务比较简单,研发人员可以很直接的去编写业务代码。比如一个spring MVC的web服务,去执行一些简单的CURD逻辑。

随着业务的不断增长,用户量逐步增加,服务会面临很多的挑战,例如过载导致的服务请求超时、安全认证、日志调用链、业务无损的升级变更,这些都需要大量的研发和运维投入。而这些能力本质上,都是与业务无关的通用能力。

如果没有服务网格,每个业务服务都需要重复构建这些相似的功能,而且这些能力都需要侵入式的代码开发,投入较大并且对业务功能的可用性会造成影响,但是却对业务本身的增长没有任何收益。而服务网格通过注入非侵入的业务sidecar容器,无需修改业务服务任何一行代码,就可以提供流量治理、可观测性以及默认访问安全等能力,使业务服务可以低成本的享受这些能力。

三、服务网格的适用场景?
软件世界没有银弹,任何好的技术是把双刃剑,service-mesh也要结合具体场景、具体问题来看落地的可能性。

服务网格的设计初衷,就是为了解决业务服务的非业务功能部分复杂度。只要业务服务发展到一定规模,遇到了诸如分布式微服务内/外的流量调度问题、安全隔离和认证以及监控指标采集和全局调用链分析等,都可以复用服务网格的现有能力。

当然,服务网格的引入本身会带来额外的成本:包括资源投入成本、运维投入成本、业务服务改造成本,需要结合业务线的具体情况进一步评估:

资源投入成本:第一是网格控制面组件的引入(以istio为例,包括istiod,Prometeus,jagger),带来的部署资源消耗;第二是数据面的每个业务微服务都需要注入sidecar,带来的部署资源消耗和流量进出多一跳的性能消耗。尤其是数据面的性能消耗,对于某些性能敏感的微服务需要仔细评估。当然,也可以通过水平扩容的方式来解决。

运维投入成本:服务网格为业务服务提供了便捷的运维监控能力,但其自身引入的运维复杂度非常高,例如服务网格中最流行的istio,引入了VirtualService、DestinationRule、ServiceEntry等模型,动辄上百行的流量规则配置,在现网运维上需要非常大的投入。同时,端到端的追踪流量策略在哪些微服务上生成、下发、生效,目前也没有成熟的工具。

业务服务改造成本:服务网格体系一般是建立在云原生的体系架构上,即部署在K8s之上并且使用Prometeus,jagger,Zipkin等k8s生态组件。对于没有容器化的业务微服务如部署在VM、物理服务器的服务,需要先进行容器化改造后才能享受到服务网格的全部能力。

四、主流服务网格实现
如下是几种主流的服务网格产品的特性对比:

如上所述,Istio在流量治理领域支持丰富的流量策略如按流量比例切流、按请求header和path切流等;在安全韧性领域支持断路器、默认失败或超时重试、故障注入等;在平台支持性上,支持云原生的K8s、主流云厂商平台和多网格的扩展。同时Istio由Google主导并被很多大厂落地使用。 因此,后续文章以Istio作为服务网格的代表性产品,进一步深入探索。

总结
本文初步介绍了服务网格的基本概念、价值点、适用场景以及当前多种服务网格的产品特性对比,给想了解服务网格的各位读者一个初步的介绍,后续的文章会对服务网格当前最流行的开源项目istio为例,做深入的讲解。欢迎各位读者继续阅读。

参考:

  1. servicemesh.es
  2. Istio官方介绍
0条评论
0 / 1000
skip
4文章数
2粉丝数
skip
4 文章 | 2 粉丝

什么是服务网格service-mesh?

2023-06-29 03:17:41
14
0

前言
服务网格service-mesh作为云原生cloudNative领域最炙手可热的领域,已经被绝大多数云厂商如GCE,AWS,AliCloud等广泛使用。服务网格为大规模复杂度极高的云原生服务提供了专有的基础设施层,减轻了业务人员的非业务投入压力。

但是service-mesh本身引入的概念难以理解,技术复杂度很高,并且大多数从业者在实际项目中,连云原生技术都很少使用到,更不要说基于云原生的service-mesh技术。

因此,本系列文章通过笔者在某大厂云原生改造过程中的总结实践,深入浅出的为您剖析service-mesh的全貌。希望让你进一步理解service-mesh的概念、技术细节、落地实践,对您个人的技术能力提升、负责的项目都能带来一定的收益。


一、服务网格service-mesh是什么?
服务网格service-mesh是一个形象化的词语表达:service(服务)-mesh(网格),它描述了服务间的依赖形态,就像下面这张网一样:

其中,深色的是我们平时工作中接触最多的业务微服务,旁边蓝色的被称为边车(sidecar)服务,sidecar作为业务微服务的“代理”,处理与其他业务微服务sidecar之间的非功能需求,如网络通信、安全、监控、流量控制等。多个sidecar之间的连接和交互组成了“网格(mesh)”。
对于服务网格,可以参考如下几个权威定义:

  1. 百科库
    在软件架构中,服务网格是一个专用的基础设施层,用于使用代理促进服务或微服务之间的服务到服务通信。专用通信层可以提供许多好处,例如提供对通信的可观察性,提供安全连接,或自动重试和回退失败的请求。
    服务网格由与应用程序中的每个服务配对的网络代理和一组任务管理流程组成。代理称为数据平面,管理进程称为控制平面。数据平面拦截不同服务之间的调用并“处理”它们;控制平面是网格的大脑,负责协调代理的行为,并为运维人员提供 API 来操作和观察整个网络

  2. servicemsh.es

根据如上引用的定义,总结一下服务网格的几个特点:

  • 非侵入式代理:服务网格引入的sidecar作为业务微服务的代理,承担了非业务功能:如流量管理、安全认证、监控运维等。sidecar卸载掉了业务微服务的通用功能,使得业务开发人员专注于业务逻辑开发,无需关注其他非业务需求。
  • 非业务公共能力解耦:业务微服务功能与sidecar非业务功能分离解耦,业务微服务专注于业务逻辑,与业务逻辑无关的DFX特性,如流量管理、安全认证、监控运维等,全部旁路到sidecar容器统一处理;
  • 管理面数据面分离:这也是服务网格的一大优势,通过将控制面与数据面分离解耦,达到不同问题域的解耦目标。控制面只聚焦安全、监控、流量等策略的处理和下发,数据面只聚焦如何执行策略,各自的故障不会相互影响,例如控制面的故障不会影响数据面的流量转发。后面会进一步介绍控制面数据面分离的架构。

二、为什么要使用服务网格?
服务网格的价值就在于将与业务无关的公共能力,解耦到单独的服务sidecar进行处理。为什么这样说?

我们可以简要回顾一个新业务服务的成长历程:
最开始业务比较简单,研发人员可以很直接的去编写业务代码。比如一个spring MVC的web服务,去执行一些简单的CURD逻辑。

随着业务的不断增长,用户量逐步增加,服务会面临很多的挑战,例如过载导致的服务请求超时、安全认证、日志调用链、业务无损的升级变更,这些都需要大量的研发和运维投入。而这些能力本质上,都是与业务无关的通用能力。

如果没有服务网格,每个业务服务都需要重复构建这些相似的功能,而且这些能力都需要侵入式的代码开发,投入较大并且对业务功能的可用性会造成影响,但是却对业务本身的增长没有任何收益。而服务网格通过注入非侵入的业务sidecar容器,无需修改业务服务任何一行代码,就可以提供流量治理、可观测性以及默认访问安全等能力,使业务服务可以低成本的享受这些能力。

三、服务网格的适用场景?
软件世界没有银弹,任何好的技术是把双刃剑,service-mesh也要结合具体场景、具体问题来看落地的可能性。

服务网格的设计初衷,就是为了解决业务服务的非业务功能部分复杂度。只要业务服务发展到一定规模,遇到了诸如分布式微服务内/外的流量调度问题、安全隔离和认证以及监控指标采集和全局调用链分析等,都可以复用服务网格的现有能力。

当然,服务网格的引入本身会带来额外的成本:包括资源投入成本、运维投入成本、业务服务改造成本,需要结合业务线的具体情况进一步评估:

资源投入成本:第一是网格控制面组件的引入(以istio为例,包括istiod,Prometeus,jagger),带来的部署资源消耗;第二是数据面的每个业务微服务都需要注入sidecar,带来的部署资源消耗和流量进出多一跳的性能消耗。尤其是数据面的性能消耗,对于某些性能敏感的微服务需要仔细评估。当然,也可以通过水平扩容的方式来解决。

运维投入成本:服务网格为业务服务提供了便捷的运维监控能力,但其自身引入的运维复杂度非常高,例如服务网格中最流行的istio,引入了VirtualService、DestinationRule、ServiceEntry等模型,动辄上百行的流量规则配置,在现网运维上需要非常大的投入。同时,端到端的追踪流量策略在哪些微服务上生成、下发、生效,目前也没有成熟的工具。

业务服务改造成本:服务网格体系一般是建立在云原生的体系架构上,即部署在K8s之上并且使用Prometeus,jagger,Zipkin等k8s生态组件。对于没有容器化的业务微服务如部署在VM、物理服务器的服务,需要先进行容器化改造后才能享受到服务网格的全部能力。

四、主流服务网格实现
如下是几种主流的服务网格产品的特性对比:

如上所述,Istio在流量治理领域支持丰富的流量策略如按流量比例切流、按请求header和path切流等;在安全韧性领域支持断路器、默认失败或超时重试、故障注入等;在平台支持性上,支持云原生的K8s、主流云厂商平台和多网格的扩展。同时Istio由Google主导并被很多大厂落地使用。 因此,后续文章以Istio作为服务网格的代表性产品,进一步深入探索。

总结
本文初步介绍了服务网格的基本概念、价值点、适用场景以及当前多种服务网格的产品特性对比,给想了解服务网格的各位读者一个初步的介绍,后续的文章会对服务网格当前最流行的开源项目istio为例,做深入的讲解。欢迎各位读者继续阅读。

参考:

  1. servicemesh.es
  2. Istio官方介绍
文章来自个人专栏
杂货铺
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0