前言

所有流量从北向南进入集群的那个"大门"叫网关。老朋友 Nginx 能打,但 K8s 时代有了新选手:Traefik(云原生原生)、APISIX(插件平台)。这篇给一个可落地的选型框架。

一、网关要解决什么

         ┌─── 路由: 域名/路径/Header → 后端
流量 ───►├─── TLS 终结: 证书统一管理
         ├─── 认证: JWT/API Key/OIDC
         ├─── 限流熔断: 保护后端
         ├─── 可观测: 访问日志/指标/trace
         └─── 灰度: 按 header/比例分流

演进主线:静态配置 → 动态配置(不 reload) → API 驱动(可编程)。

二、三位选手画像

Nginx(+ OpenResty/Lua)

# 经典配置: 一切靠文件 + reload
server {
    listen 443 ssl http2;
    server_name api.example.com;
    location / {
        proxy_pass http://upstream;
        limit_req zone=api burst=100;
    }
}
优点 缺点
性能天花板、极稳 改配置要 reload(毫秒级断连风险)
生态/文档/运维经验最厚 动态能力靠 Lua(OpenResty)开发门槛
K8s 有 ingress-nginx 传承 原生没有控制台/API

Traefik(云原生亲儿子)

# K8s IngressRoute: 自动发现后端, 改动秒级生效无 reload
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: api
spec:
  entryPoints: [websecure]
  routes:
  - match: Host(`api.example.com`) && PathPrefix(`/v2`)
    kind: Rule
    services: [{name: api-v2, port: 80}]
    middlewares: [{name: ratelimit}]
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: ratelimit
spec:
  rateLimit: {average: 100, burst: 50}
优点 缺点
K8s CRD 声明式、自动服务发现 极端性能弱于 Nginx/APISIX
内置 Dashboard(拓扑一目了然) 复杂插件生态较薄
Let’s Encrypt 自动证书! 超大集群性能调优要花心思

APISIX(插件平台)

// 一切皆 API/etcd: 动态路由 + 100+ 现成插件
curl http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT \
  -H "X-API-KEY: $ADMIN_KEY" -d '{
  "uri": "/api/*",
  "upstream": {"type": "roundrobin",
               "nodes": {"api-svc:80": 1}},
  "plugins": {
    "limit-count": {"count": 100, "time_window": 60},
    "jwt-auth": {},
    "prometheus": {}
  }
}'
优点 缺点
全动态(etcd 存储, 热更新) 组件多(etcd+dashboard)运维面大
插件生态炸裂(认证/限流/日志/transform) 学习成本中上
国产开源(Apache 顶级项目, 文档中文友好)

三、硬核对比表

维度 Nginx Traefik APISIX
配置方式 文件+reload CRD/标签 REST API/etcd/CRD
热更新 ✗(Lua 可补) ✓ ✓✓
K8s 集成 ingress-nginx 原生最佳 Ingress Controller
控制台 ✗ ✓ 内置 ✓ 强大
认证插件 手写/Lua 中间件若干 100+ 插件
性能 ★★★★★ ★★★★ ★★★★☆
团队上手 谁都会 容易 中等
适合 传统架构/极致性能 云原生中小团队 平台化/API 门户

四、选型决策树

你的场景是?
├─ 传统 VM 部署 / 静态转发为主
│    └─► Nginx(别折腾, 它就是为此而生)
├─ K8s 集群入口, 团队 < 50 人, 要省心
│    └─► Traefik(IngressRoute + 自动证书真香)
├─ 需要 API 门户: 大量域名/租户/鉴权/限流/计费
│    └─► APISIX(插件化平台能力)
├─ 已有 Nginx 运维体系, 上 K8s
│    └─► ingress-nginx(平滑迁移, 思想不变)
└─ 超大规模多团队共享网关
     └─► APISIX / Higress + 平台工程化

一句忠告:选型先看团队会什么——Nginx 用得好好的团队迁移 APISIX 的收益,往往抵不过重新踩坑的成本。

五、各自的典型落地

Nginx:加动态健康检查的模板(ingress-nginx 思想)

upstream api {
    server 10.0.1.11:8080 max_fails=2 fail_timeout=10s;
    server 10.0.1.12:8080 max_fails=2 fail_timeout=10s;
    keepalive 64;                 # 长连接池, 大幅提升吞吐
}

Traefik:全链路一条龙

helm install traefik traefik/traefix -n traefik --create-namespace \
  --set ingressClass.enabled=true

# cert-resolver 自动 HTTPS(最杀手锏)
# IngressRoute 加: tls: {certResolver: letsencrypt}
# 域名解析生效后, 证书自动签发+续期, 零手工

APISIX: observable 限流路由

# Helm 安装(含 etcd + dashboard)
helm repo add apisix https://charts.apiseven.com
helm install apisix apisix/apisix -n ingress --create-namespace

# 或 K8s 声明式(ApisixRoute CRD)
# 插件即插即用: prometheus → Grafana 大盘开箱

六、无论选谁都要做的

事项 说明
健康检查 被动+主动,摘除坏节点
访问日志 带上游耗时(呼应 Nginx 篇的 log_format)
指标接入 QPS/延迟/状态码 → Prometheus
限流兜底 保护后端的最后一道闸
证书管理 自动续期(别再人肉换证书)
变更管理 网关配置纳入 Git + review(网关是单点中的单点)

七、常见坑

现象 选型相关原因
Traefik 路由不生效 entryPoints/match 表达式写错;看 dashboard 排查
APISIX 节点同步异常 etcd 集群健康;admin API 版本
Nginx reload 抖动 长连接被重置;考虑 OpenResty balancer_by_lua
网关成了单点 至少 2 副本 + 前置 LB/VIP
配置漂移 手改配置未入库 → GitOps 化

八、小结

需求关键词 推荐
稳、快、传统 Nginx
K8s、省心、自动证书 Traefik
API 门户、插件、平台化 APISIX
迁移平滑 ingress-nginx

网关的尽头不是选型,而是把配置变更做成可审计的工程——那一层做好后,具体是哪个网关反而没那么重要了。


本文是「云原生」系列第 18 篇。