重新定义代理的扩展性:WebAssembly在Envoy与Istio中的应用

原文:https://istio.io/blog/2020/wasm-announce/
作者:CRAIG BOX, MANDAR JOG, JOHN PLEVYAK, LOUIS RYAN, PIOTR SIKORA (GOOGLE), YUVAL KOHAVI, SCOTT WEISS (SOLO.IO)
译者:陆培尔

编者按

Istio的架构在1.5版本中发生了翻天覆地的变化,控制平面从微服务回归单体,pilot、citadel、galley等控制平面组件整合成了单一的istiod二进制文件,同时饱受诟病的mixer同志终于在1.5中deprecated了,社区呼声很高的Wasm以Proxy-Wasm plugins的方式登上历史舞台,官方承诺在1.6版本中提供标准的wasm插件配置API,甚至还推出了webassemblyhub这样的类似应用商店的服务,构建wasm plugin生态的野心不可谓不大。结合代理无关的ABI标准,只能说谷歌又在下一盘大棋。mixer的两大核心功能,check和report,分别使用Proxy-Wasm plugins和telemetry V2替代,曾经所谓的Mixer V2计划也渐渐烟消云散,湮没在历史尘埃中。本文翻译官方的技术博客,来一探本次的划时代变更proxy-wasm plugin的究竟。

自2016年采用Envoy以来,Istio项目一直希望提供一个平台,在此平台上可以构建丰富的扩展,以满足用户的多样化需求。有很多理由可以向服务网格的数据平面添加功能-支持更新的协议,与专有安全控件集成或通过自定义指标增强可观察性等。

在过去的一年半中,我们在Google的团队一直在努力使用WebAssembly向Envoy代理添加动态可扩展性。我们很高兴今天与大家分享这项工作,并推出WebAssembly (Wasm) for Proxies (Proxy-Wasm):我们打算标准化的ABI;SDK;它的第一个主要实现是新型的,低延迟的Istio遥测系统。

我们还与社区紧密合作,以确保为用户提供良好的开发人员体验,以帮助他们快速入门。Google团队一直与Solo.io团队紧密合作,他们已经构建了WebAssembly Hub,该服务用于构建,共享,发现和部署Wasm扩展。使用WebAssembly Hub,Wasm扩展与容器一样易于管理,安装和运行。

这项工作今天发布了Alpha版本,还有很多工作要做,但是我们很高兴将其交到开发人员手中,以便他们可以开始尝试由此带来的巨大可能性。

背景

Istio和Envoy项目的创建原则都是基于对可扩展性的需求,但是两个项目采用了不同的方法。Istio项目的重点是启用具有轻量级开发人员体验的称为Mixer的通用进程外扩展模型,而Envoy则专注于代理内扩展。

每种方法都有其优点和缺点。Istio模型导致严重的资源效率低下,从而影响了尾部延迟和资源利用率。该模型在本质上也受到限制-例如,它永远不会为实现自定义协议处理提供支持。

Envoy模型强化了整体的构建过程,并要求使用C++编写扩展,从而限制了开发人员生态系统。为集群发布新的扩展需要推入新的二进制文件并重新启动,这可能很难协调,并且会造成停机风险。这也激励了开发人员向Envoy上游提交他们的扩展,而这些扩展仅由一小部分生产环境使用,只是为了肩负其发布机制。

随着时间的流逝,Istio的一些对性能最敏感的功能已进入Envoy的上游,例如流量策略检查和遥测报告。尽管如此,我们一直希望将单个堆栈融合以实现可扩展性,从而减少折衷:这使Envoy版本与其扩展生态系统脱钩,使开发人员能够使用他们选择的语言进行工作,并使Istio可靠地推出新功能而不会造成停机风险。

什么是WebAssembly?

WebAssembly(Wasm)是一种可移植的字节码格式,用于以接近本机的速度执行以多种语言编写的代码。其最初的设计目标与上述挑战很好地吻合,并且在其背后得到了可观的行业支持。Wasm是在所有主要浏览器中本地运行的第四种标准语言(继HTML,CSS和JavaScript之后),于2019年12月成为W3C Recommendation。这使我们有信心对其进行战略下注。

尽管WebAssembly最初是作为客户端技术而诞生的,但在服务器上使用它具有许多优点。运行时是内存安全的,并且经过沙盒处理以确保安全。有一个大型工具生态系统可用于以文本或二进制格式编译和调试Wasm。W3C和BytecodeAlliance已成为其他服务器端工作的活跃中枢。例如,Wasm社区正在W3C标准化“WebAssembly系统接口”(WASI),并提供一个示例实现,该示例为Wasm“程序”提供类似于OS的抽象。

为Envoy带来WebAssembly

在过去的18个月中,我们一直与Envoy社区合作,将Wasm可扩展性纳入Envoy并在上游做出贡献。我们很高兴地宣布,此特性在Istio 1.5随附的Envoy版本中Alpha可用,其源代码包含在envoy-wasm开发分支中,并且正在努力将其合并到Envoy主干中。该实现使用内置在Google高性能V8引擎中的WebAssembly运行时。

除了底层的运行时,我们还构建了:

  • 用于在代理中嵌入Wasm的通用应用程序二进制接口(ABI),这意味着编译后的扩展将在不同版本的Envoy或其他代理(如果他们选择实施ABI)下也可以使用

  • 用于在C++,Rust和AssemblyScript中轻松进行扩展开发的SDK,还有更多后续更新

  • 有关如何在Istio和独立的Envoy中进行部署的综合示例和说明

  • 允许使用其他Wasm运行时的抽象,包括“空”运行时,该运行时将在本地把扩展编译进Envoy中,这对于测试和调试非常有用

使用Wasm扩展Envoy可以为我们带来几个主要好处:

  • 敏捷性:可以使用Istio控制平面在运行时交付和重新加载扩展。这样可以快速进行扩展的开发→测试→发布周期,而无需Envoy的重启。

  • 标准发布:合并到主树中之后,Istio和其他人将能够使用Envoy的标准发布,而不是自定义版本。这也将使Envoy社区有更多的时间将某些内置扩展迁移到该模型,从而减少其受支持的覆盖区域。

  • 可靠性和隔离性:扩展部署在具有资源限制的沙箱中,这意味着它们现在可以崩溃或泄漏内存,而不会影响Envoy主进程。CPU和内存使用率也可以受到限制。

  • 安全性:沙盒具有用于与Envoy进行通信的明确定义的API,因此扩展只能访问并修改连接或请求中有限数量的属性。此外,由于Envoy会协调此交互过程,因此可以隐藏或清除扩展中的敏感信息(例如,HTTP标头中的“Authorization”和“ Cookie”属性,或客户端的IP地址)。

  • 灵活性:可以将30多种编程语言编译为WebAssembly,从而使来自各种背景(C++,Go,Rust,Java,TypeScript等)的开发人员都可以使用他们选择的语言来编写Envoy扩展。

“看到WASM在Envoy中的支持,我感到非常兴奋;这是Envoy可扩展性的未来。Envoy的WASM支持与社区驱动hub相结合,将在服务网格和API网关用例中释放出令人难以置信的网络领域创新。我迫不及待地想看到社区的建设向前发展。” –Envoy创作者Matt Klein。

有关实现的技术细节,请关注即将在Envoy博客上发布的帖子。

主机环境和扩展之间的Proxy-Wasm接口有意设计为与代理无关。我们已将其内置到Envoy中,但旨在供其他代理供应商采用。我们希望看到一个世界,您可以获取为Istio和Envoy编写的扩展,并在其他基础架构中运行它。您很快就会听到更多有关此的信息。

在Istio中构建WebAssembly

为了提高性能,Istio将其几个扩展移动到了1.5版本中内置的Envoy构建中。在执行此工作时,我们一直在测试以确保这些相同的扩展可以作为Proxy-Wasm模块进行编译和运行,而行为没有任何变化。鉴于我们认为Wasm目前的支持为Alpha,因此我们还没有准备好将此设置设为默认设置。然而,这使我们对通用方法以及已开发的主机环境ABI和SDK充满了信心。

我们还非常小心地确保Istio控制平面及其Envoy配置API可以支持Wasm。我们有一些示例来说明如何执行几种常见的定制操作,例如定制标头解码或程序化路由,这是用户的常见要求。当我们将支持转移到Beta时,您将看到说明在Istio中使用Wasm的最佳实践的文档。

最后,我们正在与许多编写了Mixer适配器的供应商合作,以帮助他们迁移到Wasm —如果这是前进的最佳途径。Mixer将在将来的版本中转为社区项目,在那里它将仍可用于遗留用例。

开发者体验

没有出色的开发人员体验,再强大的工具也毫无用处。Solo.io最近宣布发布WebAssembly Hub,这是一套用于构建,部署,共享和发现Envoy和Istio的Envoy Proxy Wasm扩展的工具和存储库。

WebAssembly Hub完全自动化了开发和部署Wasm扩展所需的许多步骤。使用WebAssembly Hub工具,用户可以轻松地以任何受支持的语言将其代码编译为Wasm扩展。然后,可以将这些扩展上传到Hub注册表,并使用单个命令将其部署和取消部署到Istio。

在后台,Hub会处理很多细节问题,例如引入正确的工具链,ABI版本验证,权限控制等。该工作流程还通过自动化扩展部署,消除了跨Istio服务代理的配置更改带来的麻烦。该工具可帮助用户和运维人员避免由于配置错误或版本不匹配而引起的意外行为。

WebAssembly Hub工具提供了功能强大的CLI和优雅且易于使用的图形用户界面。WebAssembly Hub的一个重要目标是简化构建Wasm模块的体验,并为开发人员提供共享和发现有用扩展的协作场所。

请查看入门指南,以创建您的第一个Proxy-Wasm扩展。

下一步

除了努力发布Beta版,我们还致力于确保围绕Proxy-Wasm有一个持久的社区。ABI需要最终确定,而将其转变为标准的工作将会在适当的标准机构内获得更广泛的反馈后完成。向Envoy主干提供上游支持的工作仍在进行中。我们还在为工具和WebAssembly Hub寻找合适的社区之家。

点击 阅读原文 查看更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年第十届蓝桥杯国赛B组试题E-路径计数-dfs(坑题)

【问题描述】 从一个 5 x 5 的方格矩阵的左上角出发,沿着方格的边走,满足以下条件的路线有多少种? 总长度不超过 12; 最后回到左上角; 路线不自交; 不走出 5 x 5 的方格矩阵范围之外。如下图所示&#xff…

.NET Core开发实战(第22课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(下)...

接下来介绍使用代理方法的方式,也就是说把 ErrorController 整段逻辑直接定义在注册的地方,使用一个匿名委托来处理,这里的逻辑与之前的逻辑是相同的app.UseExceptionHandler(errApp > {errApp.Run(async context >{// 在 Features 里面…

【朝夕技术专刊】Core3.1WebApi_Filter-Authorize详解

欢迎大家阅读《朝夕Net社区技术专刊》第6期我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦!前言:本部分文档将详细给…

以正确的方式下载和配置 ASP.NET Core 官方源码

我们可以在Github上面直接查看ASP.NETCore 3.x的源代码,但是我们也可以把源代码下载下来进行查看。而下载源代码进行查看有很多好处:任意的导航源代码内置了一个示例项目直接调试源代码下载源代码想下载并配置好源码,你需要:最新版…

h5应用 vue 钉钉_uniapp开发一个小视频应用(一)

“uni-app 是一个使用 Vue.js 开发所有前端应用的框架,是一种终极的跨平台解决方案,这里的平台,主要指的是App平台(android、ios)、小程序平台、H5平台。开发者编写一套代码,可发布到iOS、Android、H5、以及各种小程序(微信/支付宝…

Blazor入门

NOW现在行动!Blazor是一个基于C#, Razor和 HTML的新的Web UI框架。它通过WebAssembly运行在浏览器中。有利于使用C#而不是JavaScript构建交互式的Web UI。这篇文章演示了如何使用Blazor构建SPA应用。Blazor简化了可在任…

C#桌面开发的未来WebWindow

WebWindowWebWindow是跨平台的库。Web Window的当前实验实现可在以下平台上运行:Windows – 需要基于Chromium的EdgeLinux – 使用WebKitMac – 需要Safari源码https://github.com/SteveSandersonMS/WebWindow.gitZeje Fork的分支:https://github.com/ze…

C#小游戏—钢铁侠VS太空侵略者

身为漫威迷,最近又把《钢铁侠》和《复仇者联盟》系列又重温了一遍,真的是印证了那句话:“读书百遍,其意自现”。看电影一个道理,每看一遍,都有不懂的感受~ 不知道大伙是不是也有同样的感受,对于…

受检异常 非受检异常_这样设计 Java 异常更优雅,赶紧学

来源:Lrwinlrwinx.github.io/2016/04/28/如何优雅的设计java异常/导语异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈一谈我是如何对异常进行处理的。由于本文只作一些经验之…

.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(上)...

23 | 静态文件中间件:前后端分离开发合并部署骚操作我们先来看一下静态文件中间件有哪些能力1、支持指定相对路径2、支持目录的浏览3、支持设置默认文档4、支持多目录映射源码链接:https://github.com/witskeeper/geektime/tree/master/samples/StaticFi…

src获取同级目录中的图片_一个简单的Python爬虫实例:百度贴吧页面下载图片

本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片。1. 概述本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片。下载图片的步骤如下:获取网页html文本内容;分析html中图片的html标签特征,用正…

十问十答 Apache 许可证

Apache 许可证由 Apache Software Foundation(ASF)发行,是一个由强大社区支持的流行的被广泛部署的许可证。Apache 许可证允许你自由地使用、修改和分发任何 Apache 许可的产品,前提是遵循 Apache 许可的条款。01Apache 许可证的条…

(一)基于企业现金流预测的投资决策-项目介绍

项目背景 某企业想提高现金流的利用率,以便产生更大的投资收益。遇到的问题是:何如在保证更多的资金流向高收益投资的同时,不出现资金短缺的问题。 确定可用于投资的金额 Step1 预测未来的收入、支出和余额 潜在逻辑: 现金流 = 收入 - 支出当月余额(资金存量)= 上月余…

应用程序使用统计信息 – .NET CORE(C#) WPF界面设计

本文首发地址:https://dotnet9.com/10546.html关键功能点抽屉式菜单圆形进度条Demo演示:1. 新建项目使用 VS 2019 的 .NET Core 3.1 WPF 项目模板,创建名为 “MobileAppUsageDashboardCore” 的项目,NuGet 引入 MaterialDesign 的…

iso qemu 安装ubuntu_基于libvirt 和QEMU在macOS安装Ubuntu

在流行的虚拟架构体系中,最重要的技术当然要数libvirt和QEMU了。包括Linux虚拟化技术中KVM和xen都使用了QEMU。关于Xen和KVM进行虚拟化,以及在Window下使用Vmware,VirtualBox和hyper-v构建虚拟机,可能大家都有过很多的尝试。今天我…

在Ocelot中使用自定义的中间件(一)

Ocelot是ASP.NET Core下的API网关的一种实现,在微服务架构领域发挥了非常重要的作用。本文不会从整个微服务架构的角度来介绍Ocelot,而是介绍一下最近在学习过程中遇到的一个问题,以及如何使用中间件(Middleware)来解决…

多队列 部分队列没有包_记一次TCP全队列溢出问题排查过程

简介:记一次TCP全队列溢出问题排查过程1. 前言本文排查的问题是经典的TCP队列溢出问题,因TCP队列问题在操作系统层面没有明显的指标异常,容易被忽略,故把排查过程分享给大家。2. 问题描述A服务调用B服务接口超时,B服务…

[蓝桥杯2015决赛]完美正方形-dfs

题目描述 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形。 历史上,人们花了很久才找到了若干完美正方形。 比如:如下边长的22个正方形 2 3 4 6 7 8 12 13 14 15 16 17 18 21 22 23 24 26 27 28 …

销量预测设计

目录一、算法计算逻辑举个直观的例子销量预测二、项目背景三、算法与业务的关系四、关于业务人员对未来外部变量“打标签”:五、关于预测颗粒度:六、关于预测准确率和影响准确率的因素:一、算法计算逻辑 销量预测算法建模要用到的数据&#…

.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(下)...

23 | 静态文件中间件:前后端分离开发合并部署骚操作这里还有一个比较特殊的用法一般情况下,我们前后端分离的架构,前端会编译成一个 index.html 文件和若干个 CSS 文件和 JavaScript 和图片文件CSS 文件和 JavaScript 和图片文件一般会部署在…