总结:服务网格(Service Mesh)

一、介绍

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

服务网格从总体架构上来讲比较简单,不过是一堆紧挨着各项服务的用户代理,外加一组任务管理组件组成。

管理组件被称为控制层或控制平面(control plane),负责与控制平面中的代理通信,下发策略和配置。

代理在服务网格中被称为数据层或数据平面(data plane),直接处理入站和出站数据包,转发、路由、健康检查、负载均衡、认证、鉴权、产生监控数据等。

一个典型的服务网格部署网络结构图如下:

其中绿色方块为应用服务,蓝色方块为 Sidecar Proxy,应用服务之间通过 Sidecar Proxy 进行通信,整个服务通信形成图中的蓝色网络连线,图中所有蓝色部分就形成了 Service Mesh。

二、服务网格带来了什么变化?

  • 第一,微服务治理与业务逻辑的解耦。服务网格把 SDK 中的大部分能力从应用中剥离出来,拆解为独立进程,以 sidecar 的模式进行部署。服务网格通过将服务通信及相关管控功能从业务程序中分离并下沉到基础设施层,使其和业务系统完全解耦,使开发人员更加专注于业务本身。
  • 第二,异构系统的统一治理。随着新技术的发展和人员更替,在同一家公司中往往会出现不同语言、不同框架的应用和服务,为了能够统一管控这些服务,以往的做法是为每种语言、每种框架都开发一套完整的 SDK,维护成本非常之高,而且给公司的中间件团队带来了很大的挑战。有了服务网格之后,通过将主体的服务治理能力下沉到基础设施,多语言的支持就轻松很多了。只需要提供一个非常轻量级的 SDK,甚至很多情况下都不需要一个单独的 SDK,就可以方便地实现多语言、多协议的统一流量管控、监控等需求。

三、Istio介绍

Istio - 服务网格的典型实现。

Istio 是一个由Google和IBM等公司开源的,功能十分丰富的服务网格具体实现,也是目前业界最为流行的实现。它包括如下功能:

  • 流量管理:提供统一的流量治理功能,包括失败重试、超时、熔断/限流、路由管理、灰度发布、网关等功能。
  • 可观测性:透明化地实现指标监控、日志、链路追踪等功能。
  • 策略控制:实现访问控制系统、遥测捕获、配额管理和计费等。
  • 安全认证:无侵入式地为服务增加认证、鉴权和加密通信的能力。
  • 故障注入:支持随机向服务通信中注入故障(如模拟延时/网络中断),检测服务的可靠性

四、Istio架构

Istio 的架构从逻辑上分成数据平面(Data Plane)和控制平面(Control Plane)。

是否觉得似曾相识?没错,Kubernetes 的架构也具有相似的结构,分为控制节点和计算节点。毫无疑问,这样的设计可以很好地解耦各个功能组件。

  • 数据平面:由一组和业务服务成对出现的 Sidecar 代理(Envoy)构成,它的主要功能是接管服务的进出流量,传递并控制服务和 Mixer 组件的所有网络通信(Mixer 是一个策略和遥测数据的收集器,稍后会介绍)。
  • 控制平面:主要包括了 Pilot、Mixer、Citadel 和 Galley 共 4 个组件,主要功能是通过配置和管理 Sidecar 代理来进行流量控制,并配置 Mixer 去执行策略和收集遥测数据(Telemetry)。

Istio的架构图如下:

架构补充:

五、Istio模块介绍

Istio 的核心控件Envoy

从上面的架构图可以看出,Istio 的数据平面就是指代理。Istio 选择 Envoy 作为 Sidecar 代理,Envoy 本质上是一个为面向服务的架构而设计的 7 层代理和通信总线。Envoy 基于 C++ 11 开发而成,性能出色。除了具有强大的网络控制能力外,Envoy 还可以将流量行为和数据提取出来发送给 Mixer 组件,用以进行监控。

Envoy 在网络控制方面的主要功能如下。

  • HTTP 7 层路由
  • 支持 gRPC、HTTP/2
  • 服务发现和动态配置
  • 健康检查
  • 高级负载均衡

我们知道,在Kubernetes环境中,同一个Pod内的不同容器间共享网络栈,这一特性使得Sidecar可以接管进出这些容器的网络流量,这就是Sidecar模式的实现基础。Envoy是目前Istio默认的数据平面,实际上因为Istio灵活的架构,完全可以选择其他兼容的产品作为Sidecar。目前很多服务网格产品都可以作为Istio的数据平面并提供集成。

Pilot

Pilot 是 Istio 实现流量管理的核心组件,它主要的作用是配置和管理 Envoy 代理。比如:可以为代理之间设置特定的流量规则,或者配置超时、重试、熔断这样的弹性能力。Pilot 会将控制流量行为的路由规则转换为 Envoy 的配置,并在运行时将它们广播到 Envoy。另外,Pilot 还能够把服务发现机制抽象出来并转换成 API 分发给 Envoy,使得后者具有服务发现的能力。

简单来说,Pilot 的主要任务有两个。

  • 从平台(如:Kubernetes)获取服务信息,完成服务发现
  • 获取 Istio 的各项配置,转换成 Envoy 代理可读的格式并分发
    • 注意:这块是经典的解耦设计,这样有个好处,即以后如果有其他类型的配置格式,也可以转换为Envoy可读的配置。试想下,如果由Envoy直接读取配置,后期接入其他格式的配置则需要修改Envoy代码,而Pilot的出现,则只要修改Pilot端代码就可以了。Pilot层不涉及到业务逻辑层,而是作为一个平台适配器,保障了其他核心组件配置规则的一致性,从而避免其它代码的反复修改

Mixer

Mixer 的主要功能是提供策略控制,并从 Envoy 代理收集遥测数据。

每次网络通信时 Envoy 代理都会向 Mixer 发出预检要求,用来检测调用者的合法性。调用之后 Envoy 代理会发送遥测数据供 Mixer 收集。一般情况下 Sidecar 代理可以缓存这些数据,不需要频繁地调用 Mixer。

适配器是 Mixer 的重要组成部分,它本质上是一个插件模型,每个插件叫作适配器。这项特性使得 Mixer 可以接入几乎任意的(只要定义好接口)后端基础设施。比如可以选择接入不同的日志收集器、监控工具和授权工具等;可以在运行时切换不同的适配器或者是打开(关闭)它们;还可以自定义适配器以满足特定需求。适配器极大地提高了 Mixer 的扩展性,它让 Istio 的功能拥有了更多可能性。下图展示了 Mixer 的架构图并展示了它和 Envoy 的交互方式。

Citadel

Citadel 是与安全相关的组件,主要负责密钥和证书的管理。它可以提供服务间和终端用户的身份认证,还可以加密服务网格中的流量。

Galley

在 2019 年 3 月份发布的 1.1 版本中,Galley 作为一个独立的组件被添加到了架构当中(在此之前的版本中 Galley 并未独立出现),它现在是 Istio 主要的配置管理组件,负责配置的获取、处理和分发。Galley 使用了一种叫作 MCP(Mesh Configuration Protocol,网格配置协议)的协议与其他组件进行通信。

六、Istio之流量管理

微服务应用最大的痛点就是处理服务间的通信,而这一问题的核心其实就是流量管理。首先来看一看传统的微服务应用在没有服务网格介入的情况下,如何完成诸如金丝雀发布这样的动态路由。假设不借助任何现成的第三方框架,一个简单的实现方法是,在服务间添加一个负载均衡(如Nginx)做代理,通过修改配置的权重来分配流量。这种方式将对流量的管理和基础设施(云服务器、虚拟机、实体机等)绑定在了一起,难以维护。

而使用 Istio 就可以轻松地实现各种维度的流量控制。

下图展示了两种不同的金丝雀发布策略(新版本只对少数终端用户可用)。

第一种是根据权重把 5% 的流量路由给新版本;

第二种是根据请求的头信息 User-Agent 把使用 iPhone 的用户流量路由到新版本。

插曲:什么是金丝雀版本?金丝雀canary版本是一种软件技术版本,通过使新版本只对少数终端用户可用,这样可降低向每个人推出新代码和功能的风险。由于用户组的规模较小,新版本的影响相对较小。如果确定bug存在,或者新的功能或新的设计没有被很好地接受,那么很容易回滚。

  • 28
    点赞
  • 199
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值