2. Ingress 控制器基础回顾:Ingress 资源、Ingress Controller 的工作原理与核心配置

在 Kubernetes 集群中,Service 和 Pod 的网络暴露通常局限于集群内部或 NodePort/LoadBalancer 类型的简单四层转发。当需要基于 HTTP/HTTPS 域名、路径、TLS 证书进行精细化流量路由时,Ingress 资源与 Ingress Controller 的组合成为标准方案。本节将系统回顾 Ingress 资源定义、Ingress Controller 的工作机制以及核心配置项,为后续回滚护栏与自动化测试集成打下基础。

2.1 Ingress 资源:声明式路由规则

Ingress 是 Kubernetes 原生的 API 对象(networking.k8s.io/v1),用于定义集群外部流量如何路由到内部 Service。它本身只是一个规则声明,不执行任何网络转发;真正的流量处理由 Ingress Controller 实现。

核心字段说明: Ingress 资源通过 spec.rules 定义路由规则,每个规则包含 host(域名)、http.paths(路径匹配列表),每个路径关联一个 backend(目标 Service + port)。

以下是一个典型的 Ingress 资源配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-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: 8080
      - path: /web
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
  tls:
  - hosts:
    - app.example.com
    secretName: app-tls-secret
字段 说明 常见取值
ingressClassName 指定使用的 Ingress Controller 名称 nginx, traefik, istio
rules[].host 域名匹配,支持精确匹配和通配符 *.example.com, foo.bar.com
pathType 路径匹配模式 Prefix, Exact, ImplementationSpecific
backend.service 目标 Service 名称和端口 任意存在的 Service
tls HTTPS 证书绑定 引用 Secret 中的 TLS 证书
最佳实践: 生产环境中建议始终为 Ingress 配置 ingressClassName,避免多个 Controller 同时监听未指定类名的 Ingress 资源导致冲突。

2.2 Ingress Controller 工作原理

Ingress Controller 是一个运行在集群中的 Pod(通常以 Deployment + Service 形式部署),它持续监听 Kubernetes API Server 中的 Ingress、Service、Endpoint、Secret 等资源变化,动态生成反向代理配置(如 Nginx 的 nginx.conf、Traefik 的动态路由规则),并 reload 或热更新代理进程。

下图展示了 Ingress Controller 的核心工作流程:

Ingress Controller 工作原理流程图 Ingress Controller 工作原理 用户 / 客户端 Ingress Controller Nginx / Traefik / Istio 监听 API Server Ingress/Service 动态生成代理配置 反向代理进程 (Reload/热更新) 后端 Service / Pod Ingress Controller 是 流量入口与规则执行者
关键流程总结:
  1. 用户创建/更新 Ingress 资源 → 写入 etcd → API Server 通知所有监听者。
  2. Ingress Controller 通过 Informer 机制实时感知 Ingress、Service、Endpoint、Secret 变化。
  3. Controller 根据 Ingress 规则生成反向代理配置文件(如 Nginx 的 nginx.conf)。
  4. Controller 执行 reload 或热更新,使新配置生效。
  5. 外部流量到达 Controller 的 Service(NodePort/LoadBalancer),按规则转发到后端 Pod。

2.3 主流 Ingress Controller 对比与核心配置

社区中最常用的 Ingress Controller 包括 Nginx Ingress Controller 和 Traefik,两者在配置方式、功能特性和生态集成上存在差异。

特性 Nginx Ingress Controller Traefik
配置方式 通过 Ingress 资源 + Annotation 扩展 Ingress 资源 + CRD (IngressRoute) + 动态配置
性能 高吞吐,低延迟(基于 Nginx 内核) 中等,适合中小规模
热更新 支持 reload(短暂连接中断) 支持热更新(无中断)
自动 HTTPS 需配合 cert-manager 内置 ACME 支持
可观测性 Prometheus 指标 + 访问日志 内置 Dashboard + Prometheus + OpenTelemetry
典型 Annotation nginx.ingress.kubernetes.io/rewrite-target traefik.ingress.kubernetes.io/router.middlewares

2.4 Nginx Ingress Controller 核心配置示例

Nginx Ingress Controller 通过 ConfigMap 进行全局配置(如 worker-processes、proxy-body-size),通过 Annotation 实现 Ingress 级别的精细化控制。

全局 ConfigMap 配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
data:
  worker-processes: "4"
  proxy-body-size: "50m"
  proxy-connect-timeout: "30"
  proxy-read-timeout: "60"
  ssl-protocols: "TLSv1.2 TLSv1.3"
  use-forwarded-headers: "true"

Ingress 级别 Annotation 配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/cors-enabled: "true"
    nginx.ingress.kubernetes.io/limit-rps: "100"
spec:
  ingressClassName: nginx
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /v1(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: api-v1-service
            port:
              number: 8080
注意: Annotation 的键名和值格式因 Ingress Controller 版本而异。升级 Nginx Ingress Controller 时,务必检查 Annotation 兼容性,避免配置失效导致路由错误。

2.5 Traefik 核心配置示例

Traefik 除了支持标准 Ingress 资源外,还提供了更强大的 IngressRoute CRD,支持中间件链、权重路由、重定向等高级功能。

标准 Ingress 方式:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: traefik-demo
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
    traefik.ingress.kubernetes.io/router.middlewares: default-strip-prefix@kubernetescrd
spec:
  ingressClassName: traefik
  rules:
  - host: traefik.example.com
    http:
      paths:
      - path: /app
        pathType: Prefix
        backend:
          service:
            name: app-service
            port:
              number: 80

IngressRoute CRD 方式(更灵活):

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: app-route
spec:
  entryPoints:
    - web
    - websecure
  routes:
  - match: Host(`app.example.com`) && PathPrefix(`/api`)
    kind: Rule
    services:
    - name: api-service
      port: 8080
    middlewares:
    - name: rate-limit
  tls:
    certResolver: letsencrypt
选型建议: 如果团队对 Nginx 生态熟悉且追求极致性能,选择 Nginx Ingress Controller;如果希望快速集成自动 HTTPS、灰度发布、可观测性,且集群规模中等,Traefik 的 CRD 和 Dashboard 能显著降低运维复杂度。

2.6 Ingress 控制器在回滚场景中的关键角色

在回滚护栏与自动化测试集成课程中,Ingress Controller 是流量切换和灰度验证的核心组件:

  • 流量切分: 通过 Annotation 或 CRD 实现金丝雀发布(Canary),将部分流量导向新版本。
  • 健康检查: Ingress Controller 依赖后端 Service 的 Endpoint 健康状态,回滚时需确保旧版本 Pod 就绪。
  • 配置一致性: 回滚 Ingress 资源或 Controller 配置时,需验证 Annotation 和 ConfigMap 的版本兼容性。
  • 自动化测试集成: 测试环境中的 Ingress 规则变更应纳入 CI/CD 流水线,通过自动化测试验证路由正确性。

下图展示了 Ingress Controller 在回滚与测试集成中的位置:

Ingress Controller 在回滚与测试中的位置 Ingress Controller 在回滚与测试集成中的角色 CI/CD 流水线 构建 + 测试 + 部署 Ingress 规则变更 Annotation / CRD / ConfigMap Ingress Controller Nginx / Traefik 回滚护栏 版本校验 / 健康检查 / 流量切分 自动化测试环境 路由验证 / 灰度测试 / 回归 Ingress Controller 是连接 CI/CD 变更与回滚护栏/自动化测试的关键中间层
本节要点:
  • Ingress 资源只定义规则,Ingress Controller 负责执行和转发。
  • Nginx Ingress Controller 通过 Annotation 实现精细化控制,Traefik 通过 CRD 提供更灵活的配置模型。
  • Ingress Controller 的配置变更(Annotation、ConfigMap、CRD)是回滚和自动化测试的核心关注点。
  • 理解 Ingress Controller 的工作原理,是构建可靠回滚护栏和测试集成方案的前提。