第 12 章 · 网关与 Ingress:Traefik / Caddy / APISIX / Ingress-Nginx
本章覆盖 集群入口 的四种常见形态:K8s 原生 Ingress 控制器、云原生边缘路由、自动 HTTPS、国产 API 网关。
前置:第 5 章 Nginx 反代基础;应用已部署在 app Namespace。
12.1 选型对比
| 需求 | 首选 | 商店 / 插件 id |
|---|---|---|
| K8s 标准 Ingress 资源 | Ingress-Nginx | 集群插件 ingress-nginx |
| 自动服务发现 + 多入口 | Traefik | traefik |
| 自动 HTTPS(Let's Encrypt) | Caddy | caddy |
| API 限流、鉴权、动态路由 | Apache APISIX | apisix |
| 简单静态 + 反代 | Nginx | nginx(第 5 章) |
Internet / 内网
│
┌───────────────┼───────────────┐
▼ ▼ ▼
Ingress-Nginx Traefik APISIX
(Ingress 资源) (IngressRoute) (Route + Plugin)
│ │ │
└───────────────┴───────────────┘
│
Service · Pod
12.2 集群插件:Nginx Ingress Controller
适用场景
Kubernetes 标准 Ingress;一个控制器管理多域名/路径;与 cert-manager 配合 HTTPS(需另行部署)。
安装
管理 → 集群插件 → Nginx Ingress Controller(ingress-nginx)→ 安装。
| 项 | 值 |
|---|---|
| Namespace | ingress-nginx |
| 访问提示 | 控制器 Service 通常为 NodePort 或 HostNetwork(以安装后 访问说明 为准) |
Ingress 资源语法
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shop-api
namespace: app
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
spec:
ingressClassName: nginx
rules:
- host: api.shop.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api
port:
number: 8080
应用方式:运维 → 工作负载 旁 YAML 导入,或通过 kubectl apply -f ingress.yaml。
验收
curl -H "Host: api.shop.local" http://<Ingress-NodePort>/health
本机测试:在 hosts 添加 <节点IP> api.shop.local。
小紫运维
| 现象 | 处理 |
|---|---|
| 404 | ingressClassName 是否为 nginx;后端 Service 端口是否正确 |
| 502 | 后端 Pod 未 Ready;应用部署 → 日志管理 |
| 大文件上传失败 | 加注解 proxy-body-size |
12.3 Traefik v3.1
适用场景
云原生 动态路由;同时支持 Ingress、IngressRoute、TCP;内置 Dashboard。
商店部署参数
| 项 | 值 |
|---|---|
| id | traefik |
| 镜像 | traefik:v3.1 |
| 端口 | 80(另补 8080 Dashboard) |
| Namespace | ingress |
环境变量与启动命令
args:
- --api.dashboard=true
- --api.insecure=true
- --providers.kubernetesingress=true
- --providers.kubernetescrd=true
- --entrypoints.web.address=:80
ports:
- containerPort: 80
- containerPort: 8080 # Dashboard
需为 Traefik ServiceAccount 绑定 Ingress 读权限(RBAC);若商店模板未含,在 运维 → 角色绑定 按 Traefik 官方文档补充。
IngressRoute 示例(CRD)
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: api-route
namespace: app
spec:
entryPoints:
- web
routes:
- match: Host(`api.shop.local`)
kind: Rule
services:
- name: api
port: 8080
Dashboard:http://<节点IP>:<8080 NodePort>/dashboard/。