Apache APISIX Ingress 是什么
Apache APISIX Ingress 是一个使用 Apache APISIX 作为数据面的 Kubernetes Ingress controller 实现。
支持多种规则的配置方式:
- Ingress
- APISIX Ingress CRD (自定义资源)
- Gateway API
其整体采用数据面和控制面分离的架构,由 Apache APISIX 承载实际的业务流量,所以这可以大大提升整体的安全性,极大的避免了由于数据面被攻击而导致 Kubernetes 集群被攻击的可能。
Traefik 是什么
Traefik 是由 Traefik Labs 开源的一款反向代理和负载均衡器。
在 Kubernetes 中支持多种规则的配置方式:
- Ingress
- Traefik IngressRoute (自定义资源)
- Gateway API
Traefik 是一个统一的二进制文件,控制面和数据面的代理逻辑都在一起。如果受到攻击或者有远程执行的安全漏洞被利用,可能存在 Kubernetes 集群被攻击的情况。
对比
接下来笔者将从以下几个维度对 Apache APISIX Ingress 和 Traefik 做一些对比。
协议支持
作为网关,最为核心的能力便是要能够正确的代理流量。作为 Kubernetes 集群的入口网关,主要处理如下两部分的流量:
- Client 到网关的流量;
- 网关与 Upstream 的流量;
如下所示:
1Client <----> Ingress <----> Upstream Service
当前的协议多种多样,以下是个简单的列表供读者进行对比。
协议 | APISIX Ingress | Traefik |
---|---|---|
HTTP/HTTPS | 支持 | 支持 |
HTTP/2 | 支持 | 支持 |
HTTP/3 | 不支持 | 支持 |
TCP | 支持 | 支持 |
UDP | 支持 | 支持 |
WebSocket | 支持 | 支持 |
Dubbo | 支持 | 不支持 |
此外,无论是 APISIX Ingress 还是 Traefik 均可通过 HTTP/2 或者 TCP 代理等方式支持 gRPC、MQTT 等协议,故而未在上述表格中列出。
从协议支持的角度来看,APISIX Ingress 和 Traefik 各有优势。APISIX 对于 HTTP/3 的支持正在规划中。
可扩展性
由于业务需求多种多样,所以可扩展性也是进行技术选型的一项主要指标。Apache APISIX Ingress 和 Traefik 均提供了一些扩展方式, 以下将分别进行介绍。
Apache APISIX Ingress
在 APISIX Ingress 中进行功能扩展,主要是通过开发自定义 Plugin 完成的。当前主要支持如下几种 Plugin 的开发方式:
- 通过 Lua 进行插件的开发:这种方式相对简单,并且几乎没有性能损耗;
- 通过 *-plugin-runner 开发:这种模式下支持 JAVA/Python/Go 等语言进行开发,这可以方便用户利用一些现有的业务逻辑,并且无需学习新语言;
- 通过 WASM 进行插件插件:这种模式下,可以使用任何支持构建出 WASM 的语言进行插件开发;
此外还可以通过 serverless plugin 来直接书写 Lua 代码,快速的满足业务需求。
当然,如果你有 Lua 模块的开发经验,也可以直接写 Lua 模块,然后进行加载即可,增加如下配置即可:
1apisix:
2 ...
3 extra_lua_path: "/path/to/example/?.lua"
具体的 Plugin 开发步骤和使用,请参考 Apache APISIX 的插件开发文档 和 APISIX Ingress 如何支持自定义插件。
Traefik
Traefik 也提供了 Plugin 机制用于对功能进行一些扩展。但是 Traefik 是由 Go 进行开发的,它的插件同样也是用 Go 进行开发的。
在开发完就可以在 Traefik 的配置中添加如下内容进行引用了。如下:
1experimental:
2 localPlugins:
3 example:
4 moduleName: github.com/traefik/pluginproviderdemo
这里需要注意,Plugin 的名字,需要与包名保持一致。
总体来说,APISIX Ingress 提供了更多种的扩展方式,可以根据实际情况进行灵活选择,选择自己最喜欢/擅长的工具即可,而且也更容易与自己的现有业务进行集成。 而 Traefik 仅支持通过 Go 语言进行开发。
生态
在进行技术选型的时候,主要会考虑项目所使用的协议,项目的归属等方面,以及与现有基础设施是否可以整合。
对比维度 | APISIX Ingress | Traefik |
---|---|---|
归属 | Apache 软件基金会(ASF) | Traefik Labs |
协议 | Apache 2.0 | MIT |
诞生时间 | 2019 年 6 月 | 2015 年 8 月 |
consul | 支持 | 支持 |
nacos | 支持 | 不支持 |
Eureka | 支持 | 不支持 |
etcd | 支持 | 支持 |
zookeeper | 支持 | 支持 |
DNS | 支持 | 不支持 |
上述对比同时包含了控制面和数据面方面的内容。此外,这两个项目都非常积极与一些周边项目进行了集成和合作,比如 Rancher、KubeSphere 等。
从这个角度来看,APISIX Ingress 相比于 Traefik 提供了更为广泛的与基础组件的集成能力。在进行技术选型时,可以结合当前自己所用的基础组件的情况进行权衡。
来自用户的声音(用户案例)
地平线使用 APISIX Ingress 替换了 Traefik,主要是考虑如下方面:
- 通过 Annotation 增加的配置不易重用;
- Traefik 中默认的行为与 NGINX 中不同,用户在使用时候会产生困惑;
在切换为 Apache APISIX Ingress 后,得益于 APISIX Ingress 丰富的插件生态,绝大多数需求均可通过内置插件满足。并且插件的配置可直接通过 APISIX Ingress 的 ApisixRoute 资源进行定义,比较直观。也可以通过 ApisixPluginConfig 进行插件模板的配置,在其他的 ApisixRoute 资源中进行引用。
APISIX Ingress 的数据面性能更佳,能高效的应对日益增长的业务流量,而不会陷入性能瓶颈。
除去地平线以外,包括少年得到,观为智慧等公司也都使用 APISIX Ingress 替换了 Traefik,更多用户案例请参考用户案例。
此外,Apache APISIX 社区非常活跃,在 GitHub、Slack 等频道上,都可以很快的得到响应,或找到解决办法。
总结
本篇笔者从协议支持,可扩展性和生态等方面对比了 Apache APISIX Ingress 和 Traefik,从中可以看到 APISIX Ingress 在可扩展性和生态集成方面有一定的优势,用户可以更容易的对 APISIX Ingress 进行扩展,以及和一些基础组件进行集成。希望能为读者在进行 Kubernetes Ingress controller 选型时提供一些帮助。