WebAssembly:让Istio变得更强大

news2024/9/21 2:41:21

1 Wasm为Envoy带来新的扩展性

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

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

在这里插入图片描述Envoy 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可扩展性的未来”。

在这里插入图片描述

Envoy与Wasm的交互

在这里插入图片描述

2 Istio WasmPlugin API

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

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

在这里插入图片描述
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中的某个位置。

在这里插入图片描述

Istio插入Wasm filter代码

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

在这里插入图片描述
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生态的逐步成熟,期待它能在云计算领域中带来更多令人兴奋的可能性。

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

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

相关文章

工作方法 - 戒定慧

风动、旗动,以及两种冰球棍的摆法 戒。就是戒律,知道边界。 在一个公司的工作中,就是知道我们的核心目标,核心资源,核心用户都是什么。 不是什么热闹都去凑,没有资源去做的事情也去做,非核心用…

记录--多行标签超出展开折叠功能

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 记录分享每一个日常开发项目中的实用小知识,不整那些虚头巴脑的框架理论与原理,之前分享过抽奖功能、签字功能等,有兴趣的可以看看本人以前的分享。  今天要分…

Squid代理服务器(传统代理、透明代理)

Squid代理服务器(传统代理、透明代理) 一、Squid代理服务器1、代理的工作机制2、代理的类型3、使用代理的好处 二、安装Squid服务2、修改 Squid 的配置文件3、Squid 的运行控制4、编写 Squid 服务脚本 三、构建传统代理服务器1、squid服务器2、web1的配置…

libevent实践02:读取标准输入的数据

对于libevent的知识一点不了解,通知编写测试代码,发现问题,解决问题,一步一步入门学习。 CMakeLists.txt文件: project(libevent_project) cmake_minimum_required(VERSION 3.8)message(STATUS "lkmao:CMAKE_SOU…

Redis高可用群集---搭建(主从、哨兵、Cluster)

目录 Redis 高可用集群Redis 主从复制Redis 哨兵模式Redis 集群模式 Redis 高可用集群 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redi…

# YourKit Java Profiler 教程

YourKit Java Profiler 教程 文章目录 YourKit Java Profiler 教程本教程软件版本说明YourKitIntelliJ Idea 系统要求探查器体系结构探查器代理探查器用户界面 开始分析集成环境集成IntelliJ Idea 安装插件IntelliJ Idea分析 解决性能问题性能瓶颈优化内存使用内存泄漏垃圾分配…

数据结构 | 双向链表

一、数据结构定义 /* 链表结点 */ typedef int ListType; typedef struct node {ListType data; // 存放整型数据struct node* llink, * rlink; // 指向前驱和后继结点的指针 } *Node;/* 双向链表头结点 */ typedef struct headNode {struct node* head, * tail; // 指向双向链…

IP 扫描程序:轻松发现、扫描和跟踪 IP 空间

什么是 IP 扫描 IP 扫描是实时持续监控网络 IP 地址空间的过程。包括 ICMP ping 扫描和 SNMP 扫描在内的网络协议数量用于扫描网络中的 IP 地址。网络管理员依靠 IP 扫描程序轻松检查和管理 IP 地址空间。使用网络 IP 扫描程序进行 IP 扫描可查看 IP 地址空间利用率和性能。 …

C# 使用CefSharp控件 High DPI问题的解决

使用CefSharp控件,在部分高分辨率的电脑中(显示缩放比例非100%,而是120%或者125%等)会出现以下一些情况: 显示的页面中出现了黑边,且按钮定位也偏了,比如点击【图层】按钮,需要点击上…

selenium用法

一、请求库selenium selenium是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题。操作浏览器模拟人的行为。 下载浏览器驱动:以谷歌浏览器为例---->谷歌浏览器驱动(版本号对应) …

K8S应用生命周期管理

K8S应用生命周期管理. 1 应用周期管理1.1 资源对象1.1.1 基础知识1.1.2 资源属性 1.2 Pod基础1.2.1 Pod概述1.2.2 简单实践1.2.3 流程解读1.2.4 应用解析1.2.5 初始化容器1.2.6 Sidecar实践1.2.7 静态POD实践 1.3 Pod进阶1.3.1 Pod探测机制1.3.2 命令探测1.3.3 TCP探测1.3.4 HT…

C# +.Net医院检验科LIS系统源码 实验室信息系统源码

实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件。这套系统通常与其他信息系统比如医院信息系统(HIS)连接。实验室信息系统由多种实验室流程模块构成,这些模块可…

79-基于stm32单片机酒精浓度测量疲劳驾驶检测系统(程序+原理图+元件清单全套资料)...

资料编号:079 功能介绍:采用stm32单片机作为主控CPU,采用MQ3传感器采集酒精浓度,采用红外接触传感器感应驾驶员上车时间,OLED显示酒精浓度和驾驶时间,当酒精浓度超过阈值(程序可调)&…

【QT】——多线程的使用

目录 基本概念 1.线程类QThread 1.1信号和槽 1.2静态函数 1.3 任务处理函数 2.实例 第一种方式 第二种方式 基本概念 默认的线程在Qt中称之为窗口线程,也叫主线程,负责窗口事件处理或者窗口控件数据的更新子线程负责后台的业务逻辑处理&#xff…

Rocky Linux能否通过其他方法合法地获得RHEL源代码?让我们一起来看看吧

在红帽公司限制对RHEL源代码的访问后,Rocky Linux寻找了替代方案来确保他们可以继续获取所需的源代码并行使他们的权利。他们认为这种限制违反了开源的精神和目的,因此积极寻求解决方案,以维护他们对开源软件的承诺。那么Rocky Linux能否通过…

AOM、VTM初体验及安装tensorflow

AOM、VTM初体验 Cmake cmake的定义是什么 ?-----高级编译配置工具 当你用不同的语言或者编译器开发一个项目,各就各位code完之后要生成最终的输出(dll 或执行文件),这时候就尴尬了,你要手动去MingGW或者…

Kotlin 1.9 新特性预览:data object (数据单例)

前言 data object (数据单例) 是 Kotlin 1.9 中预定引入的新特性 &#xff0c;但其实从 1.7.20 开始就可以预览了。启动预览需要在 gradle 中升级 KotlinCompileVersion&#xff1a; tasks.withType<KotlinCompile> {kotlinOptions.languageVersion "1.9" }…

四、交换网络实验3——VTP配置

更多网络基础内容可见: 网络基础学习目录及各章节指引 4.6.3 VTP配置 实验目的 学习思科私有协议VTP的配置方法,观察VTP三种工作模式的通信方式 实验工具 Cisco Packet Tracer Student 软件 实验环境 安装模拟器的Windows系统 实验步骤 第一步:根据拓扑图,选择三台同…

老胡的周刊(第097期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 Chat2DB[2] Chat2DB 是一款有开源免费的智能…