Istio架构剖析

Istio是一个开源的服务网格,可为分布式微服务架构提供所需的基础运行和管理要素。

随着各组织越来越多地采用云平台,开发者必须使用微服务设计架构以实现可移植性,而运维人员必须管理包含混合云部署和多云部署的大型分布式应用。

Istio采用一种一致的方式来保护、连接和监控微服务,降低了管理微服务部署的复杂性。

Istio概念

在Service Mesh中,我们需要了解Data Plane和Control Plane两个概念:

  • Data Plane:作用是处理网格内服务间的通信,并完成服务发现、负载均衡、流量管理、健康检查等功能;
  • Control Plane:作用是管理和配置智能代理用于路由流量,同时配置Mixers来应用策略、收集指标。

Istio核心组件

  1. Envoy:Istio 使用 Envoy调解服务网格中所有服务的入站和出站流量。属于数据平面。
  2. Mixer:负责在服务网格上执行访问控制和使用策略,以及收集从Envoy和其他服务自动监控到的数据。
  3. Pilot:为 Envoy sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。属于控制平面。
  4. Citadel:提供访问控制和用户身份认证功能。

Istio可视化管理组件

  1. Vistio:用于近乎实时地监控应用程序和集群之间的网络流量。
  2. Kiali:提供可视化服务网格拓扑、断路器和请求率等功能。Kiali还包括 Jaeger Tracing,可以提供开箱即用的分布式跟踪功能。
  3. jaeger:用于展示istio微服务调用链关系,以及微服务工作状态监测。注意,在生产环境中,应使用Elasticsearch或cassandra持久化存储jaeger数据。

架构图:
Istio架构剖析从架构设计上来看,Istio服务网格在逻辑上分为控制平面和数据平面两部分。

Istio的控制平面主要负责:

  • 接收用户配置
  • 生成路由规则
  • 分发路由规则到代理
  • 分发策略
  • 遥测数据收集

Istio的数据平面主要负责:

  • 流量转发
  • 策略实施
  • 遥测数据上报

用户通过控制平面提供的API提交路由配置规则、策略配置规则与遥测数据收集的配置规则。
Pilot把用户提交的配置规则转换成智能代理需要的配置形式,推送给智能代理。
智能代理根据用户的配置来执行服务路由、遥测数据收集与服务访问策略。
智能代理拦截服务所有流量,并与其他智能代理通信。

控制平面

控制平面中主要包括Mixer、Pilot、Citadel部件。

1.1:Mixer

Mixer是一个与平台无关的组件。
Mixer负责在服务网络中实施访问控制和策略,并负责从Envoy代理和其他服务上收集遥测数据。
代理提取请求级别的属性并发送到Mixer用于评估,评估请求是否能放行。

Mixer有一个灵活的插件模型。这个模型使得Istio可以与多种主机环境和后端基础设施对接。因此,Istio从这些细节中抽象了Envoy代理和Istio管理的服务。

1.2: Mixer架构图

Istio架构剖析在每一个请求过程中,Envoy代理会在请求之前调用Mixer组件进行前置条件检查,在请求结束之后上报遥测数据给Mixer组件。

为了提高性能,每个Envoy代理都会提前缓存大量前置条件检查规则,当需要进行前置条件检查时,直接在缓存中检查规则。

如果本地缓存中没有需要的规则,再去调用Mixer组件获取规则。
Mixer组件也有自己的缓存,以加速前置条件检查。需要上报的遥测数据也会被Envoy代理暂时缓存起来,等待时机上报Mixer组件,从而减少上报数据的调用次数。

2.1: Pilot

Pilot为Envoy代理提供:

  • 服务发现功能
  • 智能路由功能(例如:A/B测试、金丝雀发布等)
  • 弹性功能(例如:超时、重试、熔断器等)。

Pilot将高级别的控制流量行为的路由策略转换为Envoy格式的配置形式,并在运行时分发给Envoy代理。
Pilot抽象了平台相关的服务发现机制,并转换成Envoy数据平面支持的标准格式。
这种松耦合设计使得Istio能运行在多平台环境,并保持一致的流量管理接口。

2.2: Pilot架构图

Istio架构剖析Pilot抽象不同平台的服务发现机制,只需要为不同的平台实现统一的抽象模型接口,即可实现对接不同平台的服务发现机制。

用户通过规则配置API来提交配置规则,Pilot把用户配置的规则和服务发现收集到的服务转换成Envoy代理需要的配置格式,推送给每个Envoy代理。

3. Citadel

Citadel内置有身份和凭证管理,提供了强大的服务间和终端用户的认证。

Citadel可以把不加密的通信升级为加密的通信。

运维人员可以使用Citadel实施基于服务身份的策略而不用在网络层控制。

Istio还支持基于角色的访问控制,用于控制谁能够访问服务。

数据平面

Istio在数据平面中使用一个Envoy代理的扩展版本。

Envoy是使用C++语言开发的高性能代理,它能拦截服务网络中所有服务的入口和出口流量。

Istio利用了众多Envoy内置的功能特性,例如:

  • 动态服务发现
  • 负载均衡
  • TLS终止
  • HTTP/2和gRPC代理
  • 熔断器
  • 健康检查
  • 基于百分比流量分隔的灰度发布
  • 故障注入
  • 丰富的度量指标

Envoy作为一个边车与对应的服务部署在同一个Kubernetes Pod中。

这种部署方式使得Istio能提取丰富的流量行为信号作为属性。

Istio又可以反过来使用这些数据在Mixer中进行策略决策,并发送这些数据到监控系统中,提供整个网络中的行为信息。

采用边车部署方式,可以把Istio的功能添加到一个已经存在的部署中,并且不需要重新构建或者重新编写代码。