一、流量治理的流程

控制面:

管理员通过命令行或者API创建流量规则

Istio的控制面Pilot将流量规则转换为Envoy的标准格式

Pilot通过xDS将规则下发给服务网格数据面Envoy

数据面:

Envoy拦截本地业务流程的Inbound和Outbound流量,并解析流量

流量经过Envoy时执行接收到的流量规则,对流量进行治理。

二、Istio的负载均衡

Istiod将服务发现护具通过Envoy的EDS标准接口下发给Envoy,Envoy根据配置的负载均衡策略选择一个实例转发请求,支持轮询,随机和最小连接数等负载均衡算法。

三、基于Istio的服务熔断

Hystrix的熔断,对业务代码有侵入

Istio的连接池管理机制为TCP提供了最大连接数,连接超时时间等管理方式,为HTTP提供了对最大请求数,最大等待请求数,最大重试次数,每次连接的最大请求数等管理方式。

Istio的异常点检查机制 动态地将异常实例从负载均衡池中移除,保证了服务的总体访问成功率。被移除的实例在一段时间后,还会被加回来再次尝试访问,如果访问成功,则认为实例正常;如果访问不成功,则认为实例不正常,重新逐出。驱逐的时间等于一个基础时间乘以驱逐的次数。

Istio可以控制驱逐比例,即有多少比例的服务实例在不满足要求时被驱逐。如果太多实例被移除,就进入恐慌模式,不采用负载均衡算法,直接向所有的实例都发请求。

四、故障注入

Istio的故障注入是在服务网格中对特定的应用层协议进行故障注入,虽然在网络访问阶段进行注入,但是作用于应用层。

五、基于Istio的灰度发布

主要通过服务网格数据面代理解析应用协议,执行控制面配置的分流规则,在不同的版本间进行灵活的流量切分。比如20%流量到v2版本,80%的流量到v1版本

六、基于Istio的故障转移

控制面配置故障转移策略,服务网格数据面拦截到请求时,转发请求过程中根据故障转移策略将流量转移到配置的服务实例。

七、VirtualService 虚拟服务

VirtualService在形式上表示一个虚拟服务,将满足条件的流量都转发到对应的服务后端,这个服务后端可以是一个服务或者多个服务。

通过VirtualService的配置,访问目标服务时,只需指定目标服务的入口地址,不需要额外指定其他目标资源的信息。在实际请求中到底将流量路由到哪种特征的后端上,由在VirtualService配置的路由规则决定。

hosts建议用字母的域名而不是一个ip地址

VirtualService中的路由规则是一个数组,在应用时,只要匹配第一个规则生效就跳出,不会检查后面的路由规则。

TLSRoute (TLS路由)

用来处理非终结的TLS和HTTPS的流量,使用SNI,即客户端在TLS握手阶段建立连接使用的服务host名,做路由选择。应用场景如下

1.服务的端口协议是HTTPS是TLS,即在服务的端口名中包含https,tls等

2.Gateway的端口是非终结的HTTPS和TLS

3.ServiceEntry定义的服务端口是HTTPS和TLS

TLS 路由规则定义

路由匹配条件是TLSMatchAttributes,路由规则目标是RouteDestination

TCPRoute  (TCP路由)

不满足HTTP和TLS条件的流量都会应用本节要介绍的TCPRoute规则

八、DestinationRule(目标规则)

VirtualService也是一个虚拟Service,描述满足条件的流量被哪个后端或者那种特征的后端处理。

DestinationRule描述请求到达某个后端服务后怎么处理,即所谓目标的规则。

TrafficPolicy 流量策略

LoadBalancerSettings

simple:轮询,最少连接,随机,直接转发

consistentHash:一致性哈希

localityLbSetting位置负载均衡:流量分配,故障转移,优先级故障转移

九、Gateway服务网关

这里的gateway特指配置网关流量的gateway规则,配置外部访问的端口,协议及与服务网格内部服务的映射关系。

Gateway的配置由两大部分组成:

 1.在网关上开放的后端服务列表servers,表示一个网关上可以开放的多个服务的访问,每个服务都包括访问域名和端口等信息。

    servers表示开放的服务列表,是一个数组,表示可以配置多个后端服务,每个元素都是Server类型,结构上定义了服务的访问入口,可以通过hosts和port等信息描述

 2.selector:通过标签选择器选择运行网关的负载,通过这个标签来找到执行Gateway规则的Envoy。Istio默认会在所有的命名空间下搜索selector匹配的负载,不过生产环境推荐将Gateway资源配置和运行Gateway负载部署在同一命名空间下。Istio社区版本,会把gateway规则和负载创建在istio-system命名空间下。

 十、Sidecar(服务网格代理)

每个工作负载的实例都会透明地注入一个服务网格代理,拦截负载的出入流量,并根据配置完成相应的流量管理,包括流量,安全,可观测性等功能。

配置模型

1.workloadSelector 负载均衡器:Sidecar的配置可以应用到命名空间下的一个或者多个负载上,如果没有配置,应用到服务网格的所有负载。

如果一个负载既被有workloadSelector的sidecar选中,也被没有workloadSelector的sidecar选中,则优先应用前者。

Istio的默认情况,服务网格内部的所有数据面代理都通过xDS从控制平面获取全量配置,但是大规模服务网格场景,会引起数据面代理的内存暴涨。在sidecar机制下只维护少量依赖服务的配置,可以大大减少无用的内存消耗。

华为服务网格ASM中的Mantis组件可以自动学习服务间的调用关系,根据服务访问智能按需加载配置信息,节省了数据面的内存开销,控制面istiod的资源开销以及数据面和控制面的网络带宽开销。

十一、EnvoyFilter 过滤器

如果不支持Istio流量规则,EnvoyFilter可以直接配置Envoy。实际应用中发现网络数据面的某些能力未包含在Istio的API中,比如限流,元数据交换等扩展的过滤器。EnvoyFilter就提供了一条泛化地配置Envoy的通道,允许用户从控制面把一段配置塞到Envoy中。

这个配置可以是对某个配置对象的修改,也可以添加一个特定的Filter、Cluster等配置对象。下发的是Envoy自身的一个配置数据块,通道只是下发,并不解析内容。配置内容需要管理员保证合法性,比如字段兼容性,配置正确性。

配置定义

applyTo:表示EnvoyFilter定义的修改被应用到Envoy的具体配置对象,比如xDS涉及的几个关键配置LDS,RDS,CDS等。

match:用于描述匹配条件,即在Envoy大块的配置结构中精确找到操作位置进行修改。

patch:匹配确定位置后,通过patch的operation和value定义修改的方式和内容。operation包括add,remove,insert_before,insert_after, insert_first,merge和replace等,应用不同的修改场景。

应用场景

1.插入自定义的过滤器

2.动态添加服务后端

3.动态修改对象的属性