Apache APISIX 和 Kong 都是围绕 NGINX/OpenResty 构建的可扩展网关,但技术基础相近,并不代表两者在运维上可以直接互换。真正有价值的问题不是“谁的功能清单更长”,而是谁的配置模型、控制面拓扑、扩展方式、升级流程和商业版本边界更适合实际运维团队。
可以分两步做决策:先排除无法满足协议、策略、部署或支持硬性要求的选项,再对剩余候选开展贴近生产的概念验证。厂商跑分或空代理测试都不应成为最终结论。
核心要点
- 比较准确的版本和版本形态;开源版、企业版和托管服务并不具备完全相同的功能。
- 在比较界面体验前,先确定配置的唯一事实来源。
- 盘点插件行为和状态存储方式,而不只是插件名称。
- 在迁移流量前演练升级、回滚和控制面故障。
- 把性能作为可测量维度之一,同时评估正确性、运维、安全与恢复。
比较运维模型
| 维度 | Apache APISIX | Kong Gateway | 决策问题 |
|---|---|---|---|
| 运行时基础 | NGINX、ngx_lua 与 LuaJIT | NGINX/OpenResty 与 Lua | 团队是否已经具备该技术栈的运维和扩展能力? |
| 配置拓扑 | 传统、控制面与数据面分离、Standalone | 传统数据库、Hybrid、DB-less 声明式以及托管 Konnect | 哪个系统持有期望状态并负责分发? |
| 常见外部状态 | 传统或分离模式使用 etcd;Standalone 不使用 etcd | 传统或控制面模式常用 PostgreSQL;DB-less 数据面不使用数据库 | 团队能否运维所选依赖并可靠备份? |
| 声明式流程 | Standalone YAML/JSON 或控制器驱动 | 声明式配置;兼容控制面可使用 decK | 如何比较、审批、提升和回滚变更? |
| 扩展 | Lua 插件、外部 Plugin Runner 与实验性 Wasm 运行时 | Lua 和产品支持的插件生态;自定义能力取决于拓扑与版本 | 所需插件是否受支持并与生命周期兼容? |
APISIX 架构文档说明了核心、Lua 插件、多语言 Plugin Runner 和 Wasm 运行时。部署模式文档区分传统模式、控制面与数据面分离模式以及 Standalone。Standalone 模式把 etcd 移出配置路径,但也改变了完整配置的交付方式。
Kong 的部署拓扑文档区分传统数据库、Hybrid、DB-less 声明式和由 Konnect 管理控制面的模式。DB-less 模式下,每个网关把配置加载到内存;Admin API 对实体增删改为只读,依赖数据库的插件行为也可能受限。这些是工作流选择,而不只是安装参数。
从硬性要求开始
为待评估的准确版本和版本形态建立证据表:
- HTTP、gRPC、WebSocket 和四层流量要求;
- 身份认证与授权集成;
- 限流精度与共享状态需求;
- 服务发现与 Kubernetes Gateway API 的归属;
- 日志、追踪、指标和审计要求;
- 自定义插件语言、隔离方式、依赖与支持模型;
- FIPS、合规、商业支持或托管控制面要求;
- 离线、隔离网络、多区域和数据驻留要求。
插件名称相同并不足以证明能力相同。必须比较 Schema、执行阶段、故障行为、存储方式、响应契约、可观测性和版本归属。如果某项能力在一侧属于商业版本、另一侧属于开源版本,应明确记录这一边界,而不是暗示两者完全一致。
选择配置的唯一事实来源
配置归属决定日常变更是否安全。
APISIX 使用 etcd 时,应保护 Admin API、限制网络暴露、轮换密钥,并定义 etcd 备份与恢复方案。Standalone 文件模式下,应验证并原子发布完整配置,同时确保格式错误或内容不完整的产物不会成为期望状态。
Kong 使用传统或 Hybrid 模式时,应定义 PostgreSQL 备份、控制面可用性与控制面/数据面兼容性。DB-less 模式会以完整声明式配置替换当前状态,因此工作流必须能够发现意外删除。官方 deck gateway 文档为传统、Hybrid 与 Konnect 实例提供 validate、diff、dump、apply 和 sync 操作,但也明确说明这些实时网关命令不管理 DB-less 网关。
无论选择哪种产品,都应回答同一组问题:
- 期望状态在哪里审查?
- 哪个工具负责检测漂移?
- 一次变更是增量更新,还是完整替换?
- 密钥材料如何与普通配置分离?
- 能否在不临时设计方案的情况下恢复上一个已知正常状态?
- 控制面或状态存储不可用时,哪些流量仍可继续处理?
把扩展当作生产代码比较
自定义插件位于请求处理路径中。盘点每个现有 Kong 插件,并把它映射到 APISIX 等效插件、应用行为、外部策略服务或明确删除项。从 APISIX 迁移到 Kong 时也应采用相同方法。
每个插件都应记录:
| 字段 | 迁移证据 |
|---|---|
| 触发条件与阶段 | 相对于认证、改写、路由和日志的执行时机 |
| 配置 | 必填字段、默认值、验证规则与密钥引用 |
| 状态 | 本地内存、共享数据库、外部存储或无状态 |
| 故障契约 | 状态码、重试、降级、超时和返回请求头 |
| 可观测性 | 指标、日志、Trace 属性与原因码 |
| 兼容性 | 网关版本、拓扑、版本形态和运行时依赖 |
测试应围绕行为重写,而不是只比较配置结构。转换后的 YAML 只是迁移输入,不能证明策略执行等价。
把迁移设计成可逆实验
- 盘点路由、服务、上游、Consumer、证书、插件与外部依赖。
- 分类硬性要求、可选行为、失效配置和特定版本能力。
- 转换一个小而有代表性的范围,其中包含一种认证流程、一项有状态策略和一个容易失败的上游。
- 验证Schema,并使用固定版本启动候选网关。
- 回放经过脱敏且贴近生产的流量,比较状态码、请求头、路由、策略决策、日志与 Trace。
- 压测等价拓扑,使用公开方法而不是直接引用厂商数字。
- 影子或灰度流量,但不要让两个网关同时修改同一个下游操作。
- 切换流量,同时设置回滚阈值、负责人并保留源配置。
- 观测错误率、尾延迟、拒绝结果、上游分布、资源使用和配置收敛。
不要一开始迁移所有路由。代表性范围应尽早暴露最困难的状态、安全与扩展差异。
评估升级与故障恢复
在概念验证中至少执行一次升级和一次回滚。两种网关都需要固定数据面、控制面、插件、声明式 Schema 和编排资源之间的兼容关系,并测试以下故障:
- 配置存储或控制面不可用;
- 发布了无效配置;
- 新旧数据面版本同时运行;
- 自定义插件加载失败;
- 证书或密钥刷新失败;
- 节点使用最后已知配置重启;
- 状态或 Schema 迁移后执行回滚。
Kong 的拓扑选择会改变升级顺序和数据库工作;APISIX 的 etcd、分离与 Standalone 模式会改变依赖和配置恢复路径。应比较真正计划运行的拓扑,而不是两套默认的本地安装。
做出有条件的选择
如果团队重视动态 etcd 模型、Standalone 选项、APISIX 插件集或其特定集成生态,APISIX 可能更合适。如果团队已经采用声明式/decK 流程、PostgreSQL 或 Hybrid 拓扑、Kong 插件组合或 Konnect 服务,Kong 可能更合适。如果硬性能力只存在于另一版本、团队无法维护所需依赖,或自定义行为占迁移主体,两者都可能不是合适选择。
只有所有硬性要求通过后,才使用加权评分。建议维度包括正确性、策略覆盖、变更安全、恢复、可观测性、扩展维护、代表性策略下的延迟、基础设施成本、许可与支持。
决策检查清单
- 是否注明准确版本、版本形态与拓扑?
- 是否验证了期望状态与漂移管理流程?
- 所有必要插件是否都有行为测试?
- 是否演练过备份、升级、回滚和控制面故障?
- 跑分是否采用等价拓扑且可复现?
- Kubernetes、多区域和数据驻留边界是否清楚?
- 在生产证据充分之前,迁移是否保持可逆?
总结
APISIX 与 Kong 的选择,本质上是一个被包装成功能对比的运维模型决策。先明确硬性要求,再比较等价的拓扑和版本形态,测试插件语义并演练恢复。真正更合适的网关,是团队能够证明其行为并安全运维的产品,而不是功能清单看起来更长的产品。
常见问题
APISIX 是否始终比 Kong 更快?
不存在跨版本、硬件、拓扑、协议、插件、TLS 设置和负载形态都成立的通用结论。应针对计划部署的环境开展受控测试。
声明式配置能否直接让网关具备 GitOps 能力?
它能提供帮助,但只把配置放进 Git 并不是完整交付系统。仍需要验证、密钥管理、差异审查、环境提升、漂移检测、可观测性和回滚。
迁移工具能否代替迁移测试?
不能。配置转换可以加快资产迁移,但只有行为与故障测试才能证明策略等价。
后续步骤
使用可复现的 Traefik、Kong 与 APISIX 跑分方法,了解 API 网关插件设计,并通过金丝雀流量规划可逆发布。
