一、流量治理的流程
控制面:
管理员通过命令行或者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.动态修改对象的属性