3. Ingress 网关架构解析:Ingress Controller 工作原理、数据平面与控制平面的分离设计

Ingress 网关是 Kubernetes 集群南北向流量的统一入口,其架构设计的核心在于 控制平面(Control Plane) 与 数据平面(Data Plane) 的分离。这种分离设计不仅提升了系统的可扩展性,也为性能调优提供了明确的边界。本节将深入解析 Ingress Controller 的工作原理,并拆解两平面的职责与交互机制。

3.1 Ingress Controller 工作原理

Ingress Controller 是一个运行在集群中的 Pod,它持续监听 Kubernetes API Server 中的 Ingress、Service、Endpoint、Secret 等资源的变化,并将这些声明式配置转换为数据平面(如 Nginx、Envoy、HAProxy)的实际路由规则。

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

  1. 资源监听(Watch):Controller 通过 API Server 的 Watch 接口监听 Ingress 及相关资源的事件(ADD、UPDATE、DELETE)。
  2. 规则解析(Reconcile):将监听到的 Ingress 规则、后端 Service 的 Endpoint 列表、TLS 证书等数据,合并为一份内部路由模型。
  3. 配置生成(Render):根据内部模型,渲染出数据平面(如 Nginx)的配置文件(如 nginx.conf)。
  4. 热加载(Reload):将新配置文件写入数据平面进程,并触发优雅重载(Graceful Reload),确保流量不中断。
关键指标: 从 Ingress 资源变更到数据平面生效的延迟(Reconciliation Latency)是衡量 Controller 性能的核心指标,通常应控制在 1-5 秒以内。

3.2 数据平面与控制平面的分离设计

分离设计的本质是将“决策逻辑”与“流量转发”解耦。下表对比了两平面的核心差异:

维度 控制平面(Control Plane) 数据平面(Data Plane)
核心职责 监听 API Server、解析规则、生成配置 接收流量、执行路由、TLS 终止、负载均衡
资源消耗 CPU 密集型(配置解析、模板渲染) CPU + 内存 + 网络密集型(连接处理、缓冲区)
扩展方式 单副本或少量副本(避免重复监听) 水平扩展(HPA),按流量负载增加副本
故障影响 配置更新暂停,已有路由规则不受影响 直接影响在线流量,需快速恢复
典型实现 ingress-nginx Controller、ingress-gce Nginx、Envoy、Traefik 代理进程
架构建议: 在生产环境中,建议将控制平面与数据平面部署在独立的容器中(Sidecar 模式或双容器 Pod),以便分别配置资源配额(Resource Quota)和独立扩缩容。

3.3 分离架构下的数据流与组件交互

下图展示了 Ingress 网关在分离架构下的完整数据流与组件交互关系:

Ingress 网关控制平面与数据平面分离架构图 Ingress 网关分离架构:控制平面 ↔ 数据平面 控制平面(Control Plane) Kubernetes API Server Ingress Controller 配置渲染(nginx.conf) 数据平面(Data Plane) 外部客户端流量 Nginx / Envoy 代理进程 后端 Service Pod 配置下发(Reload) 分离设计优势: 1. 控制平面故障不影响已有路由规则,数据平面继续转发。 2. 数据平面可独立水平扩展,控制平面保持单副本或少量副本。

3.4 配置热加载与优雅重载机制

数据平面配置的热加载是分离架构的关键技术。以 ingress-nginx 为例,其重载流程如下:

  • 检查变更:Controller 对比新生成的配置与当前运行配置,若无差异则跳过重载。
  • 写入新配置:将新 nginx.conf 写入临时文件,并执行语法检查(nginx -t)。
  • 发送信号:向 Nginx master 进程发送 SIGHUP 信号,触发优雅重载。
  • 连接迁移:Nginx 启动新 worker 进程,旧 worker 进程在完成当前请求后优雅退出。
性能陷阱: 频繁的配置变更(如每秒多次更新 Ingress)会导致数据平面频繁重载,引发连接抖动和 CPU 峰值。建议使用 --sync-period 参数控制同步频率,或启用 enable-annotation-validation 减少无效变更。

3.5 分离架构下的资源配额模型

基于分离设计,资源配额(Resource Quota)应分别针对控制平面和数据平面设置:

组件 推荐 CPU 配额 推荐内存配额 关键配置参数
Ingress Controller(控制平面) 200m - 500m 256Mi - 512Mi --sync-period=30s
Nginx 代理(数据平面) 500m - 2000m(按 QPS 调整) 512Mi - 2Gi worker-processes、worker-connections
Lua 扩展(如需要) 100m - 300m 128Mi - 256Mi lua-shared-dicts
调优实践: 在压测环境中,建议先为数据平面分配 1 核 CPU + 1Gi 内存作为基线,然后根据 P99 延迟和连接数逐步调整。控制平面通常不需要随流量增长而扩容。