Envoy vs Traefik
云原生场景,产生了很多的Edge Router,Load balance,API Gate Way,Proxy等组件。
最近研究了一下,分享几个喜欢的项目,它们大致分为两类:
- Gateway为主:Kong,Krakend
- Proxy为主:Envoy,Traefik
但两类没有实际功能的边界,Proxy为主,一般要支持在L4,Gateway为主,支持在L7即可。
Proxy主要位置是中间,可以做sidecar,Gateway在服务endpoint前面。
再比如传统的HAProxy就是Proxy,Nginx就偏Gateway。
这个概念和数据通信网络的Core Router和Edge/Service Router是差不多的,Edge Router是感知服务的,理论上功能更多,Data Plane基本一样,Control Plane功能更丰富而已。
所以Gateway一般是一个Control Plane + Data Plane,比如Kong的Data Plane就是OpenResty。
使用Envoy作为Data Plane的Control Plane有Solo.io(Istio族下)。
从需求角度,我有几个偏好:
- 高性能:C++,Rust,Golang还可以,其他语言就别Data Plane了
- 高扩展:必须支持插件,动态(如LuaJIT)或者静态(链接库)。
- 独立:Serverless,无依赖,无状态,单daemon,最好自带UI。
- 小而美:其实和上面几个也是一个意思,最好带简单Control Plane,但要节制。
功能性能上,需要看场景。我关注在差异上,也就是高扩展与独立。
- Envoy:C++原生性能没得说,线程模型比Nginx还先进,水平扩展,所有配置均支持动态接口。最吸引我的是WASM的插件机制,逻辑上WASM可以编译到原生水平,还有很好的容器属性。只要push/pull就能增加插件进行使用。
- Traefik在今年上半年选型时,我很看好,独立,2.0开始支持L4,与Swarm,K8S结合都很好,性能也与Nginx不相上下,但配置动态还自带UI,可惜当时不支持插件,惜败。没想到从2.3开始支持golang的动态链接库和golang代码解析执行两种(Dev Mode),实验阶段。
- Kong/OpenResty:Nginx性能没的说,Lua动态没得说,Kong增加了控制平面的动态能力,差就差在Kong是几个东西组合的,大而全,但不小也不美,配置部署都麻烦。
- Krakend:这个是个欧洲公司,小众,golang,插件支持Lua与Golang,性能说是比Kong高,有很技术后发优势,小而美,自带UI。但生态上还是和几个大哥差太多了,怕半路夭折了,长期观望。
Envoy VS Traefik
- C++ VS Golang
- WASM插件 VS Golang插件
- 小而聚(无控制) VS 小而全(自带UI)
Envoy WASM插件:
https://github.com/envoyproxy/envoy/tree/master/examples/wasm-cc
BodyRewrite的流程,弄了一遍,总体不算太痛苦,哭在写C++上比较烦,当前还支持Rust,所以不算缺点。
本身插件是WASM文件,如果支持容器,还需要一些繁琐的步骤。据说性能目前还不行。可以先用Lua。
这里是Hub的生态,还比较冷清
https://docs.solo.io/web-assembly-hub/latest
Traefik插件:
https://github.com/traefik/plugindemo
Golang的开发成本更低,写起来比较快,动态性上差点。
Plugins的生态更冷清。
https://pilot.traefik.io/plugins
虽然在插件概念上,大家都各用奇招。但插件需求还是比较高级的开发者需求,普通用户不一定用到。
我关注的其他功能
- gRPC:都支持。
- 状态:虽说Proxy无状态的,但状态是我的特殊需求,比如RateLimit如何实现,分布式下如何存储状态,效率如何。两者实现默认都是无状态的,不能集群全局RateLimit。Envoy给了一种gRPC实现有状态的实现的例子。
- 数据收集:Traefik比较弱,主要是文本输出Access,Envoy更加灵活可以将日志通过gPRC protobuf输出。
总结
Envoy的门槛更高,定位更有想象力,聚焦Data Plane,CloudNative的网红。
Traefik自带Control,上手快速,功能不花哨,就和它的Sologan一样 “Just Works“。
各有优劣,不相上下,持续关注吧。