服务网格是一个独立的基础设施层,用来处理服务之间的通信。
Istio 在 Kubernetes 的基础上,以非侵入的方式为运行在集群中的微服务提供流量管理、安全加固、服务监控和策略管理等功能。
Istio 以 Envoy(网络代理)为 数据平面,通过 Sidecar 的方式让 Envoy 同业务容器一起运行,并劫持其通信 , 接受控制平面的统一管理,在此基础上为服务之间的通信提供丰富的连接 、 控制 、 观察 、安全等特性 。
分为两部分控制面板和数据面。
数据面被称为sidecar。Sidecar通过注入的方式和业务容器共存于一个Pod中,会劫持业务容器的流量,并且接受控制面板组件的控制,同时会向控制面板输出日志、跟踪及监控数据。
控制面板是Istio的核心,管理Istio的所有功能。
Pilot管理Istio的流量(具体由Sidecar来完成)。
预检和汇报。
Ciatdel 是用于证书管理的。在集群中启用了服务之间的加密之后, Citadel负责为集群中的各个服务在统一CA的条件下生成证书,下发给各个服务中的Sidecar ,服务之间的TLS 就依赖这些证书完成校验过程。
Sidecar就是lstio中的数据面,负责控制面对网格控制的实际执行。
lstio利用istio-init初始化容器中的iptables指令,对所在Pod 的流量进行劫持,从而接管Pod 中应用的通信过程,如此一来,就获得了通信的控制权,控制面的控制目的最终得以实现。
通信方式变化: Sidecar在加入之后,原有的源容器→目的容器的直接通信方式,变成了 源容器→ Sidecar→ Sidecar→目的容器的模式 。
Istio提供了很多开箱即用的提升服务弹性的功能,包括负载均衡、连接池、健康监测、熔断、超时、重试、限流。
当服务有多个实例的时候,通过负载均衡器来分发请求。负载均衡器一般提供轮询,随机,最小连接数、哈希算法。
Istio提供了两种常用的负载均衡策略:简单负载均衡和一致性哈希负载均衡。
简单负载均衡提供以下4种负载均衡算法:
只适用于使用HTTP类协议(HTTP1.1/HTTPS/HTTP2)的请求,可以基于请求头、Cookie或者来源IP做会话保持,让同一用户的请求一直转发到后端同一实例,当实例出现故障时会选择新的实例。当添加删除实例时,会有部分用户的会话保持失败。
当服务调用上游服务时,可以提前创建好到上游服务的连接,当请求到来时,通过已经创建好的连接直接发送请求给上游服务,减少连接创建的时间,从而降低请求的整体耗时,这些提前创建好的连接集合被称为连接池。
Istio提供了两类常用协议的连接池配置:TCP连接池和HTTP连接池。
当上游服务部分实例出现故障时,健康监测机制能自动检测到上游服务的不可用实例,从而避免把请求发送给上游不可用的实例。
当请求数过多时,直接丢掉过多的流量,防止服务被压垮,保证服务稳定。
Istio提供两种限流的实现:基于内存的限流和基于 Redis 的限流。
设置服务调用的超时时间,当服务没有在规定的时间内返回数据,就直接取消此次请求,这样可以防止服务提供方拖垮服务调用方,防止请求的总耗时时间过长。
在服务提供方的服务偶发瞬时故障,重新调用服务,可能就会请求成功,从而避免出现服务调用不可用,影响整体稳定性和可用性。
当服务出现大量调用失败时,应该停止调用后端服务,防止大量请求将服务器压垮。在短暂时间之后,尝试让部分请求调用后端服务,如果调用成功则让更多请求调用服务。否则继续停止调用服务。
Istio通过结合连接池和实例健康监测机制实现熔断功能。当后端服务出现实例不可用时,就将该服务实例移除负载均衡池,当负载均衡池中无可用实例时,服务请求会立即得到服务不可用的响应码,此时服务就处于熔断状态。当移除负载均衡池时间结束后,该实例会再次被放到负载均衡池,等待下一轮的服务健康检查。