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)的实际路由规则。
核心工作流程包含以下四个步骤:
- 资源监听(Watch):Controller 通过 API Server 的 Watch 接口监听 Ingress 及相关资源的事件(ADD、UPDATE、DELETE)。
- 规则解析(Reconcile):将监听到的 Ingress 规则、后端 Service 的 Endpoint 列表、TLS 证书等数据,合并为一份内部路由模型。
- 配置生成(Render):根据内部模型,渲染出数据平面(如 Nginx)的配置文件(如
nginx.conf)。 - 热加载(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 网关在分离架构下的完整数据流与组件交互关系:
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 延迟和连接数逐步调整。控制平面通常不需要随流量增长而扩容。