一、envoy
envoy是什么。
原文地址点这里。
服务网格(借图)
Envoy是Istio中的Sidecar官方标配 (边车模式)(借图)
原文点 这里。
在传统模式下,如果微服务之间要进行通信,那么程序需要自己处理各种通信的细节,这就包括服务发现、熔断机制、超时重试和 tracing 等功能。这些功能通常实现为与某种编程语言相关的 library,这也导致了这样的 library 无法在不同的编程语言之间共享。如果我们可以将这部分功能抽取出来,形成一个独立的进程,这样的进程称为 Sidecar。通常来说,我们会将应用程序和 Sidecar 部署在一起,那么程序的入口流量和出口流量都会由这个 Sidecar 去代理,这样就可以通过 Sidecar 去实现服务发现、熔断机制、超时重试等功能了。
Envoy Proxy可以用来充当 Sidecar 进程。通常来说,我们会将应用程序和 Envoy 部署在一起,形成一个微服务。另一方面,为了实现高可用,通常一个微服务会部署多份副本,这些副本加在一起,就形成了 Service Cluster。下图显示的就是服务与服务之间的通信:
除了可以充当 Sidecar 进程之外,Envoy Proxy 还可以充当反向代理,将流量转发给后端的 Service Cluster。充当反向代理的 Envoy,通常也可以称为 Edge Envoy。在微服务中作为反向代理与K8s结合(Envoy反向代理微服务实践,Envoy 作为 Kubernetes 的 API 网关)。
在查看其配置前,我们不妨先脑补一下网络代理程序的流程,比如作为一个代理,首先要能获取请求流量,通常是采用监听端口的方式实现,其次拿到请求数据后需要对其做些微处理,例如附加Header头或校验某个Header字段内容等,这里针对来源数据的层次不同,就可以分为L3\L4\L7,然后将请求转发出去,转发这里又可以衍生出如果后端是一个集群,需要从中挑选出一台机器,如何挑选又涉及到负载均衡等。脑补下来大致流程应该就是这个样子,接下来我们看看Envoy是如何组织其配置信息的。
Envoy配置的简单配置信息如下:
关键字段说明:
Listener: 服务(程序)监听者。就是真正干活的。 Envoy 会暴露一个或者多个listener监听downstream的请求。
Filter: 过滤器。在 Envoy 中指的是一些“可插拔”和可组合的逻辑处理层。是 Envoy 核心逻辑处理单元。
Route_config: 路由规则配置,即请求路由到后端那个集群(cluster)。
Cluster: 服务提供方集群。Envoy 通过服务发现定位集群成员并获取服务。具体请求到哪个集群成员是由负载均衡策略决定。通过健康检查服务来对集群成员服务状态进行检查。
根据上面我们脑补的流程,配合上这份配置的话,Envoy大致处理流程如下图:
Envoy内部对请求的处理流程其实跟我们上面脑补的流程大致相同,即对请求的处理流程基本是不变的,而对于变化的部分,即对请求数据的微处理,全部抽象为Filter,例如对请求的读写是ReadFilter、WriteFilter,对HTTP请求数据的编解码是StreamEncoderFilter、StreamDecoderFilter,对TCP的处理是TcpProxyFilter,其继承自ReadFilter,对HTTP的处理是ConnectionManager,其也是继承自ReadFilter等等,各个Filter最终会组织成一个FilterChain,在收到请求后首先走FilterChain,其次路由到指定集群并做负载均衡获取一个目标地址,然后转发出去。
二、鹅厂的L5系统
原文点这里《腾讯运维10年,我斩获了这5把“杀手锏”》。
世界上管理服务器最多的系统
运营管理系统管理了上亿服务器,脉络非常清晰,根本不会出现混乱。L5 系统(上图)也类似于 DNS 系统,有一排能提供的服务模块,从而解决的单点问题。
L5 如何做容错?
L5-主机/接口级的容错原理
L5 有由 L5 DNS 和 L5 agent 两部分构成。CGI 通过给模块ID和命令ID,根据模块下设备的成功率和延迟情况,通过 IP+PROT 给 CGI 一个反馈。访问之后,通过成功率和延迟情况,把数据上报给了 L5 agent,然后做统计数据。(小马理解为由L5告诉CGI本次host该具体访问哪台机器IP和端口)(CGI 间的调用,CGI拿着ID先找L5,得到IP后由envoy进行代理转发到具体的CGI接口所在机器)
比如我们在某台机器9.1.1.110上能看到这样的一些CGI信息,这台9.1.1.110机器把L5模块ID信息转为实际的IP和端口然后进行远程转发访问实际的接口所在的机器http://9.2.2.222:80?c=xx&a=xx:
根据统计数据,当发现失败率特别低的时踢掉。当发现成功率和失败率有一定下降,会把访问权重降低,从而达到容错和负载均衡的作用。
可以注册一个模块,加多台设备,形成容错效果。如发现一台机器失败率很高,就把它踢掉。它成功率恢复过来,还可以再加回来。
新加一台服务器设计它的权重为 1,假如之前的是 100,可以逐渐上线。还可以给它一个得分,得分下降的时候,快速把它踢掉。L5 具有灰度、容错、路由、负载均衡的能力。
L5 对运维团队有哪些帮助?
减少了 80~90% 的日常故障;
不再需要频繁的变更 ip+port(也是故障源);
同过名字便利的服务上下线;
通过权重灰度上线;
模块访问关系可帮助定位根源故障;
接口的延迟和失败率可用来监控;
集容错、负载均衡、路由、灰度、监控能力于一身。
微服务为什么不用l5作负载均衡而用的是服务发现(点这里)?
实践证明,l5新增机器要自己手动把ip填进去登记一下,刷新一下L5配置,这样新的机器才能通过模块ID和命令ID被找到。不像微服务服务发现一样,新增机器会自动被发现。
三、envoy作为GRPC服务网关
架构对比
作为网关
参考文献:
envoy文档
Envoy反向代理微服务实践
《腾讯运维10年,我斩获了这5把“杀手锏”》
Envoy 作为 Kubernetes 的 API 网关