Ingress 控制器架构:核心组件与数据面/控制面分离原理
Ingress 控制器是云原生网关的“大脑”与“肌肉”的结合体。理解其架构,关键在于区分控制面(决策层)与数据面(执行层)的职责边界。生产环境中 90% 的故障源于控制面与数据面状态不一致,因此本节将深入剖析核心组件及其分离原理。
2.1 核心组件全景
一个生产级的 Ingress 控制器(以 NGINX Ingress Controller 为例)由以下四大组件构成:
| 组件 | 所属平面 | 核心职责 | 关键特征 |
|---|---|---|---|
| Ingress API Watcher | 控制面 | 监听 Kubernetes API Server 中 Ingress/Service/Secret 资源变化 | 基于 Informer 机制,维护本地缓存 |
| 配置生成器 | 控制面 | 将 Ingress 资源转换为反向代理配置文件(如 nginx.conf) | 模板引擎 + Lua/Go 模板 |
| 配置同步器 | 控制面→数据面 | 将新配置写入数据面进程,触发优雅重载 | reload 或 lua-resty 热更新 |
| 反向代理进程 | 数据面 | 处理实际 L4/L7 流量,执行路由、限流、TLS 终止 | NGINX/Envoy/Traefik 等 |
故障提示: 配置生成器与同步器之间的“配置版本偏差”是资源配额超限故障的常见根源。当 Ingress 资源数量超过控制器处理能力时,配置生成器可能跳过部分资源,而同步器仍报告“成功”,导致数据面缺失路由规则。
2.2 数据面与控制面分离原理
分离架构的核心思想是:控制面负责“感知与决策”,数据面负责“执行与转发”。两者通过一个明确定义的接口(配置文件 + 信号)进行通信。
2.2.1 分离架构的三大优势
- 故障隔离: 控制面崩溃不会影响已运行的数据面连接;数据面异常不会阻塞控制面对新资源的监听。
- 独立扩缩: 控制面通常只需 1-2 个副本(避免重复监听),数据面可根据流量压力水平扩展。
- 灰度升级: 可先升级控制面(新配置格式),再逐步滚动升级数据面,降低全量风险。
2.2.2 分离架构下的关键交互流程
- 监听: Watcher 通过 List-Watch 从 API Server 获取 Ingress 资源。
- 校验与转换: 配置生成器校验资源合法性(如 Secret 是否存在、Annotation 是否有效),生成中间表示(IR)。
- 模板渲染: 将 IR 注入模板,生成最终配置文件(如 nginx.conf)。
- 信号触发: 同步器向数据面进程发送 SIGHUP 或通过 Unix Socket 触发配置重载。
- 流量切换: 数据面进程优雅地加载新配置,旧连接逐步耗尽。
最佳实践: 在资源配额模型故障排查中,应首先检查控制面日志中的“配置生成耗时”和“同步状态”。如果生成耗时超过 10 秒,通常意味着 Ingress 资源数量已接近控制器配额上限。
2.3 控制面与数据面交互架构图
下图展示了控制面组件如何协同工作,并通过配置通道驱动数据面。注意控制面内部包含“配置版本管理”模块,这是资源配额模型故障的关键监控点。
2.4 分离架构下的故障边界
理解控制面与数据面的分离,有助于快速定位资源配额模型故障的根因。下表总结了常见故障场景及其所属平面:
| 故障现象 | 可能根因 | 所属平面 | 排查切入点 |
|---|---|---|---|
| 新 Ingress 不生效 | Watcher 缓存未更新或配置生成器跳过 | 控制面 | 检查 Watcher 事件队列长度 |
| 部分路由 503 | 数据面重载失败,上游服务未同步 | 数据面 | 检查数据面 worker 进程状态 |
| 配置频繁回滚 | 配置版本管理检测到不一致,自动回退 | 控制面 | 查看版本管理模块的差异日志 |
| 内存持续增长 | 数据面连接池泄漏或控制面缓存膨胀 | 两者皆可能 | 分别监控控制面与数据面 RSS |
关键警告: 在资源配额模型故障中,控制面可能因 Ingress 资源数量过多而陷入“配置生成死循环”,此时数据面仍运行旧配置,造成“配置已更新但流量未切换”的假象。务必在监控中区分“控制面配置版本”与“数据面生效版本”。
2.5 分离架构的扩展:多控制器共存
生产环境中,同一集群可能运行多个 Ingress 控制器(如 NGINX + ALB Ingress Controller)。此时分离架构的优势更加明显:
- 控制面隔离: 每个控制器独立监听自己的 IngressClass 资源,互不干扰。
- 数据面独立: 不同控制器的数据面进程运行在不同的命名空间或节点组,故障域隔离。
- 统一可观测: 通过 Prometheus 指标分别采集每个控制器的配置生成延迟和数据面的请求成功率。