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 的完整映射链路:

Ingress 路由映射链路 外部请求 Ingress Controller 规则匹配:host + path + pathType Annotations 调优(限流/超时/重写) Service: name + port 后端 Pod(容器) TLS 在 Ingress Controller 层终止,后端 Pod 通常接收 HTTP 明文流量

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 段