本文转自:http://www.servicemesh.cn/?/article/41

作者:MIKE WHITE

翻译:姚炳雄

原文:Using Envoy to Load Balance gRPC Traffic

针对 Bugsnag(一款bug自动检测工具),我们最近启动了一个专门用来跟踪软件发布健康状况的发布仪表板项目。 这是个大任务,当我们在构建后台时,特别关注了它的性能。其中的关键领域之一是和后端服务调用相关的延迟,在最后,我们决定用 Google 的超级快速的 gRPC 框架替换REST。

为了成功迁移到 gRPC,需要重新思考我们的负载均衡策略,以确保它很好地支持 gRPC 流量。 这篇博文概述了我们如何最终达成目标,去将 Lyft 功能丰富的 Envoy Proxy 添加到堆栈以及它又是如何来适应 Bugsnag 架构的。

Bugsnag体系结构的背景

在背后,Bugsnag 有一个微服务管道,负责处理从客户那里收到的错误信息,这些错误信息稍后展示在仪表板上。 这条管道目前每天处理数以亿计的事件。为了支持新的发布仪表板,我们需要扩展管道接收用户会话信息,这意味着流量将大幅增加。性能将成为是这个项目成功的关键,也是我们采用gRPC框架的主要原因之一。

部署方面,Bugsnag 的微服务是通过 Kubernetes 以 Docker 容器方式部署在云上。 Kubernetes 通过它的 kube-proxy 建立了负载均衡,可以很好地处理 HTTP / 1.1 流量,但是当你把 HTTP / 2 请求也扔进去混合到一起时,事情会变得很有意思。

HTTP / 2 – 一个负载均衡头痛的难题

gRPC 使用了性能加速的HTTP / 2协议。 HTTP / 2的实现比起以前的版本,在诸多降低延迟的方法中,一种利用了单一的长 TCP 连接(single long-lived TCP connection),并在该连接上能交叉传递请求/响应。 这给4层(L4)负载均衡器带来了问题,因为它们的操作在太低的层上,以致无法根据它接收到的流量类型做出路由决策。 因此,一个L4负载平衡器试着负载平衡HTTP / 2流量,必然会打开一个单一长TCP连接,并将所有连续的流量都路由到这个单一长TCP连接,这实际上是取消了负载平衡。

Kubernetes 的 kube-proxy 本质上是一个L4负载平衡器,所以我们不能依靠它来负载平衡微服务之间的gRPC调用。

为什么不让客户做这项工作?

我们探索的其中一个选项是使用 gRPC 客户端负载均衡器,它被打包在gRPC客户端库中。 这样,每个客户端微服务可以执行自己的负载平衡。 然而,由此产生的客户端最终是脆弱的,并需要大量的客户化代码来提供所有形式的弹性、度量或日志记录,所有这些需要重复几次在管道中使用每种不同的语言。

我们真正需要的是更智能的负载均衡器。

选择更智能的负载平衡器

我们需要一个L7负载均衡器,因为它们作用在应用层,能检测流量,以便做出路由决策。 最重要的是,他们可以支持HTTP / 2协议。

对于L7负载平衡器的选择,包括 NGINX 和 HAProxy 在内,有许多可选的产品。但这其中的大多数都因为过于厚重而不易采纳进微服务架构。 我们缩小范围,选择了两个关键的竞争者 —— Envoy 和 Linkerd。两者都是秉承微服务体系结构理念开发的,都支持gRPC。

虽然这两个代理都有很多不错的功能,但最根本的决定因素取决于代理的足迹。这样赢家就很明显了。 Envo 非常小,用 C ++ 11编写,不像用 Java 编写用于企业级的 Linkerd 那么重。

一旦决定使用 Envoy,开始深入到它的功能集中,会发现有很多想要的东西。

Envoy凭什么表现这么好?

Envoy 由 Lyft 编写和开源,是多年来与微服务体系结构中常见的复杂路由问题作斗争的直接结果。 它本质上是为了适应我们的问题而设计的,

  • 一流的双向支持HTTP / 2和SSL
  • 具备优秀的度量指标并高度透明
  • 成熟的文档集
  • 不依赖于任何给定的语言

最后一个,也是最重要的一个,它与Bugsnag的polyglot微服务架构融为一体。

Envoy进入基础设施

在 Kubernetes 中,一个或多个容器组成一组称为 pod。Pod 能被复制多个,以提供弹性扩展,这些 pod 被包装抽象成服务,该服务拥有固定的IP,通过该服务可以访问底层的 pod。从 Kubernetes 1.2开始,当访问服务IP时,kubernetes 会随机返回后端的某个pod。也可以将服务重新配置为无人值守(headless),以便服务IP不再返回可用的pod IP整个列表,而是允许执行自己的服务发现。

Envoy 被设计成 Sidecar Container 方式运行,与客户端容器并排放置,以模块化方式来补充其功能。在 Kubernetes 中,这转化为在同一个 pod 中运行客户的容器和 Envoy 容器。我们将我们的服务配置为无人值守(headless)模式以供 Envoy 来做服务发现的端点。而且,依赖于Envoy大量的度量数据的输出,我们能够轻松观察到持续的gRPC调用的轮询调度的负载均衡,来确认其按预期工作。

当我们选择为每个gRPC客户端运行一个 Envoy 边车,像 Lyft 公司为所有微服务都运行一个Envoy sidecar,形成服务网格。这种方法非常强大,可以在域级别调整流量参数,这也是我们想在Bugsnag上能看到的。

可选方案

虽然Envoy能够满足需求,但还是有一些值得一提的替代方案。其中一些是我们探讨的,但是他们或者太不成熟,或者不太适合当时的架构:

· Istio - IBM,Google 和 Lyft 联合开发,形成了一个完整的微服务负载均衡解决方案。Envoy 作为核心,在 Kubernete s平台上“开箱即用”方式运行。

· Ribbon - 来自 Netflix 的开源 IPC 库,这家公司已经被证明是微服务相关 DevOps 工具的重量级公司。

· Kubernetes Ingress controllers - 虽然此功能依赖于Beta Kuberenetes资源,但它代表了在 Kuberenete s中实现L7负载均衡的可能性。

总的来说,Envoy 给我们留下了深刻的印象,在后续的Bugsnag的开发和拓展中,我们将继续探索其特色。有一件事是肯定的,现在这方面是 DevOps 的一个热点,我们非常关注下一步它将如何发展。

Bugsnag会自动监视应用程序是否存在有害错误,并告警,可视化到软件内部。您可以将我们看成软件质量的中控台。免费试用14天的Bugsnag,包括用于跟踪发布健康状况的发布仪表板。

原文地址:https://blog.bugsnag.com/envoy/

Envoy如何打败Linkerd成为L7负载平衡器的最佳选择?的更多相关文章

  1. Microsoft Azure 的负载平衡器的Session Sticky

    Microsoft Azure 的负载平衡器是一种 Layer-4负载平衡器.Microsoft Azure 负载平衡器通过针对给定输入端点上接收到的流量计算哈希函数,在一组可用的服务器(虚拟机)之间 ...

  2. 新功能:Azure 负载平衡器的空闲超时现可配置了

    Yves Pitsch Azure 网络首席项目经理 我们很高兴地宣布,Azure负载平衡器现在可以为云服务和虚拟机提供可配置的 TCP空闲超时支持.要配置此功能,可以使用服务管理 API.Power ...

  3. Azure 负载平衡器新分发模式

    Yves Pitsch Azure 网络首席项目经理 Azure负载平衡器是一种第四层(TCP.UDP)类型的负载平衡器,它可以将传入流量分发到云服务中正常运行的服务实例上,或者分发到负载平衡器集内所 ...

  4. 负载均衡之基于L7负载

    L7负载平衡 还有一种较为经常使用的负载平衡解决方式则是L7负载平衡.顾名思义,其主要通过OSI模型中的第七层应用层中的数据决定怎样分发负载. 在执行时.L7负载平衡server上的操作系统会将接收到 ...

  5. Spring Cloud Commons教程(二)Spring RestTemplate作为负载平衡器客户端

    RestTemplate可以自动配置为使用功能区.要创建负载平衡RestTemplate创建RestTemplate @Bean并使用@LoadBalanced限定符. 警告 通过自动配置不再创建Re ...

  6. LAMP网站架构分析

    转自:http://www.williamlong.info/archives/1908.html LAMP(Linux-Apache-MySQL-PHP)网站架构是目前国际流行的Web框架,该框架包 ...

  7. LAMP网站架构方案分析

    本文引自:http://www.williamlong.info/archives/1908.html LAMP(Linux-Apache-MySQL-PHP)网站架构是目前国际流行的Web框架,该框 ...

  8. LAMP与LNMP架构的区别及其具体的选择说明

    LAMP==Linux+Apache+Mysql+PHP LNMP==Linux+Nginx+Mysql+PHP 以上两只架构是目前网站的主流架构 LAMP和LNMP最主要的区别在于: 一个使用的是A ...

  9. LNMP 与 LAMP 架构的区别及配置解决方案

    2014-12-31 10:33| 发布者: digitser| 查看: 5618| 评论: 0|原作者: liangsheng 摘要: LNMP 与 LAMP 架构的区别及配置解决方案 LNMP 的 ...

随机推荐

  1. [SDOI2018]战略游戏 圆方树,树链剖分

    [SDOI2018]战略游戏 这题是道路相遇(题解)的升级版,询问的两个点变成了\(S\)个点. LG传送门 还是先建出圆方树,考虑对于询问的\(S\)个点,答案就是圆方树上能包含这些点的最小连通块中 ...

  2. jstl c:if 不能判断成功的问题

    这是因为test里不能直接用 ${value}=='字符串' 的方式来进行判断比较,所以只能这样写 ${value == '字符串'} ,这样就能判断了

  3. DNS DHCP 路由 FTP

    第1章 网络基础 1.1 IP地址分类 IP地址的类别-按IP地址数值范围划分 IP地址的类别-按IP地址用途分类 IP地址的类别-按网络通信方式划分 1.2 局域网上网原理过程 DHCP原理过程详情 ...

  4. X5webview完美去掉分享功能和缓存功能(2)

    前段时间比较忙,没有来得及写完如何将X5WEBVIEW分享功能和缓存功能屏蔽,下面直接来干货,上代码. 1.首先在布局文件中增加一个全屏的布局, <!-- 视频全屏--> <Fram ...

  5. 【转】Appium 中截取 element 图片作为对比,判断对比结果

    其实在https://github.com/gb112211/Adb-For-Test 里面有一个截取element进行对比的方法,但是在使用appium时是无法使用的,因为其用到了uiautomat ...

  6. sql server sql查询数据库的表,字段,主键,自增,字段类型等信息

    1.查询数据表的属性(名称.说明.是否主键.数据类型.是否自增) SELECT t1.name columnName,case when t4.id is null then 'false' else ...

  7. python simple factory mode example

    Two python simple factory mode examples shown in this section. One is for base operation and another ...

  8. Unity萌新日记—开发小技巧与冷知识(脚本篇)

    在学习unity的过程中,总会遇到很多零碎的知识点和小技巧,在此把它们记录下来,方便日后查看. 第一篇是关于脚本的一些你可能不知道的小知识. 还是个正在学习的萌新,如果写的不好,请谅解. Unity版 ...

  9. Unity新版本VR以及SteamVR基础

    一.Unity2018新版本VR Unity 简单VRDemo搭建 Unity环境搭建: PlayerSetting设置如下: 启动虚拟现实驱动,sdk选择OpenVR.HTC  Vive只支持Ope ...

  10. 零基础学python之构建web应用(入门级)

    构建一个web应用 前面的学习回顾: IDLE是Python内置的IDE,用来试验和执行Python代码,可以是单语句代码段,也可以是文本编辑器中的多语句程序. 四个内置数据结构:列表.字典.集合和元 ...