Istio 和 Envoy 的 WebAssembly 可扩展性:回顾一周年

Istio 和 Envoy 的 WebAssembly 可扩展性的最新进展。

Mar 5, 2021 | By Pengyuan Bian - Google

在一年前的今天,我们向 Istio 1.5 版本中引入了基于 WebAssembly 的可扩展性。

在过去的一年里,Istio、Envoy 和 Proxy-Wasm 社区继续共同努力, 使 WebAssembly(Wasm)可扩展性更加稳定、可靠且易于采用。 让我们通过 Istio 1.9 发布版对 Wasm 支持进行更新,并谈谈我们未来的计划。

WebAssembly 支持已合并到上游 Envoy

在将 Wasm 和 WebAssembly for Proxies(Proxy-Wasm)ABI 的实验性支持添加到 Istio 对 Envoy 的分支后,我们从早期用户收集了一些很好的反馈。 这些反馈与开发核心 Istio Wasm 扩展所获得的经验相结合, 帮助 WebAssembly 在运行时变的更加成熟和稳定。 这些改进解决了可直接将 Wasm 支持合并到 Envoy 上游的阻碍, 于是在 2020 年 10 月它成为所有官方 Envoy 版本的一部分。 这是一个重要的里程碑,因为它表明:

wasm-extensions 生态系统仓库

作为 Envoy Wasm 运行时的早期用户,Istio 的可扩展性和可观测工作组在开发扩展方面获得了很多经验。 我们构建了几个一流的扩展,包括 Metadata 交换Prometheus 统计信息属性生成。 为了更广泛地分享我们的学习成果,我们在 istio-ecosystem 组织中创建了一个 wasm-extensions 存储库。 该存储库有两个目的:

该指南目前涵盖了使用 C++ 进行 WebAssembly 扩展开发和单元测试, 以及使用 Go 测试框架进行集成测试, 通过运行带有 Istio 代理二进制文件的 Wasm 模块来模拟真实运行时。在未来,我们还将添加几个更多的规范扩展, 例如与 Open Policy Agent 的集成以及基于 JWT 令牌的请求头操作。

通过 Istio 代理分发 Wasm 模块

在 Istio 1.9 之前,需要使用 Envoy 远程数据源将远程 Wasm 模块分发到代理。 在此示例中, 可以看到定义了两个 EnvoyFilter 资源:一个用于添加远程获取 Envoy 集群,另一个用于将 Wasm 过滤器注入 HTTP 过滤器链中。 这种方法有一个缺点:如果由于错误的配置或瞬态错误而导致远程获取失败, 则 Envoy 将被错误的配置卡住。如果将 Wasm 扩展配置为 fail closed, 则错误的远程获取将阻止 Envoy 提供服务。要解决这个问题, 需要对 Envoy xDS 协议进行根本性改变, 使其允许异步 xDS 响应。

Istio 1.9 通过利用 istio-agent 内部的 xDS 代理和 Envoy 的扩展配置发现服务(ECDS), 提供了一个可靠的开箱即用的分发机制。

istio-agent 拦截来自 istiod 的扩展配置资源更新, 从中读取远程获取提示,下载 Wasm 模块,并使用已下载的 Wasm 模块路径重写 ECDS 配置。如果下载失败,istio-agent 将拒绝 ECDS 更新并阻止错误配置到达 Envoy。有关更多详细信息, 请参见我们的 Wasm 模块分发文档

远程获取 Wasm 模块流程
远程获取 Wasm 模块流程

Istio Wasm SIG 和未来工作

尽管我们在 Wasm 可扩展性方面取得了很多进展,但该项目仍有许多方面需要完成。 为了整合各方的努力并更好地应对未来的挑战,我们成立了一个 Istio WebAssembly SIG, 旨在提供一种标准和可靠的方式,使 Istio 能够使用 Wasm 扩展。 以下是我们正在处理的一些事项:

如果您想加入我们,该小组将每隔一周的北京时间星期三上午 6 点 (太平洋时间星期二下午 2 点)举行会议。 您可以在 Istio 工作组日历上找到会议。

我们期待看到您如何使用 Wasm 来扩展 Istio!