前言
Istio 1.5 开始支持在数据面支持Wasm
扩展,相关规范以及SDK在proxy-wasm,目前提供有三种 SDK 实现,分别是C++
、Rust
和AssemblyScript
,其中AssemblyScript
在solo-io/proxy-runtime。除了 SDK Solo 还发布了 WebAssembly Hub,并配有wasme
CLI 工具,为 Wasm 扩展的开发提供了不错体验。本文主要介绍如何使用 Rust SDK 开发 Istio Wasm 扩展。
更新历史
2020 年 11 月 28 日 - 初稿
扩展阅读
- WebAssembly Hub Tutorials
- Declarative WebAssembly deployment for Istio
- Extending Istio with Rust and WebAssembly
- Deploying Wasm Filters to Istio
- Extended and Improved WebAssemblyHub to Bring the Power of WebAssembly to Envoy and Istio
Wasme 工具
1 | curl -sL https://run.solo.io/wasme/install | sh |
Rust 项目
1
2
3 rustc --version
rustc 1.43.1 (8d69840ab 2020-05-04)
创建Rust项目
使用lib
模板创建项目
1 | cargo new hello-wold --lib |
编辑Cargo.toml
添加依赖
1 | [dependencies] |
配置动态库编译
1 | [lib] |
Wasm 扩展
先通过 Rust SDK 了解扩展功能,编辑src/lib.rs
1 | use proxy_wasm as wasm; |
安装依赖
1 | cargo build |
要了解扩展看下几个 Context 的结构,其中on_*
开头的便是扩展点,其他get_*
、set_*
、add_*
等提供了不能接口能力。
为 Request 添加自定义 Header
1 | use log::info; |
编译
1 | cargo build --target wasm32-unknown-unknown --release |
runtime-config.json
是wasme build
时需要的,可以通过wasme init
创建一个cpp
项目获得
1 | { |
打包
1 | wasme build precompiled target/wasm32-unknown-unknown/release/hello_world.wasm --tag webassemblyhub.io/amoyw/hello_world:v0.0.1 |
wasme build
三种方式,
1
2
3
4
5
6 wasme build -h
Available Commands:
assemblyscript Build a wasm image from an AssemblyScript filter using NPM-in-Docker
cpp Build a wasm image from a CPP filter using Bazel-in-Docker
precompiled Build a wasm image from a Precompiled filter.
本地测试 Envoy
1 | wasme deploy envoy webassemblyhub.io/a mo yw/hello_world:v0.0.1 --envoy-image=istio/proxyv2:1.6.0 --bootstrap=envoy-bootstrap.yml |
1 | { |
wasme deploy
三种方式
1
2
3
4
5
6 wasme deploy -h
Available Commands:
envoy Run Envoy locally in Docker and attach a WASM Filter.
gloo Deploy an Envoy WASM Filter to the Gloo Gateway Proxies (Envoy).
istio Deploy an Envoy WASM Filter to Istio Sidecar Proxies (Envoy).
WebAssembly Hub 使用
Create a User on webassemblyhub.io & Log In from the wasme command line
Push 镜像
1 | wasme push webassemblyhub.io/amoyw/hello_world:v0.0.1 |
发布到 Istio
httpbin 用例自己部署,本例
namespace=ns-httpbin
可以分别通过wasme
工具或operator
添加扩展
CLI 手动添加
1 | wasme deploy istio webassemblyhub.io/amoyw/hello_world:v0.0.1 \ |
http://{ingress-host}:{port}/headers
1 | { |
卸载
1 | wasme undeploy istio \ |
Operator
CRD
1 | kubectl apply -f https://github.com/solo-io/wasme/releases/latest/download/wasme.io_v1_crds.yaml |
Operator
1 | kubectl apply -f https://github.com/solo-io/wasme/releases/latest/download/wasme-default.yaml |
Filter
1 | $ kubectl apply -f - <<EOF |
Filter 状态
1 | kubectl get filterdeployments.wasme.io -n ns-httpbin -o yaml hello-world-filter |
注意看下 Pod 是否成功,如果
READY 1/2
可能是istio-proxy
没有启动,测试时这里遇到问题wasme-cache
经常失败,可能是网络问题,并且失败后不能续传。可以进入 Pod 看缓存的尺寸是否和hello_world.wasm
尺寸一致,缓存路径/var/local/lib/wasme-cache/
,不一致就等缓存完成后再测试。
http://{ingress-host}:{port}/headers
1 | { |
卸载
1 | kubectl delete FilterDeployment -n ns-httpbin hello-world-filter |