文章内容基本来自Istio官网,这里属于学习的记录。

之前提到过Istio的几大组件:EnovyPilotMixerCitadelGalley,它们各自负责不同的功能。而流量管理的功能,主要由EnvoyPilot负责。

Pilot 和 Envoy

PilotIstio管理流量的核心组件,它管理和配置所有Envoy代理。
通过Pilot,我们可以路由流量、配置失败策略,比如:超时、重试、断路器。Pilot还对底层的平台实现进行了抽象,不局限于Kubernetes

Envoy通过Pilot获取信息,维护着一个负载均衡池,对池中的实例做周期性健康检查,然后根据路由的规则智能分配流量到这些实例去。

Pilot 架构图(来自Istio官网)

Pilot维护着与底层平台无关的一套服务规范,然后对于每个平台,Pilot有着对应的适配器来填充对应的规则。

Pilot支持服务发现,负载均衡池和路由表的动态更新。

所以我们只要管理好Pilot的规则,接下来Pilot会自动帮我们转换成低级别的配置,然后分发到Envoy实例去。

请求路由

像前面说的,在Service Mesh中,Pilot维护着服务的规范,Istio的服务模型与底层无关,适配器会从各平台获取信息然后进行填充。

Istio引入了服务版本的概念,可以用版本号像 v1v2,也可以用部署的环境 stagingprod 来标识。有了这个概念,Istio可以完成 A/B 测试金丝雀部署 这样的场景,通过流量控制服务的迭代来控制。

服务间通讯

服务版本

对于用户端而言,它通过域名/ip去访问服务,而服务背后的版本,客户端并不知道。

Envoy拦截转发服务与客户端之间通讯的流量。Envoy根据我们使用Pilot配置的路由规则,动态决定具体哪个服务接受请求。这个模型使得应用程序代码从所依赖服务的演进中解耦出来,同时还能提供其他好处(参见Mixer)。路由规则让Envoy能够从头部、标签、源/目的地等等来获取版本信息,然后根据不同的权重分发到各自的版本。

Ingress和Egress

Istio中,假定网格中所有的流量都会经过Envoy,对于进入的流量,我们可以进行A/B测试,金丝雀部署。而对于外部的服务,我们可以配置超时、重试、断路器的功能,而且还能从这些请求中获取详细的信息。

请求流

参考

Traffic Management