1.9 服务网格(Service Mesh)

服务网格是用于处理服务到服务通信的专用基础设施层。它负责通过包含现代云原生应用程序的复杂服务拓扑来可靠地传递请求。实际上,服务网格通常实现为多个轻量级网络代理,这些代理与应用程序代码一起部署,但不需要知道应用程序。

服务网格作为独立层的概念与云原生应用程序的兴起有关。在云原生架构中,借助于Kubernetes这样的编排器,单个应用程序可能包含数百个服务,每个服务可能有数千个实例,并且每个实例可能处于不断变化的状态。这就使得这些服务实例间的通信不仅非常复杂,而且确保端到端的性能和可靠性至关重要。

目前,服务网格已成为云原生堆栈的关键组件。Paypal、Ticketmaster和Credit Karm等高流量公司都为其生产应用程序添加了服务网格,2017年1月,Linkerd(云原生应用程序的开源服务网格)成为云原生计算基金会的官方项目,同年5月IBM和Google共同发布开源Istio。

服务网格并没有给软件开发和部署带来新功能,它解决的是其他工具已经解决过的问题,只不过这次是针对云原生架构下的Kubernetes环境的实现。服务网格的主要特点有:

● 应用程序间通信的中间层。

● 轻量级网络代理。

● 应用程序无感知。

● 解耦应用程序的重试/超时、监控、追踪和服务发现。

目前两款流行的服务网格开源软件Istio和Linkerd都已经在Kubernetes中集成,但是Istio的接受度和采用量更多一些。

Istio是一个源代码开放的平台,用于管理和保护微服务。Istio与编排器(如Kubernetes)配合使用,可管理和控制服务之间的通信。

Istio使用伴生模式来运行。伴生模式(Envoy代理)是一个单独进程,与应用程序一起使用。伴生可管理与服务之间的所有往来通信,并将公共级别的功能应用于所有服务,与用于构建服务的编程语言或框架无关。实际上,Istio提供了一种机制,以集中方式配置路由和安全策略,以分散方式通过伴生来应用这些策略。

在大多数情况下,本书建议使用Istio提供的功能,而不要使用不同编程语言或框架提供的类似功能。例如,基础架构能以更一致的方式对负载均衡和其他路由策略进行定义、管理和强制实施。

在某些情况下,与分布式跟踪一样,Istio和应用程序级别的库是互补的,可以同时使用这两者来改进操作。对于分布式跟踪,Istio只能确保在请求中包含跟踪信息;应用程序库提供了有关请求之间关系的重要上下文。将Istio与支持库或框架库一起使用时,可使读者对系统请求的路由过程有一个总体了解。

Istio从最高层上扩展了Kubernetes平台,提供了额外的管理概念、可视性和安全性。Istio的功能可以细分为以下四个类别:

● 流量管理:控制微服务之间的流量,以执行流量分割、故障恢复和金丝雀发布。

● 安全性:在微服务之间提供基于身份的强认证、授权和加密。

● 可观察性:收集度量值和日志,以更好地了解集群中运行的应用程序。

● 策略:强制实施访问控制、速率限制和配额,以保护应用程序。

具体内容可以参阅Istio官方文档。