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 资源变化,并将这些声明式规则转换为实际的反向代理配置。
其核心工作流程包含以下四个步骤:
- 资源监听:Controller 通过 Informer 机制监听 Ingress 及相关资源的事件(Add/Update/Delete)。
- 配置生成:将监听到的 Ingress 规则转换为目标代理软件(如 Nginx、Traefik、HAProxy)的配置文件。
- 配置生效:将生成的配置文件写入 Pod 内部,并触发代理进程的热重载(Reload)或动态更新。
- 流量转发:代理进程根据最新配置,将外部请求按域名和路径规则转发至对应的后端 Service Pod。
下图展示了 Ingress Controller 的核心工作流程:
升级风险提示:在集群升级过程中,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 在配置更新方式上的核心差异:
升级选型建议:
- 如果集群升级频率高、追求零中断流量切换,优先考虑 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 区分),验证新版本的路由、证书、注解和可观测性全部正常后,再切换生产流量。