美文网首页码农庄园
envoy代理转发与L5 Cluster 负载均衡

envoy代理转发与L5 Cluster 负载均衡

作者: 小马过河R | 来源:发表于2020-09-10 13:32 被阅读0次

    一、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反向代理微服务实践

    文章1

    《腾讯运维10年,我斩获了这5把“杀手锏”》

    文章2

    相关阅读:

    kong微服务网关

    Envoy 作为 Kubernetes 的 API 网关

    相关文章

      网友评论

        本文标题:envoy代理转发与L5 Cluster 负载均衡

        本文链接:https://www.haomeiwen.com/subject/stpuektx.html