一、Pilot基本架构

Pilot是Istio控制面管理流量的核心组件,管理服务网格中的所有Envoy代理实例。允许用户创建服务之间的流量转发及路由规则,并配置故障恢复策略,例如超时,重试及熔断。还支持认证,鉴权等安全策略,以及监控,日志,调用链等观测性数据采集策略。

Istio深入学习七 Pilot架构_安全策略

目前除Kubernetes平台外,Istio并不直接支持其他平台,而是设计了一种可扩展的MCP标准协议,由第三方为自己适配自己的注册中心。这样避免了Istio社区维护各种各样的注册中心适配器所导致的代码臃肿。

二、平台适配器

负责监听底层平台,并完成平台特有服务模型到Istio规范模型的转换。

服务模型转换:将Kubernetes Service,ServiceEntry服务模型转换为遵循Istio规范的服务模型。

服务实例的转换:将Kubernetes Endpoint,WorkloadEntry资源转换为遵循Istio规范的服务实例模型。

Istio中API配置模型的转换:将Kubernetes非结构化的自定义配置规则转换为VirtualService,Gateway等结构化API,并将Kubernetes Ingress资源转换为Istio Gwateway资源。

抽象聚合层通过聚合不同平台的服务及配置规则,对外提供统一的索引接口,使得Pilot的发现服务xDS无须关注底层平台的差异,达到解耦xDS与底层平台的目的。

Pilot通过xDS服务器接收并维持与Envoy代理的连接,基于发布-订阅模型分发相应的xDS配置。客户端与服务端之间遵循xDS协议,Pilot实时,动态地推送已更新的xDS配置。比轮询要节省带宽和cpu资源。

Pilot和Envoy代理之间维护一条gRPC长连接,所有配置的分发都基于此连接的一个Stream。配置分发采用异步方式,基于底层注册中心服务的变化或者配置规则的更新事件。

三、Istio的服务模型

服务

每个服务都有一个全限定域名FQDN及用于监听连接的一个或多个接口。

Istio服务模型记录了聚合层及xDS生成器所需的属性,这些关键属性由Kubernetes Service转换而来

服务实例

ServiceInstance表示特定版本的服务实例,记录了服务与其实例IstioEndpoint的关联关系。

四、xDS协议

是一类发现服务的总称,包括LDS,RDS,EDS,ECDS,SDS及Istio扩展的NDS等。

LDS:监听器发现服务

RDS:路由发现服务

NDS:DNS主机名表发现服务

xDS流程

1.Envoy主动向Pilot发起DiscoveryRequest类型的请求

2.Pilot根据请求生成相应的DiscoveryResponse类型的响应

3.Envoy接收DiscoveryResponse,然后动态加载配置,配置加载成功后进行ACK,否则进行NACK。

Envoy的最终一致性模型

CDS更新->EDS更新->LDS更新->RDS更新

增量xDS

Pilot每次只发送更新的xDS配置,大大提升了xDS传输效率。

允许Envoy按需/懒加载方式获取额外的资源。

五、Pilot的原理

xDS服务器:包含ADS服务器和xDS生成器两部分,主要处理数据面代理的所有xDS请求,维护所有客户端连接,并且以发布-订阅模式提供xDS服务。

ADS服务器

实际上是一个gRPC服务器,同时提供客户端的认证。gRPC流处理器,每个流都由一个独立的go协程处理,借助Go的天然高并发能力。

Istio中,每个数据面代理与ADS服务器一般都保持一条gRPC连接,并且xDS的订阅基于同一条gRPC流。ADS的每一条流都涉及数据接受和发送,是典型的I/O多路复用模型。

对数据的接收和发送分别使用独立的线程,线程生命周期均与gRPC流相同。

接收线程将接收到的xDS请求入队,同时主线程流处理器异步地读取请求队列。

xDS服务器安全性

1.TLS证书认证

2.Kubernetes JWT认证

3.OIDC认证

xDS生成器

由多种生成器组成,每种生成器都负责一种xDS资源的生成

CDS,EDS,LDS,RDS,SDS,ECDS 是Envoy标准资源类型

NDS生成器是Istio基于xDS协议扩展出来的

CDS:集群发现服务

EDS:端点发现服务,用于生成Cluster需要的Endpoint配置。

Istio充分利用多级缓存提升效率;

第1层缓存是在xDS服务器中缓存全局的IstioEndpoint;

第2层缓存是全局缓存生成的EDS配置,影响EDS生成的资源不变时,Istio就不用重新生成EDS,而是直接将缓存的EDS发送到数据面代理。

LDS:监听器发现服务,用于生成Envoy监听器,分为Inbound和Outbound监听器两种。

RDS:为HTTP类的服务生成路由策略,非HTTP类的服务不需要RDS

六、服务发现

Pilot服务发现指Istio服务,服务实例,服务端口和服务身份信息的发现。

Istio为了提供更好的虚拟机支持,现在将虚拟机应用提升到头等地位,与Kubernetes Pod级别相同。

服务聚合

服务聚合器Aggregator是Pilot对所有适配器的抽象封装,通过注册接口AddRegistry提供对适配器的注册功能,通过ServiceDiscovery接口实现服务,服务实例及服务端口的检索功能。检索时会遍历所有注册中心的适配器,分别获取各注册中心的服务信息后汇集,返回给查询方。

服务发现的异步通知机制

通过controller接口,Aggregator对上层提供了服务事件处理的注册方式,Pilot基于这种回调机制触发xDS服务器进行xDS的配置更新。

Pilot初始化时会通过服务聚合器接口AppendServiceHandler及AppendWorkloadHandler分别向底层适配器注册服务,服务实例的更新事件处理回调函数。

七、配置规则发现

ConfigStoreController根据ConfigStore资源的变化实现异步的事件通知:主动同步本地状态与远端存储,并提供接收更新事件通知及处理的能力。

本地文件系统适配器

通过文件监视器周期性读取本地配置文件,将配置规则缓存在内存中,并维护配置的增加,更新,删除事件。缓存有变化时,异步通知内存控制器执行事件回调函数。

MCP适配器

MCP客户端与MCP服务器首先建立一条xDS连接,然后基于此连接向服务器发送订阅配置资源的请求,同时阻塞地接收配置资源更新的内容

Kubernetes适配器

Pilot通过配置控制器即CRD Controller监听kube-apiserver配置规则资源,维护所有资源的缓存,并触发事件处理回调函数。CRD Controller实现了ConfigStoreController接口,对外提供Config的事件处理器注册以及对Config资源的增删改查功能。

通过任务队列连接,避免config更新速度过快,事件处理速度过慢从而导致更新事件阻塞。

八、xDS的生成和分发

被动模式

xDS服务器通过StreamAggregatedResources接收Sidecar的资源订阅请求,然后发送响应。

主动模式

xDS服务器通过StreamAggregatedResponse请求模块读取pushChannel队列中的event,然后通过pushConnection向Sidecar下发xDS配置。主动模式下的xDS分发往往针对Sidecar订阅的全部xDS资源,一般至少包括CDS,RDS,LDS。

监听器生成

LdsGenerator针对不同的代理类型分别生成对应的监听器配置,然后以DiscoveryResponse形式发送到代理。

1.sidecar:用于东西向应用容器的负载均衡与流量治理。

2.router:用于南北向服务网格边缘的负载均衡与流量治理。

Route的生成

Envoy包含一个router过滤器,istio通过设置它来执行七层路由任务,router过滤器对于处理南北向服务网格的边缘流量及服务网格内东西向流量都很有用。

router过滤器实现了HTTP转发,可以部署Envoy所有HTTP代理场景。

router还处理失败重试,统计等任务。

Cluster的生成

定义了一个上游Endpoint集合,以及负载均衡,连接管理,熔断,超时,重试等配置。

Endpoint的生成

cluster的成员叫做Endpoint,Envoy通过EDS动态获取集群的成员配置

九、安全插件

认证插件

认证插件作用在监听器的FilterChain上,通过构造Envoy的HTTP过滤器,用于JWT的认证及双向TLS认证

(1) JWT过滤器

     用于JWT校验,验证JWT的签名,接收者和发行者,同时检查JWT的过期时间。

(2) 双向TLS认证

Istio利用Envoy提供客户端到服务端的通信隧道,加密服务间的通信,并且对应用透明无侵入。

十、授权插件

授权策略默认以CRD形式存储在Kubernetes中,Pilot监听授权策略的变更,并生成授权规则下发到AuthorizationPolicy选中的sidecar。在每个Envoy上都运行一个授权引擎,用于在运行时授权请求。当请求到达服务端Envoy时,授权引擎根据当前授权策略评估请求的上下文并返回授权结果。

十一、性能优化

如果每一次事件变更都引起Pilot重新生成及xDS配置的分发,必然导致Pilot过载及数据面不稳定,这些都难以满足大规模服务网格的需求。

最小静默时间: tn表示一个推送周期第N次接收更新事件的时间,如果t0到tn不断有更新事件发生,并且tn时刻后最小静默时间没有更新事件发生,那么xDS服务器会在tn+minQuiet时刻发送分发事件到推送队列。

最大延迟时间:如果当前时刻距离t0超过最大延迟时间,xDS会立刻分发事件到xDS推送队列。

防过度分发:如果第1次xDS发送后未收到ack,那么第2,3次xds订阅请求到达时。Pilot会把这两次分发请求合并,收到Envoy的ACK之后,会立刻生成新一轮的xDS生成与分发。

增量EDS:仅当Endpoints新创建或者Endpoints的Service Account发生变化时,Pilot才进行全量xDS下发,反之,Endpoints实例的更新只会触发增量EDS分发。