【K8s教程笔记】第十章:Ingress-Nginx 核心原理与实现
对应视频:薪享宏福Kubernetes v1.29 教程 p73
1. 前置铺垫:四层负载(L4)与七层负载(L7)的核心差异
1.1 四层负载(以LVS/IPVS为例)
- 工作层级:传输层(TCP/UDP),仅做数据包转发,不解析应用层内容
- 核心特性:一次完整的TCP连接由客户端与后端真实服务器直接建立,负载均衡器仅承担转发作用,不参与连接建立
- 限制:要求客户端与后端服务器使用的协议完全一致,例如客户端发起HTTP请求,后端也必须支持HTTP,无法实现协议转换、路径分发等七层特性
- K8s适配:创建四层Service时,K8s会自动创建底层IPVS负载均衡规则,无需人工配置
1.2 七层负载(以Nginx为例)
- 工作层级:应用层(HTTP/HTTPS),可解析应用层请求内容
- 核心特性:作为代理服务器工作,两次独立的TCP连接:客户端先与Nginx建立连接,Nginx再与后端真实服务器建立连接,全程由Nginx代理转发请求与响应
- 核心能力:
- 协议转换:例如客户端使用HTTPS加密访问,Nginx在内网环境下可降级为HTTP协议与后端通信,仅Nginx承担加密解密开销,降低后端服务配置压力
- 路径分发:支持基于请求路径、主机名等七层特征做路由,适配微服务场景下的服务网关需求
- 虚拟主机:支持同一IP/端口下,基于不同域名将请求转发到不同后端服务
- 微服务示例:教学管理系统微服务化后,拆分为教室管理、学生管理、教师管理等多个独立服务,可通过Nginx配置实现按路径路由:
- 访问
域名/classroom转发到教室管理服务 - 访问
域名/student转发到学生管理服务 - 访问
域名/teacher转发到教师管理服务
- 访问
2. 手动实现七层负载的痛点
若手动在K8s中部署Nginx实现七层负载,需要完成以下操作:
- 部署Nginx Deployment,通过NodePort/主机端口映射将Nginx端口暴露到物理机
- 手动编写Nginx配置文件,配置
upstream块定义后端服务地址、server块配置路由规则 - 为每个后端服务创建K8s Service(SVC),避免Pod地址变更后需要手动修改Nginx配置
- 可通过ConfigMap(CM)挂载Nginx配置,修改CM后重启Pod即可生效,无需进入容器内部修改
- 核心问题:所有路由规则变更都需要人工修改配置并重启Nginx,自动化程度极低,无法适配动态的K8s集群环境
3. Ingress 的核心价值
Ingress是K8s中用于声明式定义七层路由规则的API资源,配合Ingress Controller(如Nginx Ingress Controller)可以实现:
- 用户仅需编写Ingress YAML,定义主机名、请求路径、后端Service等规则,无需关心底层Nginx的配置细节
- Ingress Controller会自动监听Ingress对象、后端Service/Pod的变化,自动生成Nginx配置并触发重载,实现全流程自动化
- 示例Ingress规则(定义两个虚拟主机,分别转发到不同后端服务):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: foo8.com http: paths: - path: / pathType: Prefix backend: service: name: svc1 port: number: 80 - host: buff.com http: paths: - path: / pathType: Prefix backend: service: name: svc2 port: number: 80
4. 主流Ingress方案选型
| 方案 | 核心特性 | 适用场景 |
|---|---|---|
| Nginx Ingress | 当前行业普及度最高,生态完善,功能全面 | 通用场景,绝大多数企业生产环境首选 |
| Apache APISIX | 微服务可观测性极强,支持自动生成流量拓扑图 | 微服务治理、可观测性要求高的场景 |
| Traefik | 基于Go语言编写,原生适配微服务架构,配置简单 | 微服务、云原生快速落地场景 |
| Contour | 基于Go语言编写的云原生专属代理 | 云原生场景、K8s原生集成需求高的场景 |
5. Nginx Ingress 架构与工作原理
5.1 核心架构
Nginx Ingress Controller基于Go语言开发,采用协程(goroutine)模型运行,核心包含两类监听模块:
- 监听Ingress资源对象的变化,获取用户定义的路由规则
- 监听后端Service、Pod的变化,获取后端服务的实时地址
5.2 双同步机制
为避免频繁重载Nginx影响性能,采用两级同步策略:
- 重要变更同步:新增/删除Ingress规则等核心变更,由主协程直接同步到Nginx进程,立即触发配置重载
- 非重要变更同步:后端Pod地址变更、Pod扩缩容等非核心变更,先写入二级缓冲(FIFO队列),定期批量同步到Nginx,仅当变更累积到一定阈值或定时任务触发时才执行重载
- 类比:如同公司董事长(Nginx进程),重要事项(Ingress规则变更)由秘书(主协程)直接汇报,小事(后端Pod变更)先记录在待办清单(二级缓冲),定期统一汇报,避免频繁打扰董事长影响正常工作
6. 四层与七层负载核心差异对比
| 维度 | 四层负载(LVS/IPVS) | 七层负载(Nginx Ingress) |
|---|---|---|
| 工作层级 | 传输层(TCP/UDP) | 应用层(HTTP/HTTPS) |
| TCP连接数 | 1次(客户端直接连后端) | 2次(客户端连Nginx,Nginx连后端) |
| 协议支持 | 仅支持客户端与后端协议一致 | 支持协议转换,可适配不同协议场景 |
| 路由能力 | 仅支持基于IP+端口的转发 | 支持基于域名、路径、请求头等七层特征的路由 |
| 适用场景 | 四层负载均衡、高性能转发 | 微服务网关、七层路由、SSL卸载等场景 |
AI 总结
本章节围绕K8s生态下的Ingress-Nginx方案展开,首先通过对比四层与七层负载均衡的技术差异,明确了Ingress在七层路由、协议转换、微服务适配等场景的核心价值;再结合手动实现七层负载的痛点,引出Ingress声明式API的自动化优势;随后梳理了当前主流的Ingress实现方案,明确Nginx Ingress的行业地位;最后深入讲解了Nginx Ingress的协程架构与双同步机制,解释了其高可用、高性能的设计原理,帮助学习者完整掌握Ingress-Nginx的核心知识体系。