API 网关:Kong、APISIX、Traefik 生产治理与故障排查

API 网关位于客户端和后端服务之间,承担路由、认证、限流、TLS、灰度、观测和协议治理。它同时也是高影响故障点:一条错误路由、全局插件或证书变更可能影响所有业务。本文不拘泥于单一厂商,以 Kong、Apache APISIX 和 Traefik 的共同能力为主线,建立生产设计和排障方法。

网关变更可能立即改变外部流量。生产配置必须经过离线校验、差异审阅、分批应用和回滚验证。不要将 Admin API、Dashboard 或控制面直接暴露到公网。

一、先确定网关角色

网关可以部署在互联网边界、微服务入口、Kubernetes Ingress/Gateway API 或内部东西向入口。不同位置的安全与延迟目标不同。

客户端
  ↓ DNS / CDN / WAF
负载均衡
  ↓
API Gateway 数据面
  ├─ 认证、限流、路由、重写、审计
  └─ 可观测性
  ↓
后端服务 / Kubernetes Service

不要让同一实例同时承担所有区域、所有环境和所有租户而没有故障隔离。

二、控制面与数据面

Kong、APISIX 等可采用数据库/配置中心支撑的集中配置,也可采用声明式或 DB-less 模式。Traefik 常通过文件、Kubernetes、Consul Catalog 等 Provider 动态发现配置。

核心问题:

  • 控制面不可用时,数据面能否继续使用最后配置;
  • 新节点是否能获取配置;
  • 配置下发延迟与一致性;
  • 控制面凭证和管理端口如何隔离;
  • 配置如何备份、审计和回滚。

控制面高可用不等于数据面高可用,反之亦然。

三、路由模型

路由通常基于 Host、Path、Method、Header、Query 或 SNI。规则必须避免歧义和意外覆盖。

治理建议:

  • 域名和 Path 归属明确;
  • 精确路由优先于宽泛通配;
  • /api 与 /api/ 行为一致性经过测试;
  • 重写前后路径有日志;
  • 404、405、无匹配路由可区分;
  • 不允许租户创建覆盖平台管理路由的规则。

每条路由应有所有者、业务名称、环境、后端、SLO 和变更来源标签。

四、上游与健康检查

被动健康检查根据真实请求失败标记节点;主动健康检查周期探测。仅 TCP 通不代表应用就绪。

健康端点应验证关键进程和必要依赖,但不能执行昂贵全链路查询。配置时考虑:

  • 健康/不健康阈值;
  • 超时和探测间隔;
  • 状态码范围;
  • 慢启动与预热;
  • 节点摘除后的连接排空;
  • 恢复后是否立即承载全部流量。

所有节点被判不健康时,网关可能返回 502/503,也可能按配置继续尝试。必须演练这一边界。

五、超时、重试与幂等性

需要分别设置连接、发送、读取和总请求超时。网关超时应与客户端和后端配合,避免客户端已放弃而后端继续执行。

重试只适合明确可重试的失败和幂等请求。对支付、下单等 POST 请求自动重试可能产生重复副作用。推荐:

  • 使用幂等键;
  • 限制重试次数;
  • 采用指数退避与抖动;
  • 不在多层同时重试形成放大;
  • 记录每次尝试和最终结果。

六、认证与授权

常见方式包括 API Key、JWT、OAuth2/OIDC、mTLS 和外部鉴权。网关验证身份后,还要明确后端是否信任网关注入的 Header。

安全要点:

  • 删除来自客户端的伪造身份 Header,再由网关重新注入;
  • JWT 校验 Issuer、Audience、签名算法、过期和时钟偏差;
  • JWKS 获取失败时定义缓存和降级策略;
  • 管理员、消费者、插件密钥分离;
  • 鉴权失败不泄露内部细节;
  • 高风险接口执行细粒度授权,而不只验证“已登录”。

七、限流、配额与防突发

限流可按 IP、用户、消费者、路由或租户执行。单节点本地计数性能好但全局不精确;集中式计数更一致但引入外部依赖和延迟。

设计时确认:

  • 限制对象和窗口算法;
  • 多实例下是否需要全局一致;
  • Redis/计数存储不可用时 Fail-open 还是 Fail-close;
  • 返回 429、Retry-After 与客户端退避;
  • 突发容量与持续速率;
  • 内部可信流量是否有独立配额。

限流不能替代后端容量和队列保护。

八、熔断与过载保护

网关可通过并发限制、连接池、超时、健康检查和熔断保护后端。熔断条件需要避免因短暂错误把所有实例同时摘除。

关键观测:后端错误率、P99 延迟、打开状态、半开探测、排队和拒绝数量。恢复必须渐进,而不是瞬间放回全部流量。

九、灰度与蓝绿发布

流量可按权重、Header、Cookie、用户或租户分配。APISIX 的 traffic-split、Kong 的相关流量控制能力以及 Traefik 的加权服务都可实现类似策略。

灰度流程:

  1. 新版本先进行内部探测;
  2. 选择稳定识别维度;
  3. 从极小比例开始;
  4. 对比错误率、延迟和业务指标;
  5. 逐级放量;
  6. 达到阈值自动或人工回退;
  7. 确认会话、缓存和数据库兼容。

少量请求下权重统计可能偏离设定值,不能用十次请求判断精确比例。

十、TLS 与证书治理

入口 TLS、上游 TLS 和 mTLS 是不同链路。生产要管理:

  • 证书域名、链和私钥;
  • 自动续期与到期告警;
  • SNI 多证书;
  • TLS 版本和密码套件;
  • 上游证书校验;
  • mTLS 客户端身份和吊销;
  • 私钥最小权限与轮换。

证书续期成功但网关未热加载,是常见故障。应通过外部探测验证实际提供的证书。

十一、配置即代码

网关配置应在 Git 中声明,经过 Schema 校验、策略、Diff 和分环境晋级。Kong 可使用 decK 等工具导出/校验/同步;APISIX 可通过声明式工具或 Admin API 的受控自动化;Traefik 可由文件和 Kubernetes CRD/Gateway API 驱动。

流程应避免两个控制源同时管理同一路由。控制台手工变更必须纳入审计并及时回写声明配置。

十二、插件治理

插件运行在请求路径上,错误或慢插件会直接增加全局延迟。治理包括:

  • 插件白名单和版本固定;
  • 全局、Service、Route、Consumer 作用域明确;
  • 外部依赖超时和熔断;
  • 敏感数据脱敏;
  • 自定义插件性能和安全测试;
  • 逐步启用并可快速禁用。

不要在日志插件中输出 Authorization、Cookie、密码、身份证号和完整请求体。

十三、可观测性

指标至少包括:请求量、状态码、网关延迟、上游延迟、请求/响应大小、活动连接、重试、限流、熔断、健康节点、配置下发状态和证书到期时间。

访问日志建议包含:Trace ID、请求 ID、Route/Service、Consumer、上游节点、网关耗时、上游耗时、状态码和重试次数。采用采样时,对错误和高延迟请求优先保留。

十四、常见 4xx/5xx 排查

404

确认 DNS/Host、入口端口、路由优先级、Path 是否重写、Method 和配置是否已下发。

401/403

区分未认证与无权限,检查时间同步、Token Audience、JWKS、Key、证书和身份 Header。

429

定位是哪一层限流、计数 Key、窗口和共享存储,确认是否误把 NAT 后全部用户视作同一 IP。

502

通常表示无法与上游正常通信:DNS、连接拒绝、TLS、协议不匹配或连接被重置。

503

可能无健康上游、主动摘除、路由未就绪或网关过载。

504

上游未在读取超时内返回。应结合后端 Trace 判断慢在排队、数据库、下游还是网络。

十五、备份与灾难恢复

备份范围包括:声明配置、数据库、配置中心、证书与私钥引用、插件、License、RBAC、消费者与凭证、审计和部署参数。

Kong 数据库模式宜同时保留数据库原生备份和声明式导出;声明式导出可能不覆盖全部实体。DB-less 模式要备份配置文件和相关密钥。任何方案都应在隔离环境恢复并验证真实请求。

十六、升级策略

  1. 核对版本兼容、插件和数据库迁移;
  2. 完成数据库与声明配置备份;
  3. 在预生产回放代表性流量;
  4. 先升级控制面或按官方顺序执行;
  5. 灰度数据面节点;
  6. 验证错误率、延迟、证书、插件和配置;
  7. 明确数据库迁移是否可逆。

不要在未验证插件兼容时直接滚动全部网关节点。

十七、上线检查清单

  • 控制面、管理端和 Dashboard 不暴露公网;
  • 路由无歧义且有所有者;
  • 超时、重试和幂等策略一致;
  • 认证 Header 防伪造,密钥最小权限;
  • 限流外部存储故障行为已定义;
  • 灰度发布具备业务指标和回退阈值;
  • 日志已脱敏并可关联 Trace;
  • 证书、配置和数据库完成恢复演练;
  • 单节点、控制面和后端全故障场景均经过验证。

参考资料

  • Kong Gateway Documentation:https://developer.konghq.com/gateway/
  • Kong Backup and Restore:https://developer.konghq.com/gateway/upgrade/backup-and-restore/
  • Apache APISIX Documentation:https://apisix.apache.org/docs/apisix/
  • Traefik Proxy Documentation:https://doc.traefik.io/traefik/
Copyright © yan-jian.com 2023 - 2026 · Powered by GitBook更新时间: 2026-11-03 16:23:44

results matching ""

    No results matching ""