WebAssembly:让Istio变得更强大

这篇具有很好参考价值的文章主要介绍了WebAssembly:让Istio变得更强大。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 Wasm为Envoy带来新的扩展性

Envoy是一个高性能、可编程的L3/L4和L7网络代理,许多服务网格和网关都采用Envoy作为数据面。

Envoy通过监听器(Listener)捕获网络数据包,根据数据包的内容匹配某个过滤器链(Filter Chain)中,之后按顺序执行该链中的过滤器(Network Filter)对捕获的数据包进行操作,实现用户定义的各种流量治理策略。Envoy本身自带很多种类的过滤器,这些开箱即用的过滤器 cover了大部分的应用场景,但是在某些需要自定义功能的场景下,用户必须实现自己的过滤器。

WebAssembly:让Istio变得更强大,wasm,istio,javaEnvoy filter chains[5]

在Wasm出现之前,添加过滤器有两种方式:

  1. 修改Envoy代码,使用C++语言编写原生的过滤器(Native C++ filters)。在早期(2019年初),Envoy是一个静态编译的二进制文件,其所有扩展都在构建时编译。这意味着提供自定义扩展的项目必须维护和分发自己的二进制文件。这种方式需要开发者熟悉C++语言和Envoy过滤器的开发模式,在开发完成后重新编译一个新的Envoy二进制且维护它与上游社区的版本。目前Istio社区采用的就是这种方式,Istio fork了上游的Envoy,在其基础之上添加了自己定制的一些插件。然而,这种方式对开发者要求较高,且需要花费额外的精力维护。

  2. 使用Lua脚本编写过滤器。这种方式相比于上一种更加简单,用户可以直接在xDS配置中直接编写Lua脚本(inline)或指定本地的一个Lua脚本文件,适合过滤器逻辑非常简单的情况。然而,这种方式并不适用于过滤器逻辑复杂的情况,而且需要用户在Istio中手动创建EnvoyFilter进行额外的配置。

可以看出,上述两种扩展Envoy的方式都不是非常“优雅”。为了解决这个问题,Envoy社区提出了Wasm Filter特性,在Envoy中内嵌了一个Wasm运行时,通过proxy-wasm定义的网络代理相关接口来运行Wasm二进制。这意味着Envoy可以在运行中动态地加载用户开发的Wasm模块,并将其作为一个过滤器插入到过滤器链中。Wasm能够解决上述传统方式的各种问题,用户能够用任何支持的语言开发自己的Wasm过滤器,对Envoy本身无侵入。Envoy发起者称“Wasm是Envoy可扩展性的未来”。

WebAssembly:让Istio变得更强大,wasm,istio,java

Envoy与Wasm的交互

WebAssembly:让Istio变得更强大,wasm,istio,java

2 Istio WasmPlugin API

Envoy对Wasm的支持为Istio带来了全新的扩展机制。在早期,用户可以使用EnvoyFilter手动在Envoy配置中添加Wasm filter,这种方式非常地繁琐,用户体验并不友好,且EnvoyFilter是一个“break glass”API,社区并不保证其不同版本的向后兼容性。

为了更好地支持Wasm,Istio在1.12版本中添加了一个新的CRD,即WasmPlugin。用户可以通过WasmPlugin方便灵活地将Wasm插件下发到指定的工作负载,使得开发人员可以更简单健壮地扩展网格功能。

WebAssembly:让Istio变得更强大,wasm,istio,java
WasmPlugin yaml示例

上图展示了一个最基本的WasmPlugin配置,在配置中用户需要指定Wasm模块的url,该url可以是像容器镜像一样的OCI格式的Wasm,也可以是代理本地的一个文件(通常要求用户手动挂载到容器中),或者是http协议的url,用于直接获取远程Wasm模块文件。一般推荐的方式第是一种,将编写好的代码编译成Wasm二进制后,打包成一个OCI镜像,方便分发和复现。

用户可以通过selector指定要下发Wasm的proxy,如果selector为空,则代表下发到该namespace下的所有proxy。

除此之外,如果用户需要指定Wasm插件在过滤器链中执行的位置,可以通过phase和priority两个参数来控制。phase用来指定在http filter链中的何处插入此Wasm 插件,可以设置为authentication,authorization或istio stats filter之前,未设置时会在istio stats filter之后插入;priority用来控制多个WasmPlugin在同一个phase中的执行顺序,priority值大的优先。

3 Istio下发Wasm配置流程解析

Istiod推送过程

每当用户更新WasmPlugin时,istiod就会触发一次config update。首先,istiod会更新本次xDS push的context,将当前的WasmPlugin信息按照namespace分类,保存到push context中。

之后,在LDS(Listener Discovery Service)推送的过程中,istiod为proxy构建Listener的http filter时,会从push context中找出与该proxy匹配的WasmPlugin并按照priority排序,最后根据phase将Wasm filter插入到http filter chain中的某个位置。

WebAssembly:让Istio变得更强大,wasm,istio,java

Istio插入Wasm filter代码

注意此处插入的只是Wasm filter的名称,具体的Wasm filter配置则是通过后续的ECDS(Extension Config Discovery Service)下发的。在ECDS中,istiod会构建出实际的Wasm filter配置并推送给proxy。

WebAssembly:让Istio变得更强大,wasm,istio,java
Wasm filter envoy配置示例

4 Proxy接收过程

Proxy接收过程

Envoy的Wasm filter配置本身是不支持使用OCI镜像格式作为data source的。那么Istio是如何支持使用OCI镜像分发Wasm二进制的呢?

答案是通过istio-agent的代理。Istio的proxy中包含两个进程,一个是Envoy本身,另一个是istio-agent。istio-agent会代理Envoy与istiod之间的xDS通信。对于ECDS,istio-agent在收到推送时,会读取其内容,假如其中的Wasm filter使用OCI镜像或者http/https作为data source(即需要执行的Wasm二进制),那么istio-agent会从远程仓库中拉取该Wasm二进制并缓存至本地。之后会修改ECDS的内容,将Wasm filter的data source改为刚才保存的本地文件,再将修改后的ECDS内容发送给Envoy。

对Wasm为Envoy带来新的扩展性的价值简要总结:

综上,Envoy和Istio对Wasm的支持大大加强了服务网格的扩展性。用户通过Wasm能够以可扩展、灵活、安全的方式对代理进行自定义配置,应对各种场景的业务需求,例如认证、授权、Tracing、请求内容转换/检查等等。同时,Istio提供的API使Wasm成为了服务网格中的“一等公民”,用户可以方便地将Wasm下发到指定的工作负载,该过程是完全动态的,应用无需重启。这种高效率的扩展方式使得服务网格具备了可编程性。

5 未来展望

目前,Wasm仍在快速发展,相关的特性在Istio和Envoy中还处在alpha阶段。为了加速Wasm生态,让所有Wasm程序有一个“common language”,社区正在设计一个标准的Wasm interface —— WASI(WebAssembly System Interface),用于访问和操作系统资源。未来proxy-wasm可能会与WASI融合,为Wasm程序提供一个标准的交互接口。同时,Wasm将支持更多高级语言作为前端,用于构建轻量、高性能的应用程序。随着Wasm生态的逐步成熟,期待它能在云计算领域中带来更多令人兴奋的可能性。文章来源地址https://www.toymoban.com/news/detail-527032.html

到了这里,关于WebAssembly:让Istio变得更强大的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • webassembly002 whisper.wasm wasm_eval 与js代码交互 js部分

    convert audio buffer to WAV # TODO changeInput函数 这个函数的作用是根据传入的参数 input 的不同值,控制页面上特定元素的显示和隐藏状态,从而根据用户的选择切换不同的输入方式 Module load model 加载模型文件 loadF函数 使用FileReader()对象加载本地文件 loadWhisper函数 会调用loadRemote(定

    2024年04月15日
    浏览(45)
  • Istio入门体验系列——基于Istio的灰度发布实践

    导言:灰度发布是指在项目迭代的过程中用平滑过渡的方式进行发布。灰度发布可以保证整体系统的稳定性,在初始发布的时候就可以发现、调整问题,以保证其影响度。作为Istio体验系列的第一站,本文基于Istio的流量治理机制,针对最简单的几种业务场景进行了实践,为后

    2024年02月12日
    浏览(35)
  • 【Istio实际操作篇】Istio入门10分钟快速安装

    上一篇讲了什么是Istio的理论篇,这次我们就来实际操作。 想看上一篇理论篇的看这里(看完绝对有所收获): [Istio是什么?] 还不知道你就out了,一文40分钟快速理解_小叶的技术Logs的博客-CSDN博客 本文有两个版本, 详细版、简洁版 。 前者适合新手,后者适合老手**(方便大

    2024年02月09日
    浏览(49)
  • Isito 入门:为什么学 Istio、Istio 是什么

    本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 1,Istio 概述 🚩聊聊微服务设计 🥇只使用 Kubernetes 部署容器, 🥈开始使用一些中间件,完善基础设施 ❓我为什么要学 Istio 💡所以,Istio 是什么 Istio 三个主要功能 Istio 原理 似乎用上 Kubernetes ,就是微服务系统了。 碰到很

    2024年02月06日
    浏览(35)
  • Istio实战(十二)-Istio 延长自签发证书的有效期

            因为历史原因,Istio 的自签发证书只有一年的有效期。如果你选择使用 Istio 的自签发证书,就需要在它们过期之前订好计划进行根证书的更迭。根证书过期可能会导致集群范围内的意外中断。         我们认为每年更换根证书和密钥是一个安全方面的最佳实践

    2024年02月06日
    浏览(36)
  • 【云原生 | 从零开始学istio】五、istio灰度发布以及核心资源

    灰度发布也叫金丝雀发布 ,是指通过控制流量的比例,实现新老版本的逐步更替。 比如对于服务 A 有 version1、 version2 两个版本 , 当前两个版本同时部署,但是 version1 比例 90% ,version2 比例 10% ,看运行效果,如果效果好逐步调整流量占比 80~20 ,70~30 ·····10~90 ,0,

    2024年02月01日
    浏览(41)
  • k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理

    大纲 背景与原理 实现流程 开发部署my-docker-demo-sp-user服务模拟业务项目 开发部署my-sidecar服务模拟边车程序 开发部署服务my-docker-demo-k8s-operator 提供webhook功能 创建MutatingWebhookConfiguration 动态准入配置 测试边车注入效果 背景: 原理: 涉及项目 my-docker-demo-sp-user 模拟业务项目

    2024年02月15日
    浏览(38)
  • Istio 实战

    Start Date: October 31, 2023 End Date: October 27, 2023 Tags: Life, Work Status: Not started 技术分享会 Istio是一个用于服务治理的开放平台。 Istio是一个Service Mesh形态的用于服务治理的开放平台。 Istio是一个与Kubernetes紧密结合的适用于云原生场景的Service Mesh形态的用于服务治理的开放平台。 只

    2024年02月06日
    浏览(37)
  • 云原生Istio基本介绍

    地址 :https://istio.io/ 服务网格是一个独立的基础设施层,用来处理服务之间的通信。现代的云原生应用是由各种复杂技术构建的服务体系,服务网格负责在这些组成部分之间进行可靠的请求传递。目前典型的服务网格通常提供了一组轻量级的网络代理,这些代理会在应用无感

    2024年02月04日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包