4. Ingress 资源对象详解:Annotations、TLS、路由规则与后端服务映射
Ingress 是 Kubernetes 中管理外部访问集群服务的 API 对象,它本质上是七层负载均衡的路由规则集合。本章深入拆解 Ingress 资源的四个核心组成部分:Annotations(注解)、TLS(传输层安全)、路由规则与后端服务映射。理解这些要素是进行故障还原与配额模型分析的基础。
4.1 Ingress 资源对象结构总览
一个标准的 Ingress YAML 清单包含以下顶层字段,其中 spec 是核心逻辑所在:
| 字段路径 | 类型 | 说明 |
|---|---|---|
apiVersion |
string | 当前稳定版为 networking.k8s.io/v1 |
kind |
string | 固定值 Ingress |
metadata.annotations |
map[string]string | 控制 Ingress Controller 行为的键值对 |
spec.ingressClassName |
string | 指定使用的 Ingress Controller 名称 |
spec.tls |
[]IngressTLS | HTTPS 证书与域名绑定 |
spec.rules |
[]IngressRule | 路由规则列表,包含 host 与 http 路径 |
spec.rules[].http.paths[].backend |
IngressBackend | 流量最终转发的目标 Service + 端口 |
关键认知: Ingress 本身只是一个声明式配置,真正的流量转发由 Ingress Controller(如 nginx-ingress、traefik)根据这些字段动态生成代理配置(如 nginx.conf)来实现。
4.2 Annotations:控制器行为调优入口
Annotations 是 Ingress 资源中最重要的扩展机制。不同的 Ingress Controller 会识别不同的 annotation 键名,用于覆盖默认行为。以下以 nginx-ingress 为例,列出故障排查中最高频的几类注解:
| 分类 | Annotation 键 | 典型值 | 作用 |
|---|---|---|---|
| 连接控制 | nginx.ingress.kubernetes.io/proxy-body-size |
10m |
限制客户端请求体大小,超限返回 413 |
| 超时控制 | nginx.ingress.kubernetes.io/proxy-read-timeout |
60 |
后端响应读取超时秒数,影响长连接业务 |
| 重写规则 | nginx.ingress.kubernetes.io/rewrite-target |
/$2 |
路径重写,常用于前端路由与后端 API 路径差异 |
| 会话保持 | nginx.ingress.kubernetes.io/affinity |
cookie |
开启基于 Cookie 的会话粘滞 |
| 限流 | nginx.ingress.kubernetes.io/limit-rps |
100 |
每 IP 每秒请求数限制,超出返回 503 |
| 白名单 | nginx.ingress.kubernetes.io/whitelist-source-range |
10.0.0.0/8 |
仅允许指定 CIDR 访问 |
故障陷阱: 在资源配额模型故障场景中,
proxy-body-size 与 limit-rps 是最容易被忽略的隐性配额。当后端服务返回 413 或 503 时,应首先检查 Ingress 的 annotations 而非后端 Pod 资源限制。
4.3 TLS 配置:证书绑定与 HTTPS 终止
TLS 段负责将 Secret 中存储的证书与域名绑定,实现 HTTPS 卸载。其结构如下:
spec:
tls:
- hosts:
- api.example.com
secretName: api-tls-secret
- hosts:
- www.example.com
secretName: www-tls-secret
关键规则:
- Secret 必须与 Ingress 在同一命名空间,且类型为
kubernetes.io/tls,包含tls.crt和tls.key两个数据项。 - hosts 列表必须与 rules 中的 host 匹配,否则证书无法正确生效。
- 如果未配置 TLS 段,但 rules 中指定了 host,Ingress Controller 默认只监听 80 端口。
- 支持配置多个 TLS 块,每个块绑定不同的域名与证书。
排查技巧: 使用
kubectl describe ingress <name> 查看 Events 字段,可以快速发现证书加载失败、Secret 不存在等 TLS 相关错误。
4.4 路由规则与后端服务映射
路由规则是 Ingress 的核心逻辑,它定义了“哪个域名 + 哪个路径 → 哪个 Service + 哪个端口”的映射关系。以下是一个包含多规则、多路径的完整示例:
spec:
rules:
- host: api.example.com
http:
paths:
- path: /v1/users
pathType: Prefix
backend:
service:
name: user-service
port:
number: 8080
- path: /v1/orders
pathType: Prefix
backend:
service:
name: order-service
port:
number: 8080
- host: web.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-frontend
port:
number: 80
4.4.1 pathType 匹配模式
| pathType | 匹配逻辑 | 示例 | 匹配结果 |
|---|---|---|---|
Exact |
完全匹配 URL 路径,区分大小写 | /v1/users |
仅匹配 /v1/users,不匹配 /v1/users/ |
Prefix |
以路径前缀匹配,支持通配 | /v1/users |
匹配 /v1/users、/v1/users/list 等 |
ImplementationSpecific |
由 Ingress Controller 自行解释 | — | nginx-ingress 将其视为 Prefix 模式 |
4.4.2 后端服务映射规则
- service.name:必须指向同一命名空间下的 Service 资源。
- port.number:指定 Service 的端口号,也可以使用
port.name引用命名端口。 - 多路径优先级:当多个路径匹配同一请求时,最长匹配优先。例如
/v1/users/detail优先匹配/v1/users/detail(Exact)而非/v1/users(Prefix)。
故障还原关键点: 在资源配额模型故障时间线中,路由规则错误(如 pathType 误配、host 拼写错误、Service 端口不匹配)是导致“流量黑洞”或“502 Bad Gateway”的常见根因。每次变更 Ingress 规则后,应使用
curl -H "Host: api.example.com" http://<ingress-ip>/v1/users 进行端到端验证。
4.5 核心映射关系 SVG 图
下图展示了 Ingress 资源从外部请求到后端 Pod 的完整映射链路:
4.6 多路径与权重分配(高级场景)
在云原生网关中,Ingress 支持通过 多个 paths 条目 实现同一域名下的流量拆分。虽然原生 Ingress 不直接支持权重,但可以通过以下方式实现类似效果:
- 路径粒度拆分:将不同业务模块映射到不同 Service,如
/api/v1→ service-a,/api/v2→ service-b。 - 通过 Ingress Controller 注解实现灰度:例如 nginx-ingress 的
nginx.ingress.kubernetes.io/canary系列注解,支持基于 Header、Cookie 或权重的流量分发。 - 多 Ingress 资源共存:同一 host 下可以创建多个 Ingress 资源,由 Controller 合并规则,但需注意规则冲突时的行为(通常后创建者覆盖)。
配额模型关联: 当使用 canary 注解进行灰度发布时,每个 Ingress 资源都会独立计算 Controller 内部的配置段配额。在资源配额模型故障中,大量 canary Ingress 可能导致 Controller 配置段超限,引发配置重载失败。
4.7 常见故障模式速查表
| 现象 | 可能根因 | 排查切入点 |
|---|---|---|
| 404 Not Found | host 不匹配 / path 未命中 / pathType 错误 | 检查 kubectl describe ingress 的 Rules 段 |
| 502 Bad Gateway | Service 端口错误 / Pod 未就绪 / 后端超时 | 检查 Service Endpoints 与 Pod 健康检查 |
| 413 Request Entity Too Large | proxy-body-size 注解限制 |
检查 Ingress annotations |
| 503 Service Unavailable | 限流注解触发 / 后端 Pod 无可用副本 | 检查 limit-rps 与 kubectl get pods |
| 证书错误 / 不安全 | TLS Secret 不存在 / 证书过期 / hosts 不匹配 | 检查 Secret 数据与 Ingress TLS 段 |