软件架构技术21:云原生ServiceMesh实现原理

文摘   2024-07-15 20:32   广东  

服务网格(Service Mesh)是未来的微服务架构,也是云原生王牌产品,所以掌握好服务网格就很重要了,下面我就全面来详解服务网格

一、ServiceMesh基本概念


服务网格(Service Mesh),是新一代的微服务架构,主要处理服务之间的通信。

服务网格(Service Mesh),最早在2016年9月由开发Linkerd的Buoyant公司提出,是一个形象化的词语表达:Service(服务)和Mesh(网格)。

如下图所示:

它描述了服务间的依赖形态,就像上面这张网一样,其中深色是接触最多的业务微服务,旁边蓝色的被称为边车Sidecar服务。

为什么需要服务网格

传统的服务治理,要求在业务代码里集成服务框架的 SDK,这显然与云原生应用的理念相悖,因此迫切需要一种对业务代码无侵入的适合云原生应用的服务治理方式

为了解决这个问题,业界出现了一种对业务代码无侵入的适合云原生应用的服务治理方式,其中的核心概念是通过Sidecar代理实现。

服务治理功能被抽象为一个独立的Sidecar代理,它与每个微服务实例部署在同一个主机或容器中,作为服务的附属组件运行Sidecar称为边车模式,因为类似连接到摩托车的边车,从而得名。

边车模式,通过给应用程序添加边车的方式来,拓展应用程序现有的功能,比如:日志记录、流量控制、服务注册和发现、限流熔断等功能。

通过添加边车实现,微服务只需要专注实现业务逻辑即可,实现了控制、和逻辑的分离与解耦。

这种对业务代码无侵入的服务治理方式,更好地符合了云原生应用的理念,使得微服务架构更易于构建、部署和维护。

服务网格的主要功能

服务发现与负载均衡

服务网格通过内置的服务发现机制,能够自动检测新服务实例的加入或退出,并更新路由表,实现动态负载均衡。它支持多种负载均衡算法,如轮询(Round Robin)、最小连接数(Least Connections)、基于请求速率的负载均衡等,从而优化流量分配,提高服务性能。

安全通信

服务网格通过TLS(传输层安全协议)加密来保护服务间通信的安全,并且可以实现服务身份验证和授权,确保只有经过认证的服务才能互相通信。此外,服务网格还能实现细粒度的访问控制,防止未经授权的访问和数据泄露。

流量管理

服务网格支持丰富的流量管理功能,包括:

  • 智能路由:根据请求的不同属性(如HTTP头、路径、方法等)实现请求路由的动态调整。

  • 重试和超时:对失败的请求进行自动重试,并设置超时时间,提高请求的成功率。

  • 熔断和限流:在服务出现故障时,迅速切断故障服务的请求,防止问题扩大,并对请求速率进行控制,避免服务过载。

监控和可观测性

服务网格能够收集详细的通信数据,包括请求的延迟、错误率、流量等指标,并提供分布式追踪功能,帮助开发和运维人员快速定位和解决问题。常见的监控工具有Prometheus、Grafana、Jaeger等,它们与服务网格无缝集成,提供强大的可视化和分析能力。


二、服务网格实现原理


服务网格关键组件

ServiceMesh架构,如下图所示:

在服务网格中,控制面板、业务逻辑和Sidecar边车是三个重要的概念,它们共同构成了服务网格架构的关键部分。

1、控制面板

控制面板是服务网格架构中的一个重要组成部分,主要用于配置、管理和监控数据平面中的Sidecar代理。

常见的控制面板组件,包括:Pilot、Citadel、Galley、Mixer..等,它们协同工作,为数据平面提供服务发现、负载均衡、安全认证、流量控制等功能。

2、业务逻辑

业务逻辑,非常容易理解,指的是实际的应用程序代码,它包含了服务的业务逻辑、和功能实现。

比如:上图的ServiceA业务逻辑、ServiceB业务逻辑、ServiceC业务逻辑...等,分别代表具体的业务逻辑的实现。

与传统的服务治理方式不同,服务网格的设计理念是将通信和管理逻辑与业务逻辑解耦

使得业务逻辑无需关注通信细节,从而实现服务的可移植性、可测试性和可维护性。

3、Sidecar边车

在服务网格架构中,Sidecar是一种轻量级的代理模式,它与每个微服务实例一起部署在同一个主机或容器中,作为服务的附属组件运行。

Sidecar代理负责拦截、和处理服务之间的所有通信流量,并与控制平面进行交互

主要实现:服务发现、负载均衡、安全认证、监控和跟踪等功能。

  1. 通信拦截:Sidecar代理负责:拦截服务之间的所有通信流量,包括:入站、和出站的请求和响应。

  2. 服务发现:Sidecar代理负责:向服务注册中心注册服务实例,并根据需要动态地发现、和管理服务实例。

  3. 负载均衡:Sidecar代理可以根据配置的负载均衡算法,将请求分发到多个服务实例中,以提高服务的可用性和性能。

  4. 监控和跟踪:Sidecar代理负责:收集和传输服务间的通信流量数据,以实现监控、日志记录、错误追踪和性能调优等功能。

通过Sidecar边车的部署,可以实现对业务代码的无侵入性,使得业务逻辑无需关注通信和管理功能的实现细节。


三、服务网格产品


常见的服务网格产品有Linkerd、Envoy、Istio、Conduit

1、Linkerd

Linkerd是Buoyant公司2016年率先开源的高性能网络代理程序,是业界的第一款Service Mesh产品,甚至可以说Linkerd的诞生即Service Mesh时代的开始,其引领后来Service Mesh的快速发展。其主要用于解决分布式环境中服务之间通信面临的一些问题,比如网络不可靠、不安全、延迟丢包等问题。Linkerd使用Scala语言编写,运行于JVM,底层基于Twitter的Finagle库,并对其做相应的扩展。最主要的是Linkerd具有快速、轻量级、高性能等特点,每秒以最小的时延及负载处理万级请求,易于水平扩展,经过产线测试及验证,可运行任何平台的产线级Service Mesh工具。Linkerd除了具有上述所阐述的Service Mesh的功能外,还具有下列功能:

  • 支持多平台,可运行于多种平台,比如Kubernetes、DC/OS、Docker甚至虚拟机或者物理机

  • 无缝集成多种服务发现工具

  • 支持多协议,如gRPC、HTTP/2、HTTP/1.x,甚至可通过linkerd-tcp支持TCP协议

  • 支持与第三方分布式追踪系统Zipkin

  • 灵活性、扩展性高,可通过其提供的接口开发自定义插件

Service Mesh由数据平面和控制平面构成,事实上,Linkerd本身是数据平面,负责将数据路由到目标服务,同时保证数据在分布式环境中传输是安全、可靠、快速的。另外,Linkerd还包括控制平面组件Namerd,通过控制平面Namerd实现中心化管理和存储路由规则、中心化管理服务发现配置、支持运行时动态路由以及暴露Namerd API管理接口。

2、Envoy

同Linkerd一样,Envoy也是一款高性能的网络代理程序,于2016年10月份由Lyft公司开源,为云原生应用而设计,可作为边界入口,处理外部流量,当然,也作为内部服务间通信代理,实现服务间可靠通信。Envoy的实现借鉴现有产线级代理及负载均衡器,如Nginx、HAProxy、硬件负载均衡器及云负载均衡器的实践经验,同时基于C++编写及Lyft公司产线实践证明,Envoy性能非常优秀、稳定。Envoy既可用作独立代理层运行,也可作为Service Mesh架构中数据平面层,因此通常Envoy跟服务运行在一起,将应用的网络功能抽象化,Envoy提供通用网络功能,实现平台及语言无关。作为Service Mesh工具,Envoy除了支持上述Service Mesh的功能外,还有下列功能:

  • 大规模负载下,Envoy保证P99延时非常低

  • 优先支持HTTP/2和gRPC,同时支持Websocket和TCP代理

  • API驱动的配置管理方式,支持动态管理、更新配置以及无连接和请求丢失的热重启功能

  • L3/L4层过滤器形成Envoy核心的连接管理功能

  • 通过与多种指标收集工具及分布式追踪系统集成,实现运行时指标收集,分布式追踪,提供整个系统及服务的运行时可见性

  • 内存资源使用率低,sidecar是Envoy最常用的部署模式

3、Istio

Istio为一款开源的为微服务提供服务间连接、管理以及安全保障的平台软件,支持运行在Kubernetes、Mesos等容器管理工具,但不限于Kubernetes、Mesos,其底层依赖于EnvoyIstio提供一种简单的方法实现服务间的负载均衡、服务间认证、监控等功能,而且无需应用层代码调整。其控制平面由Mixer、Pilot及Citadel组成,数据平面由Envoy实现,通常情况下,数据平面代理Envoy以sidecar模式部署,使得所有服务间的网络通信均由Envoy实现,而Istio的控制平面则负责服务间流量管理、安全通信策略等功能。由于其底层是Envoy,Envoy支持的各种功能以及Service Mesh要求的功能Istio均支持,除此之外还有以下功能:

  • 完善的流量管理机制,如故障注入

  • 增强服务间安全保障,如服务身份认证,密钥管理和基于RBAC的访问控制策略

  • 支持多平台部署

4、Conduit

Conduit于2017年12月发布,作为由Buoyant继Linkerd后赞助的另一个开源项目。Conduit旨在彻底简化用户在Kubernetes使用服务网格的复杂度,提高用户体验,而不是像Linkerd一样针对各种平台进行优化。Conduit的主要目标是轻量级、高性能、安全并且非常容易理解和使用。同Linkerd和Istio, Conduit也包含数据平面和控制平面,其中数据平面由Rust开发,使得Conduit使用极少的内存资源,而控制平面由Go开发。Conduit依然支持Service Mesh要求的功能,而且还包括以下功能:

  • 超级轻量级及极快的性能,亚毫秒级P99延迟

  • 专注于支持Kubernetes平台,提高运行在Kubernetes平台上服务的可靠性、可见性及安全性

  • 支持gRPC、HTTP/2和HTTP/1.x请求及所有TCP流量

Conduit以极简主义架构,以零配置理念为中心,旨在减少用户与Conduit的交互,实现开箱即用。作为Buoyant公司的第二款Service Mesh软件,其设计依据Linkerd在产线的实际使用经验而设计,其设计目标即专为解决用户管理产线环境运行的分布式应用程序所面临的挑战,并以最小复杂性作为设计基础。

研发效能方法论
分享内容的四大方向:研发效能和软件工程方法论,软件工程技术,平台工程设计,通用五力