深入理解Istio:云原生服务网格进阶实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 Service Mesh基本概念

2019年,在众多热门技术的趋势中,云原生的关注度居高不下,很多开发者都对由此兴起的一众技术十分追捧,众多企业又开始探索云原生架构的转型与落地。这一年,中国的开发者们经历了从关注“云原生概念”到关注“云原生落地实践”的转变。而Service Mesh技术也因此越来越火热,受到越来越多的开发者的关注,并拥有了大批拥护者。那么,Service Mesh是什么呢?它为什么会受到开发者的关注?它和传统微服务框架有什么区别?

Service Mesh一词最早由开发Linkerd的Buoyant公司提出,并于2016年9月29日第一次公开使用。William Morgan、Buoyant CEO对Service Mesh这一概念定义如下:

Service Mesh是一个专门处理服务通信的基础设施层。它的职责是在由云原生应用组成服务的复杂拓扑结构下进行可靠的请求传送。在实践中,它是一组和应用服务部署在一起的轻量级的网络代理,且对应用服务透明。

以上这段话有4个关键点。

•本质:基础设施层。

•功能:请求分发。

•部署形式:网络代理。

•特点:透明。

2017年,随着Linkerd的传入,Service Mesh进入国内社区的视野,并且由国内的“技术布道师”翻译成“服务网格”。

服务网格从总体架构上来讲比较简单,由一堆紧挨着各项服务的用户代理,外加一组任务管理流程组成。在服务网格中,代理被称为数据层或数据平面(Data Plane),管理流程被称为控制层或控制平面(Control Plane)。数据层截获不同服务之间的调用并对其进行处理;控制层不仅可以协调代理的行为,而且可以通过为运维人员提供API,操控和测量整个网络。

更进一步地说,服务网格是一个专用的基础设施层,旨在“在微服务架构中实现可靠、快速和安全的服务间调用”。它不是一个“服务”的网格,而是一个“代理”的网格,服务可以插入这个“代理”的网格中,从而使网络抽象化。在典型的服务网格中,这些代理作为一个Sidecar(边车)被注入每个服务部署中。服务不直接通过网络调用服务,而是调用它们本地的Sidecar代理,而Sidecar代理又代表了服务管理请求,从而封装了服务间通信的复杂性。相互连接的Sidecar代理实现了所谓的数据平面,这与用于配置代理和收集指标的服务网格组件(控制平面)形成对比。

总而言之,Service Mesh的基础设施层主要分为两部分:控制平面与数据平面。当前流行的两款开源服务网格Istio和Linkerd实际上都是这种构造。

控制平面的特点:

•不直接解析数据包。

•与控制平面中的代理通信、下发策略和配置。

•负责网络行为的可视化。

•通常提供API或命令行工具,可用于配置版本化管理,便于持续集成和部署。

数据平面的特点:

•通常是按照无状态目标设计的,但实际上为了提高流量转发效率,需要缓存一些数据,因此无状态也是有争议的。

•直接处理入站和出站数据包,如转发、路由、健康检查、负载均衡、认证、鉴权、监控数据等。

•对应用来说透明,可以做到无感知部署。

那么,服务网格的出现带来了哪些变革呢?

第一,微服务治理与业务逻辑的解耦。服务网格把SDK中的大部分功能从应用中剥离出来,拆解为独立进程,以Sidecar的模式进行部署。服务网格通过将服务通信及相关管控功能从业务程序中分离并下沉到基础设施层,使其和业务系统完全解耦,使开发人员更加专注于业务本身。

注意,这里提到了一个词“大部分”,在SDK中往往需要保留协议编解码的逻辑,甚至在某些场景下还需要一个轻量级的SDK来实现细粒度的治理与监控策略。例如,要想实现方法级别的调用链路追踪,服务网格就需要业务应用实现Trace ID的传递,而这部分实现逻辑也可以通过轻量级的SDK实现。因此,从代码层面来讲,服务网格并非零侵入的。

第二,异构系统的统一治理。随着新技术的发展和人员的更替,即使在同一家公司也会出现不同语言、不同框架的应用和服务。为了统一管控这些服务,以往的做法是为每种语言、每种框架都开发一套完整的SDK,不仅维护成本非常高,而且会给公司的中间件团队带来很大的挑战。有了服务网格之后,可以将主体的服务治理功能下沉到基础设施,多语言的支持就会轻松很多。只需提供一个非常轻量级的SDK,甚至在很多情况下都不需要一个单独的SDK,就可以轻松实现多语言、多协议的统一流量管控、监控等需求。

此外,相对于传统微服务框架,服务网格还拥有三大技术优势。

•可观察性。因为服务网格是一个专用的基础设施层,所有的服务间通信都需要通过它,所以它在技术堆栈中处于独特的位置,以便在服务调用级别上提供统一的遥测指标。这意味着,所有服务都被监控为“黑盒”。服务网格捕获诸如来源、目的地、协议、URL、状态码、延迟、持续时间等线路数据。这在本质上等同于Web服务器日志可以提供的数据,但是服务网格可以为所有服务捕获这些数据,而不仅仅是单个服务的Web层。需要指出的是,收集数据只是解决微服务应用程序中可观察性问题的一部分。存储与分析这些数据则需要额外功能的机制补充,并作用于警报或实例自动伸缩等。

•流量控制。服务网格可以为服务提供智能路由(蓝绿部署、金丝雀发布、A/B测试)、超时重试、熔断、故障注入、流量镜像等各种控制功能。以上这些是传统微服务框架所不具备的功能,但对系统来说是至关重要的功能。这是因为服务网格承载了微服务之间的通信流量,所以可以在服务网格中通过规则进行故障注入,模拟部分微服务出现故障的情况,对整个应用的健壮性进行测试。由于服务网格的设计目的是有效地将来源请求调用连接到其最优目标服务实例中,因此这些流量控制特性是面向目的地的。这正是服务网格流量控制功能的一大特点。

•安全。在某种程度上,单体架构应用受其单地址空间的保护。然而,一旦单体架构应用被分解为多个微服务,网络就会成为一个重要的攻击面。更多的服务意味着更多的网络流量,这对黑客来说意味着拥有更多的机会来攻击信息流。而服务网格恰恰提供了保护网络调用的功能和基础设施。服务网格安全的相关好处主要体现在以下3个核心领域:服务的认证、服务间通信的加密,以及安全相关策略的强制执行。

服务网格拥有极其强大的技术优势,带来了巨大变革,被称为“第二代微服务架构”。然而就像之前说的软件开发没有“银弹”,传统微服务架构有许多痛点一样,服务网格也有它的局限性,具体如下。

•增加了复杂度。服务网格将Sidecar代理和其他组件引入已经很复杂的分布式环境中,会极大地增加整体链路和操作运维的复杂性。

•运维人员需要更专业。在容器编排工具(如Kubernetes)上添加Istio之类的服务网格,需要运维人员成为这两种技术的专家,以便充分使用二者的功能,以及定位环境中遇到的问题。

•延迟。从链路层面来讲,服务网格是一种侵入性的、复杂的技术,可以为系统调用增加明显的延迟。虽然这个延迟是毫秒级别的,但是在特殊业务场景下,这个延迟可能是令人难以容忍的。

•平台的适配。服务网格的侵入性迫使开发人员和运维人员适应平台并遵守平台的规则。