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 分离架构下的关键交互流程

  1. 监听: Watcher 通过 List-Watch 从 API Server 获取 Ingress 资源。
  2. 校验与转换: 配置生成器校验资源合法性(如 Secret 是否存在、Annotation 是否有效),生成中间表示(IR)。
  3. 模板渲染: 将 IR 注入模板,生成最终配置文件(如 nginx.conf)。
  4. 信号触发: 同步器向数据面进程发送 SIGHUP 或通过 Unix Socket 触发配置重载。
  5. 流量切换: 数据面进程优雅地加载新配置,旧连接逐步耗尽。
最佳实践: 在资源配额模型故障排查中,应首先检查控制面日志中的“配置生成耗时”和“同步状态”。如果生成耗时超过 10 秒,通常意味着 Ingress 资源数量已接近控制器配额上限。

2.3 控制面与数据面交互架构图

下图展示了控制面组件如何协同工作,并通过配置通道驱动数据面。注意控制面内部包含“配置版本管理”模块,这是资源配额模型故障的关键监控点。

Ingress 控制器:控制面与数据面分离架构 控制面(Control Plane) 数据面(Data Plane) Ingress API Watcher 监听 Ingress/Service/Secret 变更 配置生成器 校验 → 中间表示(IR) → 模板渲染 配置版本管理 版本号递增 · 差异对比 · 回滚支持 配置同步器 写入配置 · 触发重载 · 健康检查 反向代理进程 NGINX / Envoy / Traefik 路由 · TLS 终止 · 限流 · 日志 连接池 & 上游健康检查 长连接复用 · 被动/主动健康探测 指标 & 可观测性 请求延迟 · 状态码 · 连接数 配置文件写入 + SIGHUP 重载状态 / 健康反馈 ⚠ 故障高发区:配置版本管理模块 资源配额超限时,版本号可能跳跃或回退

2.4 分离架构下的故障边界

理解控制面与数据面的分离,有助于快速定位资源配额模型故障的根因。下表总结了常见故障场景及其所属平面:

故障现象 可能根因 所属平面 排查切入点
新 Ingress 不生效 Watcher 缓存未更新或配置生成器跳过 控制面 检查 Watcher 事件队列长度
部分路由 503 数据面重载失败,上游服务未同步 数据面 检查数据面 worker 进程状态
配置频繁回滚 配置版本管理检测到不一致,自动回退 控制面 查看版本管理模块的差异日志
内存持续增长 数据面连接池泄漏或控制面缓存膨胀 两者皆可能 分别监控控制面与数据面 RSS
关键警告: 在资源配额模型故障中,控制面可能因 Ingress 资源数量过多而陷入“配置生成死循环”,此时数据面仍运行旧配置,造成“配置已更新但流量未切换”的假象。务必在监控中区分“控制面配置版本”与“数据面生效版本”。

2.5 分离架构的扩展:多控制器共存

生产环境中,同一集群可能运行多个 Ingress 控制器(如 NGINX + ALB Ingress Controller)。此时分离架构的优势更加明显:

  • 控制面隔离: 每个控制器独立监听自己的 IngressClass 资源,互不干扰。
  • 数据面独立: 不同控制器的数据面进程运行在不同的命名空间或节点组,故障域隔离。
  • 统一可观测: 通过 Prometheus 指标分别采集每个控制器的配置生成延迟和数据面的请求成功率。