Service Mesh服务网格
构建微服务很容易,操作微服务体系结构很困难。Service Mesh可以用来管理微服务。
一、什么是Service Mesh?
Service Mesh是用于处理服务间通信的基础设施层,用于在云原生应用复杂的服务拓扑中实现可靠的请求传递.
Service Mesh与传统基础设施层不同之处在于,它形成了一个分布式的互连代理网络,以sidecar形式部署在服务两侧,服务对于代理无感知,且服务间所有通信都由代理进行路由。
二、为什么要使用Service Mesh?
最近两三年来微服务方兴未艾, 可以看到越来越多的公司和开发人员陆陆续续投身到微服务架构, 让一个一个的微服务项目落地。
但是,在这一片叫好的喧闹中, 我们还是发觉一些普遍存在的问题:虽然微服务对开发进行了简化,通过将复杂系统切分为若干个微服务来分解和降低复杂度,使得这些微服务易于被小型的开发团队所理解和维护。但是,复杂度并非从此消失。微服务拆分之后,单个微服务的复杂度大幅降低,但是由于系统被从一个单体拆分为几十甚至更多的微服务,就带来了另外一个复杂度:微服务的连接、管理和监控。
先来看看处理服务间通信时需要关注的点:
- 服务发现
- 负载均衡
- 路由
- 流量控制
- 通信可靠性
- 弹性
- 安全
- 监控/日志
一个已经被广泛应用的解决方案是(1)利用api网关来处理服务外部和服务之间的请求,提供例如服务发现、路由、监控、流量控制等。
然而,api网关有一个比较致命的缺陷,它容易出现单点故障并且实践不当很有可能会变得异常臃肿。另一方面,api网关核心是面向用户,也就是说它可以解决从用户到微服务的流量问题,但不能解决所有问题,而我们需要的是一个完整的方案,或者至少是一些能够与api网关互补的方案和工具。
另一种选择是(2)在网络堆栈的较低层级(4/3)进行可靠性、监控、流量控制等方面处理。这种选择的问题是,在较低的操作难以满足应用层的问题。联想end-to-end(端到端)的理论,我们前面提到的那几个关注点实际上还是集中在应用层,也只能在应用层成功实现。
像Netflix、Twitter等SOA/微服务的早期采用者,他们通过建立内部库的方式处理这些问题,然后提供给所有服务使用。这种方法的问题在于,把库扩展到成百上千个微服务中难度极高,而且这些库相对来说是比较”脆弱“的,我们很难保证他们可以适应所有的技术堆栈选择。
程度上来说,Service Mesh与这些库很类似,但Service Mesh是与服务相邻的独立进程。服务连接到代理,代理反过来又与其他代理(HTTP1.1/2、GRPC)进行通信。它们是相对独立的进程,在应用层或应用层之下分布和运行,进而解决了上述两个方案(1)(2)存在的缺陷。
三、架构
Service Mesh架构中的代理是使用边车(sidecar)模式来实施的:边车在概念上附属于主(或父)应用程序,提供平台功能以补充该父应用程序。借助这种模式,你的微服务就可以将边车用作同一个微服务容器里面的一组进程,也可以用作其自个容器中的边车,充分利用平台功能,比如路由、负载均衡、弹性、深度监控和访问控制。
Control plane定义服务发现、路由、流量控制等策略。这些策略可以是全局的,也可以是限定的。Data plane负责在通信时应用和执行这些策略,调解和控制微服务之间所有的网络通信。
服务网格的典型边车部署方式:
图中应用作为服务的发起方,只需要用最简单的方式将请求发送给本地的服务网格代理,然后网格代理会进行后续的操作,如服务发现,负载均衡,最后将请求转发给目标服务。当有大量服务相互调用时,它们之间的服务调用关系就会形成网格,如下图所示:
在上图中绿色方块为服务,蓝色方块为边车部署的服务网格,蓝色线条为服务间通讯。可以看到蓝色的方块和线条组成了整个网格。
在Istio网站上详细解释了这一概念(服务网格):如果我们可以在架构中的服务和网络间透明地注入一层,那么该层将赋予运维人员对所需功能的控制,同时将开发人员从编码实现分布式系统问题中解放出来。通常将这个统一的架构层与服务部署在一起,统称为“服务啮合层”。由于微服务有助于分离各个功能团队,因此服务啮合层有助于将运维人员从应用特性开发和发布过程中分离出来。通过系统地注入代理到微服务间的网络路径中,Istio将迥异的微服务转变成一个集成的服务啮合层。
四、考虑使用Service Mesh的最重要的三个因素是什么?
4.1 安全
由于Service Mesh是在数据平面(data plane)上操作的,可以跨网格提供应用安全保障,相比Kubernetes等多层环境提供了更大的安全性。Service Mesh确保了服务间的通信,这样您就可以知道服务正在与谁通信以及通信是否可信。
4.2 可观察性
微服务空间中的大多数故障发生在服务之间的交互过程中,因此对这些事务的“视图化”可以帮助团队更好地管理体系结构以避免故障。Service Mesh为您的服务相互交互时所发生的事情提供了一个视图。Service Mesh还大大提高了跟踪能力,并提供了添加跟踪而不触及所有应用的能力,也就是我们所说的Service Mesh代码无侵入和透明性。
4.3 简单
Service Mesh不是一种新技术,而是一种模式,使基础设施层的管理更加简单。例如当我们在服务发现方面只需要找到服务并进行连接,那么DNS就够了,但DNS不能提供快速重试或健康度监视,而这是Service Mesh可以提供的,便于我们解决更高级的问题。您可以将一些东西拼凑在一起,以解决Service Mesh所解决的大部分问题,但是如果您可以只与提供一次性、可重用打包的Service Mesh交互,您为什么还要费力拼凑呢?