Istio架构剖析
Istio是一个开源的服务网格,可为分布式微服务架构提供所需的基础运行和管理要素。
随着各组织越来越多地采用云平台,开发者必须使用微服务设计架构以实现可移植性,而运维人员必须管理包含混合云部署和多云部署的大型分布式应用。
Istio采用一种一致的方式来保护、连接和监控微服务,降低了管理微服务部署的复杂性。
Istio概念
在Service Mesh中,我们需要了解Data Plane和Control Plane两个概念:
- Data Plane:作用是处理网格内服务间的通信,并完成服务发现、负载均衡、流量管理、健康检查等功能;
- Control Plane:作用是管理和配置智能代理用于路由流量,同时配置Mixers来应用策略、收集指标。
Istio核心组件
- Envoy:Istio 使用 Envoy调解服务网格中所有服务的入站和出站流量。属于数据平面。
- Mixer:负责在服务网格上执行访问控制和使用策略,以及收集从Envoy和其他服务自动监控到的数据。
- Pilot:为 Envoy sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。属于控制平面。
- Citadel:提供访问控制和用户身份认证功能。
Istio可视化管理组件
- Vistio:用于近乎实时地监控应用程序和集群之间的网络流量。
- Kiali:提供可视化服务网格拓扑、断路器和请求率等功能。Kiali还包括 Jaeger Tracing,可以提供开箱即用的分布式跟踪功能。
- jaeger:用于展示istio微服务调用链关系,以及微服务工作状态监测。注意,在生产环境中,应使用Elasticsearch或cassandra持久化存储jaeger数据。
架构图:从架构设计上来看,Istio服务网格在逻辑上分为控制平面和数据平面两部分。
Istio的控制平面主要负责:
- 接收用户配置
- 生成路由规则
- 分发路由规则到代理
- 分发策略
- 遥测数据收集
Istio的数据平面主要负责:
- 流量转发
- 策略实施
- 遥测数据上报
用户通过控制平面提供的API提交路由配置规则、策略配置规则与遥测数据收集的配置规则。
Pilot把用户提交的配置规则转换成智能代理需要的配置形式,推送给智能代理。
智能代理根据用户的配置来执行服务路由、遥测数据收集与服务访问策略。
智能代理拦截服务所有流量,并与其他智能代理通信。
控制平面
控制平面中主要包括Mixer、Pilot、Citadel部件。
1.1:Mixer
Mixer是一个与平台无关的组件。
Mixer负责在服务网络中实施访问控制和策略,并负责从Envoy代理和其他服务上收集遥测数据。
代理提取请求级别的属性并发送到Mixer用于评估,评估请求是否能放行。
Mixer有一个灵活的插件模型。这个模型使得Istio可以与多种主机环境和后端基础设施对接。因此,Istio从这些细节中抽象了Envoy代理和Istio管理的服务。
1.2: Mixer架构图
在每一个请求过程中,Envoy代理会在请求之前调用Mixer组件进行前置条件检查,在请求结束之后上报遥测数据给Mixer组件。
为了提高性能,每个Envoy代理都会提前缓存大量前置条件检查规则,当需要进行前置条件检查时,直接在缓存中检查规则。
如果本地缓存中没有需要的规则,再去调用Mixer组件获取规则。
Mixer组件也有自己的缓存,以加速前置条件检查。需要上报的遥测数据也会被Envoy代理暂时缓存起来,等待时机上报Mixer组件,从而减少上报数据的调用次数。
2.1: Pilot
Pilot为Envoy代理提供:
- 服务发现功能
- 智能路由功能(例如:A/B测试、金丝雀发布等)
- 弹性功能(例如:超时、重试、熔断器等)。
Pilot将高级别的控制流量行为的路由策略转换为Envoy格式的配置形式,并在运行时分发给Envoy代理。
Pilot抽象了平台相关的服务发现机制,并转换成Envoy数据平面支持的标准格式。
这种松耦合设计使得Istio能运行在多平台环境,并保持一致的流量管理接口。
2.2: Pilot架构图
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的功能添加到一个已经存在的部署中,并且不需要重新构建或者重新编写代码。