为什么 APISIX Ingress 是比 Traefik 更好的选择?

更新时间 2022-10-25

Apache APISIX Ingress 是什么

Apache APISIX Ingress 是一个使用 Apache APISIX 作为数据面的 Kubernetes Ingress controller 实现。

支持多种规则的配置方式:

  • Ingress
  • APISIX Ingress CRD (自定义资源)
  • Gateway API

其整体采用数据面和控制面分离的架构,由 Apache APISIX 承载实际的业务流量,所以这可以大大提升整体的安全性,极大的避免了由于数据面被攻击而导致 Kubernetes 集群被攻击的可能。

APISIX Ingress architecture

Traefik 是什么

Traefik 是由 Traefik Labs 开源的一款反向代理和负载均衡器。

在 Kubernetes 中支持多种规则的配置方式:

  • Ingress
  • Traefik IngressRoute (自定义资源)
  • Gateway API

Traefik 是一个统一的二进制文件,控制面和数据面的代理逻辑都在一起。如果受到攻击或者有远程执行的安全漏洞被利用,可能存在 Kubernetes 集群被攻击的情况。

Traefik architecture

对比

接下来笔者将从以下几个维度对 Apache APISIX Ingress 和 Traefik 做一些对比。

协议支持

作为网关,最为核心的能力便是要能够正确的代理流量。作为 Kubernetes 集群的入口网关,主要处理如下两部分的流量:

  • Client 到网关的流量;
  • 网关与 Upstream 的流量;

如下所示:

1Client  <---->  Ingress  <---->  Upstream Service

当前的协议多种多样,以下是个简单的列表供读者进行对比。

协议APISIX IngressTraefik
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 IngressTraefik
归属Apache 软件基金会(ASF)Traefik Labs
协议Apache 2.0MIT
诞生时间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 选型时提供一些帮助。