土法炼钢兴趣小组的算法知识备份

【Envoy 数据面】扩展边界:Wasm / Lua / ext_authz / Rate limit 挂在哪一层

文章导航

分类入口
networkproxy
标签入口
#envoy#wasm#lua#ext-authz#rate-limit#filter-chain#extensions

目录

前面篇章把 Listener → HCM → Router → Cluster 与 xDS / Hot restart 钉成内核。生产里下一问通常是:鉴权、限流、自定义逻辑该进原生 filter、Lua、Wasm,还是外部服务? 答错的代价不是「多写几行配置」,而是把延迟、故障域和安全边界画歪。

本文只标机制位置与边界,不写 Wasm SDK、Lua 手册或限流服务搭建教程。沙箱与 WASI 通则见 architecture/97;令牌桶/过载算法见 architecture/25。可观测如何挂上这些扩展,见 第 14 篇

本文是「Envoy / 数据面代理内核」系列第 13 篇(共 16 篇)。→ 系列目录

篇目 核心内容
第 12 篇 · Hot restart / drain 进程级变更
第 13 篇 · 扩展边界 Wasm / Lua / ext_authz / ratelimit
第 14 篇 · 可观测数据面 stats / log / tracing 落点

版本锚定:Envoy v1.39.0 HTTP Wasm / Lua / External Authorization / Local rate limit / Rate limit 过滤器文档。Wasm filter 在该版本仍标为 experimental


一、先画格子:扩展插在哪

Envoy 扩展按事件模型落在不同层(与 第 1 篇 请求路径轴一致):

事件 本篇代表
Network filter 连接字节流 较少用 Lua/Wasm 做主鉴权;L4 策略另论
HTTP filter 链 已解码的请求/响应 Lua、Wasm、ext_authz、local/global ratelimit
Router 之后 / 上游 选 cluster 之后 Upstream Wasm 等(仍属 HTTP 上游路径)
进程外 gRPC/HTTP 调用 ext_authz、global rate limit 服务
flowchart LR
  subgraph hcm ["HCM HTTP filter chain"]
    Lua["Lua"]
    Wasm["Wasm"]
    Authz["ext_authz"]
    LRL["local_ratelimit"]
    GRL["ratelimit filter"]
    Router["Router"]
  end
  Authz -->|"CheckRequest"| ExtSvc["External authz service"]
  GRL -->|"ShouldRateLimit"| RLSvc["Rate limit service"]
  hcm --> Upstream["Upstream cluster"]

顺序语义(第 6 篇展开):先匹配的 filter 先看到请求。鉴权放在可能改路由的过滤器之后,会引入「先定路由再鉴权 / 清 route cache 后绕过鉴权」类问题——v1.39.0 ext_authz 文档对此有专节警告。


二、Wasm:隔离与 ABI,不是「万能插件槽」

2.1 在 Envoy 里的位置

envoy.filters.http.wasm(及网络/上游变体)把用户模块跑在 Wasm VM 中,经 Proxy-Wasm 风格宿主 ABI 访问 headers、body、metadata。配置形如本地 .wasm 或远程加载(具体字段见 v1.39.0 Wasm filter 文档)。Windows 不支持;文档标明 experimental,配置结构仍可能演进。

2.2 与 architecture/97 的分工

architecture/97 本篇
Core 语义、WASI、组件模型、Isolate 对照 Envoy embedder 边界:filter 链位置、实验状态、与原生 C++ filter 的权衡
通用插件架构 不教如何写 filter 代码

谱系回指:Wasm 的沙箱假设来自 Haas et al., PLDI 2017 等(详见 97);Envoy 选用它,是为在代理进程内跑不可全信逻辑,同时比直接 dlopen 原生插件少一层内存破坏面。代价是:ABI 稳定性、序列化/拷贝、VM 实例生命周期,以及实验特性的运维不确定性。

2.3 何时不该用 Wasm


三、Lua:同进程脚本,边界在「信任与安全交互」

Lua HTTP filter 在 Worker 内解释执行,能读改 headers、与异步集群调用等(能力以 v1.39.0 Lua 文档为准)。机制特征:

一句话:Lua 是可信运维的手术刀,不是租户插件平台。


四、ext_authz:把决策挪出数据面

External Authorization filter 在请求路径上调用外部 gRPC 或 HTTP 服务,用 CheckRequest / 响应决定放行或 403(可配置)。机制要点:

维度 含义
失败域 鉴权服务超时/错误 → 由 failure_mode_allow 等决定 fail-open / fail-closed
数据面负担 每请求(或按 runtime 采样)一次出站调用;可带 body(with_request_body
安全耦合 必须注意与后续清 route cache 的 filter 的顺序;推荐用 ExtensionWithMatcher 做条件启用,而非仅依赖已 disabled 的 filter 上的 metadata 开关
可观测 ok / denied / error / failure_mode_allowed 等 cluster 命名空间计数

与 Wasm/Lua 的对比:策略实现与发布可独立于 Envoy 二进制,但换来同步依赖:鉴权集群与数据面同命运。Mesh 里常见「策略中心 + ext_authz」,属于产品层选择;本系列只要求读者能指出过滤器挂点和失败语义。


五、Local vs Global rate limit:算法在 25,落点在 filter

architecture/25 讲令牌桶、滑动窗口、过载保护的算法与部署层。Envoy 侧对应两个机制位置:

5.1 Local rate limit

5.2 Global(服务型)rate limit

Local Global
状态位置 本进程内存 外部 RLS
跨实例一致 是(依赖 RLS)
故障模式 随 Envoy RLS 超时/错误策略
典型用途 单实例保护、简单路由配额 网格级、多代理共享配额

六、对照表与选型句

扩展 隔离 同进程? 典型代价中心 信任假设
原生 C++ filter 无额外沙箱 开发与发布周期 与 Envoy 同信任
Lua 弱(语言层) 解释与 API 误用 运维可信脚本
Wasm VM 沙箱(实验中) 是(VM 内) ABI/延迟/实验性 半可信插件
ext_authz 进程外 调用外置 超时与 fail 模式 鉴权服务可信
local ratelimit 内存桶、不精确全局
global ratelimit 进程外 调用外置 RLS 可用性 RLS 可信

选型句:不可信多租户逻辑 → Wasm 或进程外服务,不要 Lua;强一致跨实例配额 → global RLS + 25 文中的算法陷阱;只防单实例过载 → local;身份/鉴权要独立演进 → ext_authz,并锁死与 route mutation 的顺序。


七、争论与开放问题

争论 A B 落点
Wasm vs 原生 filter 隔离、多语言、热加载潜力 延迟、实验 API、运维工具链 热点路径慎用 Wasm(系列 16 再收束)
ext_authz vs 网关内建鉴权 策略中心化 多一跳故障 看 SLO 与团队边界
Local vs Global 限流 简单可靠 配额准确 分层;算法见 25

开放问题:Proxy-Wasm ABI 与 Envoy Wasm filter 实验状态收敛后,是否足以在多租户网关上替代「旁路容器插件」——取决于隔离证明、尾延迟与生态稳定性,需跟踪实验特性毕业标准,而非假设「即将统一」。


八、参考资料

规范 / 官方文档(A)

论文 / 站内(谱系)

源码(A)

实验台账


九、小结

  1. 扩展先问挂点与信任域,再问实现语言。
  2. Wasm 提供进程内沙箱潜力,但仍是实验特性;细节沙箱语义回指 architecture/97。
  3. Lua 适合可信粘合;与 ext_authz 组合时必须防范 route cache 清空导致的鉴权绕过。
  4. Local/Global ratelimit 是算法(25)在数据面上的两种落点——进程内止血 vs 外部配额协同。

系列目录 · 上一篇:Hot restart 与 drain · 下一篇:可观测数据面

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-08-10 · network / proxy

Envoy / 数据面代理内核:从 Listener 到 xDS

补齐站内 Envoy 单篇地图与 Mesh/网关选型之间的数据面内核层:Main/Worker、FilterChainMatch、HCM、Cluster/连接池、xDS warming 与 Hot restart,并以排障与选型收束。


By .