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 匹配。
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
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。
- 默认后端是生产环境的必备配置,用于处理未匹配流量。