2. Ingress资源定义:Ingress API版本、YAML结构、annotations、rules、tls字段详解

Ingress 是 Kubernetes 中管理集群外部访问集群内服务的 API 对象,通常提供 HTTP 和 HTTPS 路由。理解 Ingress 的资源定义是构建流量入口模型的基础。本节将系统拆解 Ingress 的 API 版本演进、核心 YAML 骨架、关键注解、路由规则以及 TLS 配置。

2.1 API 版本演进与选择

Kubernetes Ingress API 经历了从 extensions/v1beta1 到 networking.k8s.io/v1 的演进。生产环境应始终使用稳定版本。

API 版本 Kubernetes 版本 状态 关键变更
extensions/v1beta1 1.1 – 1.18 已废弃 初始版本,字段命名不规范
networking.k8s.io/v1beta1 1.14 – 1.21 已废弃 迁移至 networking 组,引入 pathType
networking.k8s.io/v1 1.19+ 稳定版 强制 pathType,backend 改为对象
最佳实践: 所有新项目应使用 apiVersion: networking.k8s.io/v1。该版本强制要求 spec.rules[].http.paths[].pathType 字段,消除了旧版本中路径匹配的歧义。

2.2 YAML 结构骨架

一个完整的 Ingress 资源定义包含四个主要部分:元数据、注解、路由规则 和 TLS 配置。以下是最小化但完整的 YAML 结构:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  namespace: production
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  tls:
  - hosts:
      - myapp.example.com
    secretName: myapp-tls-secret
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 8080
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
字段说明:
  • ingressClassName:指定 Ingress Controller 类型(如 nginx、traefik)。替代旧版 kubernetes.io/ingress.class 注解。
  • rules:定义基于主机名和路径的路由规则。
  • tls:配置 HTTPS 证书绑定。

2.3 annotations:控制 Ingress Controller 行为

Annotations 是 Ingress 的“配置开关”,不同 Ingress Controller 支持的注解不同。以下以 nginx-ingress 为例,列出最常用的注解类别:

类别 注解示例 作用
重写 nginx.ingress.kubernetes.io/rewrite-target 重写请求路径,常用于 SPA 应用
限流 nginx.ingress.kubernetes.io/limit-rps 限制每秒请求数
白名单 nginx.ingress.kubernetes.io/whitelist-source-range 仅允许指定 IP 段访问
CORS nginx.ingress.kubernetes.io/enable-cors 启用跨域支持
SSL 重定向 nginx.ingress.kubernetes.io/ssl-redirect 强制 HTTP 跳转 HTTPS
会话保持 nginx.ingress.kubernetes.io/affinity 基于 cookie 的会话亲和性
注意: Annotations 是 Ingress Controller 厂商特定的。迁移 Ingress Controller 时(如从 nginx 切到 traefik),必须同步修改所有相关注解,否则配置将失效。

2.4 rules:路由规则详解

rules 字段定义了流量如何从外部到达后端 Service。每个规则包含一个可选的 host 和一个 http 路径列表。

2.4.1 pathType 三种模式

pathType 匹配逻辑 示例 匹配结果
Exact 完全匹配 URL 路径 /api 仅匹配 /api,不匹配 /api/ 或 /api/v1
Prefix 基于 URL 路径前缀匹配 /api 匹配 /api、/api/、/api/v1、/api/v2/users
ImplementationSpecific 由 Ingress Controller 自行决定 — 依赖具体实现,不推荐跨环境使用

2.4.2 多主机与通配符

Ingress 支持在同一个资源中定义多个主机名,也支持通配符域名:

rules:
- host: app.example.com
  http:
    paths:
    - path: /
      pathType: Prefix
      backend:
        service:
          name: app-service
          port:
            number: 80
- host: api.example.com
  http:
    paths:
    - path: /
      pathType: Prefix
      backend:
        service:
          name: api-service
          port:
            number: 8080
- host: "*.dev.example.com"
  http:
    paths:
    - path: /
      pathType: Prefix
      backend:
        service:
          name: dev-service
          port:
            number: 3000
路由优先级: 当多个规则匹配同一请求时,Exact 优先于 Prefix,更长的 Prefix 优先于更短的 Prefix。如果主机名不同,则按主机名精确匹配优先于通配符。

2.5 tls:HTTPS 配置

tls 字段用于将 TLS 证书绑定到指定的主机名。证书以 Kubernetes Secret 形式存储,类型必须为 kubernetes.io/tls。

2.5.1 TLS Secret 结构

apiVersion: v1
kind: Secret
metadata:
  name: myapp-tls-secret
  namespace: production
type: kubernetes.io/tls
data:
  tls.crt: <base64 编码的证书文件>
  tls.key: <base64 编码的私钥文件>

2.5.2 多证书与默认证书

Ingress 支持为不同主机配置不同证书:

spec:
  tls:
  - hosts:
      - app.example.com
    secretName: app-tls
  - hosts:
      - api.example.com
    secretName: api-tls
  - hosts:
      - "*.wildcard.example.com"
    secretName: wildcard-tls
关键行为:
  • 如果请求的主机名未匹配任何 tls.hosts,Ingress Controller 会使用默认证书(通常由 Controller 启动参数指定)。
  • 同一主机名只能出现在一个 tls 条目中,否则行为未定义。
  • 证书更新后,Ingress Controller 会自动重新加载,无需重启 Pod。

2.6 Ingress 资源模型架构图

下图展示了 Ingress 资源定义中各字段与外部流量、后端 Service 之间的映射关系:

Ingress 资源定义架构图 Ingress 资源定义:字段与流量映射关系 外部客户端流量 Ingress 资源 apiVersion: networking.k8s.io/v1 annotations 重写 / 限流 / CORS 白名单 / SSL 重定向 会话保持 rules host: app.example.com path: /api (Prefix) backend: api-service:8080 tls hosts: [app.example.com] secretName: app-tls 证书自动加载 后端 Service (Pod) 说明: annotations 控制 Ingress Controller 行为;rules 定义路由匹配逻辑;tls 绑定证书。三者共同决定外部流量如何到达后端 Service。

2.7 完整配置示例:生产级 Ingress

以下是一个综合了 annotations、多规则、TLS 的生产级 Ingress 配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: production-ingress
  namespace: production
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/limit-rps: "100"
    nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8, 172.16.0.0/12"
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "https://frontend.example.com"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
      - api.example.com
    secretName: api-tls
  - hosts:
      - app.example.com
    secretName: app-tls
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /v1(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: api-v1-service
            port:
              number: 8080
      - path: /v2(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: api-v2-service
            port:
              number: 8080
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
配置要点:
  • 使用 rewrite-target: /$2 配合正则路径,实现 API 版本前缀剥离。
  • 开启 ssl-redirect 强制所有 HTTP 请求跳转 HTTPS。
  • 通过 whitelist-source-range 限制仅内网 IP 可访问 API 端点。
  • 不同主机绑定不同 TLS 证书,实现多租户安全隔离。