2. Ingress 控制器基础回顾:Ingress 资源定义、Ingress Controller 工作原理、常见 Controller 对比

2.1 Ingress 资源定义

Ingress 是 Kubernetes 原生的 API 资源,用于定义集群外部流量如何路由到集群内部 Service。它本质上是七层(HTTP/HTTPS)路由规则的声明式描述,不包含任何网络监听或转发逻辑。

核心概念:Ingress 资源只定义“规则”,Ingress Controller 负责实现“规则”。两者分离是 Kubernetes 声明式设计的典型体现。

一个标准的 Ingress 资源定义包含以下关键字段:

字段 说明 示例值
spec.rules.host 域名匹配,支持精确匹配和通配符 app.example.com
spec.rules.http.paths.path URL 路径匹配,支持前缀(Prefix)和精确(Exact) /api/*
spec.rules.http.paths.pathType 路径匹配类型 Prefix
spec.rules.http.paths.backend.service.name 目标 Service 名称 my-service
spec.rules.http.paths.backend.service.port.number 目标 Service 端口 80
spec.tls HTTPS 证书配置,引用 Secret secretName: tls-secret

以下是一个完整的 Ingress 资源示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - app.example.com
    secretName: tls-secret
  rules:
  - host: app.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
升级调试要点:在集群升级过程中,需重点关注 networking.k8s.io/v1 API 版本的兼容性。旧版 extensions/v1beta1 和 networking.k8s.io/v1beta1 在 Kubernetes 1.22+ 中已被移除,升级前必须迁移。

2.2 Ingress Controller 工作原理

Ingress Controller 是一个运行在集群中的 Pod,它持续监听 Kubernetes API Server 中的 Ingress、Service、Endpoint 和 Secret 资源变化,并将这些声明式规则转换为实际的反向代理配置。

其核心工作流程包含以下四个步骤:

  1. 资源监听:Controller 通过 Informer 机制监听 Ingress 及相关资源的事件(Add/Update/Delete)。
  2. 配置生成:将监听到的 Ingress 规则转换为目标代理软件(如 Nginx、Traefik、HAProxy)的配置文件。
  3. 配置生效:将生成的配置文件写入 Pod 内部,并触发代理进程的热重载(Reload)或动态更新。
  4. 流量转发:代理进程根据最新配置,将外部请求按域名和路径规则转发至对应的后端 Service Pod。

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

Ingress Controller 工作原理流程图 外部用户请求 Ingress Controller Pod Nginx / Traefik / HAProxy 监听 API Server Ingress 资源 配置生成 & 热重载 后端 Service (Pod 组) 响应返回客户端
升级风险提示:在集群升级过程中,Ingress Controller 的 Pod 可能会被重新调度。如果 Controller 使用本地存储(如 emptyDir)缓存配置,重启后配置丢失会导致短暂流量中断。建议使用 Leader Election 或部署多副本 + 共享配置存储。

2.3 常见 Ingress Controller 对比

社区中最主流的三种 Ingress Controller 分别是 Nginx Ingress Controller、Traefik 和 HAProxy Ingress。它们在性能、功能、配置方式和生态集成上各有侧重。

对比维度 Nginx Ingress Traefik HAProxy Ingress
底层引擎 Nginx + Lua Go 自研代理 HAProxy
配置更新方式 生成 nginx.conf + 热重载 动态 API 热更新,无需重载 生成 haproxy.cfg + 热重载
性能(吞吐量) 高(C 核心 + 事件驱动) 中高(Go 协程模型) 极高(C 核心 + 零拷贝)
配置复杂度 中等(依赖 Annotations) 低(CRD + 自动发现) 高(需自定义模板)
可观测性 Prometheus + 自定义日志格式 内置 Dashboard + OpenTelemetry Prometheus + Syslog
动态路由 需重载,有连接中断风险 原生支持,零中断 需重载,支持优雅 Reload
社区活跃度 最高(Kubernetes 默认推荐) 高(云原生生态友好) 中等(企业级场景)
典型适用场景 通用生产环境、大规模集群 微服务、Service Mesh、边缘路由 高并发、低延迟、金融级场景

下图展示了三种 Controller 在配置更新方式上的核心差异:

三种 Ingress Controller 配置更新机制对比 Nginx Ingress 生成 nginx.conf 发送 SIGHUP 信号 热重载(新进程接管) Traefik 监听 API / CRD 变化 动态更新路由表(零中断) 无需重载,连接不中断 HAProxy Ingress 生成 haproxy.cfg 优雅 Reload(保留旧进程) 新连接走新进程
升级选型建议:
  • 如果集群升级频率高、追求零中断流量切换,优先考虑 Traefik(动态路由无需重载)。
  • 如果集群规模大、对吞吐量要求极高,且能接受短暂重载窗口,Nginx Ingress 是最成熟的选择。
  • 如果业务对延迟极度敏感(如高频交易),HAProxy Ingress 的零拷贝架构优势明显。

2.4 升级场景下的关键考量

在集群升级过程中,Ingress Controller 的稳定性直接影响业务可用性。以下是三个必须关注的维度:

  • API 版本兼容性:确认 Ingress Controller 版本支持的 Kubernetes API 版本。例如,Nginx Ingress Controller v1.0+ 才支持 networking.k8s.io/v1。
  • 热重载与连接中断:Nginx 和 HAProxy 的热重载会短暂中断长连接(WebSocket、gRPC)。升级前需评估业务是否容忍秒级中断。
  • 可观测性配置迁移:升级后需验证 Prometheus 指标、访问日志格式、链路追踪 Header 注入是否正常,避免监控盲区。
最佳实践:在升级前,先部署一个金丝雀版本的 Ingress Controller(使用 ingressClassName 区分),验证新版本的路由、证书、注解和可观测性全部正常后,再切换生产流量。