服务网格

服务网格 (Service Mesh)是一个用于管理、观测、支持工作负载实例之间安全通信的基础设施层。在实践中,Service Mesh 通常以轻量级网络代理阵列的形式实现,这些代理与应用程序代码部署在一起,而对应用程序来说无需感知代理的存在。

目前典型的 Service Mesh 开源项目有 IstioLinkerd,其中 Linkerd 是 CNCF 托管的项目,其背后的公司 Bouyant,该公司也是 Service Mesh 的早期推广者,Istio 则是 Google、IBM、Lyft 共同开源的一个项目,目前正在快速地演进中。

Service Mesh的控制平面
图片 - Service Mesh的控制平面

Service Mesh 通常由两部分组成——控制平面和数据平面。数据平面运行在 Sidecar 中,Sidecar 作为一个独立的容器和业务系统运行在同一个 Kubernetes 的 Pod 里面,或者作为一个独立的进程和应用程序进程运行在同一个虚拟机上,其主要充当业务系统的网络流量的代理。传统 RPC 中的服务发现、限流、熔断、链路追踪等能力都会下沉到 Sidecar 中。Sidecar 为应用程序提供了一个透明的网络基础设施,让业务在低侵入或者零侵入的情况获得更健壮的网络通信能力。

控制平面的特点

控制平面作为服务网格的管控面,具有如下特点:

  • 不直接解析数据包。
  • 与控制平面中的代理通信,下发策略和配置。
  • 负责网络行为的可视化。
  • 通常提供 API 或者命令行工具可用于配置版本化管理,便于持续集成和部署。

数据平面的特点

数据平面作为服务网格的执行层,具有如下特点:

  • 通常是按照无状态目标设计的,但实际上为了提高流量转发性能,需要缓存一些数据,因此无状态也是有争议的。
  • 直接处理入站和出站数据包,转发、路由、健康检查、负载均衡、认证、鉴权、产生监控数据等。
  • 对应用来说透明,即可以做到无感知部署。

服务网格为微服务带来的变革

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

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

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

服务网格的优势

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

可观察性

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

流量控制

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

安全

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

服务网格的局限性

服务网格带来了巨大变革,拥有其强大的技术优势,被称为第二代“微服务架构”。然而软件开发没有银弹,传统微服务架构有许多痛点,而服务网格也不例外,也有它的局限性。

增加了复杂度

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

较高的学习曲线

当前的服务网格几乎都建立在以 Kubernetes 为基础的云原生环境上,服务网格的运维人员需要同时掌握 Kubernetes 和服务网格两种技术,以便在在遇到问题时可以轻松应对。同时因为服务网格引入的新概念,也为开发人员带来了心智负担,需要平台层构建一个友好的用户界面,以降低开发人员的学习曲线。

性能影响

服务网格在服务链路中引入了 Sidecar proxy,因在系统调用中增加了跳转而带来了延迟。虽然该延迟是毫秒级别的,在大多数场景下是可以接受的,但是在某些需要高性能低延迟的的业务场景下,可能是难以容忍的。

results matching ""

    No results matching ""