4. Ingress 资源基础:API 版本、YAML 结构、路由规则与默认后端

Ingress 是 Kubernetes 中管理集群外部访问集群内服务的 API 对象,它通过定义路由规则将 HTTP/HTTPS 流量转发到对应的 Service。理解 Ingress 资源的 API 版本演进、YAML 结构以及核心的路由规则配置,是掌握 Ingress 控制器的前提。

4.1 Ingress API 版本演进

Kubernetes Ingress API 经历了多个版本的迭代,不同版本支持的字段和功能有所差异。当前主流版本为 networking.k8s.io/v1,该版本在结构上更加严格,废弃了早期版本中的一些模糊字段。

API 版本 Kubernetes 版本 关键变化 状态
extensions/v1beta1 ≤ 1.13 最初的 Ingress 定义,字段较松散 已废弃
networking.k8s.io/v1beta1 1.14 – 1.21 引入 pathType 字段,规范路由匹配 已废弃
networking.k8s.io/v1 ≥ 1.19 (GA 于 1.22) 强制 pathType,backend 结构标准化,serviceName/servicePort 改为 service.name/service.port 稳定版
版本迁移建议: 新集群应始终使用 networking.k8s.io/v1。如果集群版本低于 1.19,建议先升级集群再迁移 Ingress 资源,避免使用已废弃的 extensions/v1beta1。

4.2 Ingress YAML 结构解析

一个标准的 Ingress 资源 YAML 包含四个核心部分:apiVersion、kind、metadata 和 spec。其中 spec 内部又分为 ingressClassName、rules 和 defaultBackend 三个主要字段。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80
  defaultBackend:
    service:
      name: default-service
      port:
        number: 80
字段说明:
  • ingressClassName:指定使用哪个 Ingress 控制器处理该资源(替代旧版 kubernetes.io/ingress.class 注解)。
  • rules:定义路由规则列表,每个规则可包含一个 host 和多个 paths。
  • defaultBackend:当没有规则匹配时,流量转发到的默认后端服务。

4.3 host 与 path 规则详解

路由规则由 host(域名)和 path(路径)两部分组成。Ingress 控制器根据请求的 Host 头部和请求路径,匹配最合适的规则并将流量转发到对应的后端 Service。

4.3.1 host 规则

  • 精确匹配: 指定完整域名,如 app.example.com,仅匹配该域名的请求。
  • 通配符匹配: 使用 * 作为前缀,如 *.example.com,匹配所有子域名(如 foo.example.com、bar.example.com)。
  • 空 host: 不指定 host 字段,匹配所有域名(包括 IP 直接访问)。

4.3.2 path 规则与 pathType

pathType 决定了路径的匹配方式,在 networking.k8s.io/v1 中为必填字段。

pathType 匹配行为 示例
Exact 精确匹配整个 URL 路径,区分大小写 /api 只匹配 /api,不匹配 /api/ 或 /api/v1
Prefix 基于 URL 路径前缀匹配,支持最长前缀优先 /api 匹配 /api、/api/v1、/api/v2/users
ImplementationSpecific 由 Ingress 控制器自行决定匹配逻辑(如 Nginx 支持正则) Nginx Ingress 中 /api(/|$)(.*) 可做更复杂的路由
路径匹配优先级: 当多个规则同时匹配时,遵循 最长路径前缀优先 原则。例如,同时存在 /api 和 /api/v1 两个 Prefix 规则,请求 /api/v1/users 会匹配 /api/v1。Exact 匹配的优先级高于 Prefix 匹配。
Ingress 路由匹配流程 客户端请求 Ingress 控制器 匹配 rules 中的 host + path 最长前缀优先 / Exact 优先 无匹配 → 使用 defaultBackend 返回 404 或自定义服务 转发到匹配的 Service 转发到 defaultBackend Service 匹配规则:Exact > Prefix(最长路径优先)> ImplementationSpecific

4.4 默认后端配置

默认后端(defaultBackend) 是 Ingress 资源的兜底策略。当请求的 Host 或 Path 与所有 rules 都不匹配时,流量会被转发到 defaultBackend 指定的 Service。如果未配置 defaultBackend,则 Ingress 控制器通常会返回 404 状态码。

4.4.1 配置示例

spec:
  defaultBackend:
    service:
      name: default-backend-svc
      port:
        number: 80

4.4.2 典型使用场景

  • 自定义 404 页面: 部署一个返回友好 404 页面的 Service,提升用户体验。
  • 流量兜底: 将未匹配的流量转发到统一的网关或维护页面。
  • 灰度/蓝绿部署辅助: 在迁移期间,将未明确路由的流量指向旧版本服务。
最佳实践: 生产环境中始终配置 defaultBackend,避免未匹配流量直接返回空白 404。可以将默认后端指向一个简单的 Nginx 容器,返回 JSON 格式的错误信息,便于前端或客户端识别。

4.5 多规则与多路径配置示例

以下示例展示了一个包含多个 host 和多个 path 的完整 Ingress 配置,适用于微服务架构下的统一入口场景。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-route-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: shop.example.com
    http:
      paths:
      - path: /products
        pathType: Prefix
        backend:
          service:
            name: product-service
            port:
              number: 8080
      - path: /orders
        pathType: Prefix
        backend:
          service:
            name: order-service
            port:
              number: 8080
  - host: admin.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: admin-service
            port:
              number: 80
  defaultBackend:
    service:
      name: fallback-service
      port:
        number: 80
多规则 Ingress 架构示例 外部流量 Ingress (nginx) shop.example.com /products → product-svc admin.example.com / → admin-svc 默认后端 fallback-svc product-svc Pod admin-svc Pod fallback-svc Pod 未匹配任何 host/path 的请求 → 默认后端 fallback-svc

4.6 常见配置陷阱与避坑指南

陷阱 现象 解决方案
未指定 ingressClassName Ingress 资源创建成功但无控制器处理 明确指定 spec.ingressClassName 或设置集群默认 IngressClass
pathType 缺失 API 拒绝创建(v1 版本必填) 始终显式设置 pathType: Prefix 或 Exact
路径末尾斜杠不一致 Exact 匹配 /api 不匹配 /api/ 使用 Prefix 或统一路径格式,避免歧义
多个 Ingress 资源冲突 路由规则被覆盖或随机生效 避免为同一 host 创建多个 Ingress,合并规则到单一资源
默认后端未配置 未匹配请求返回空白 404 始终配置 defaultBackend 指向自定义错误页面服务
核心要点回顾:
  • 使用 networking.k8s.io/v1 版本,确保兼容性与功能完整性。
  • pathType 是必填字段,Prefix 适用于大多数微服务路由场景。
  • 路由匹配优先级:Exact > 最长 Prefix > 短 Prefix > ImplementationSpecific。
  • 默认后端是生产环境的必备配置,用于处理未匹配流量。